powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Убейте
55 сообщений из 55, показаны все 3 страниц
Убейте
    #34082096
Ноль2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хоть убейте, но обьясните плиз, что здесь неправильно
Код: plaintext
1.
2.
3.
4.
 package  package1;
 public   class  Class1 {
	 protected   void  v(){}
}	

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 package  package2;
 public   class  Class2  extends  package1.Class1 {
	 public   void  v(){}
	
	 public   static   void  main(String[] args){
		package1.Class1 c =  new  Class2();
		c.v(); 	//Class2.java:8: 
			//v() has protected access in package1.Class1
	
		Class2 c =  new  Class2();
		c.v(); 	//OK
	}
}	
...
Рейтинг: 0 / 0
Убейте
    #34082113
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.math.rsu.ru/mexmat/pmp/student/book/Chapter06.html
Итак вы только что получили представление о наследовании и теперь пришло время раскрыть смысл ключевого слова protected. В идеальном мире, private объекты всегда являются действительно private, но в реальных проектах, где вы пытаетесь во многих местах скрыть от внешнего мира нечто, Вам часто нужна возможность получить к нему доступ из классов наследников. Ключевое слово protected поэтому не такая уж и ненужная назойливость или догма. Оно объявляет "Этот объект частный (private), если к нему пытается подобраться пользователь, но он доступен для всех остальных находящихся в том же самом пакете(package)".

Читайте основы.
...
Рейтинг: 0 / 0
Убейте
    #34082126
Ноль2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я предполагал, что в обоих случаях c.v() - это вызов переписанного public метода package2.Class2.v()???
...
Рейтинг: 0 / 0
Убейте
    #34082221
Ноль2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У классиков (The Java Language Specification, Third Edition) нашел такое:

6.6.7 Example: protected Fields, Methods, and Constructors
Consider this example, where the points package declares:package points;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 public   class  Point {
         protected   int  x, y;
         void  warp(threePoint.Point3d a) {
                 if  (a.z >  0 )         // compile-time error: cannot access a.z
                        a.delta( this );
        }
}
and the threePoint package declares:package threePoint;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 import  points.Point;
 public   class  Point3d  extends  Point {
         protected   int  z;
         public   void  delta(Point p) {
                p.x +=  this .x;          // compile-time error: cannot access p.x
                p.y +=  this .y;          // compile-time error: cannot access p.y

        }
         public   void  delta3d(Point3d q) {
                q.x +=  this .x;
                q.y +=  this .y;
                q.z +=  this .z;
        }
}
which defines a class Point3d. A compile-time error occurs in the method delta here: it cannot access the protected members x and y of its parameter p, because while Point3d (the class in which the references to fields x and y occur) is a subclass of Point (the class in which x and y are declared), it is not involved in the implementation of a Point (the type of the parameter p). The method delta3d can access the protected members of its parameter q, because the class Point3d is a subclass of Point and is involved in the implementation of a Point3d.

Но это же не мой случай???
...
Рейтинг: 0 / 0
Убейте
    #34082265
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ноль2
Но это же не мой случай???
Почему же не ваш?
...
Рейтинг: 0 / 0
Убейте
    #34082404
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объект класса 2 объявляется как объект класса 1. Их этого следует, что через эту ссылку (ее тип класс 1) доступны поля и методы, а так же область их доступности, только те, которые относятся к классу1 (к родительскому).
Меня лично заинтересовало другое - получается, что в этом самом объекте существет один и тот же метод, который в разных случаях имеет разную степень доступа к нему.
...
Рейтинг: 0 / 0
Убейте
    #34082419
Ноль2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверно потому, что
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 package  package2;

 import  java.lang.reflect.*;

 public   class  Class2  extends  package1.Class1 {
     public   void  v() {
    }

     public   static   void  main(String[] args) {
        package1.Class1 c =  new  Class2();
         for  (Method m : c.getClass().getMethods()) {
            System.out.println(m.toString());
        }
/*
        c.v(); 	                 //Class2.java:8: 
                                           //v() has protected access in package1.Class1
        Class2 c = new Class2();
        c.v(); 	                 //OK
*/
    }
}
сообщает о своих методах:

public void package2.Class2.v()
public static void package2.Class2.main(java.lang.String[])

public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public java.lang.String java.lang.Object.toString()

и не слова о public void package1.Class1.v(),
то есть c.v() может быть только вызовом public void package2.Class2.v()???
...
Рейтинг: 0 / 0
Убейте
    #34082498
Ноль2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я до сих пор думал, что если имеет место overriding, то какой будет вызван метод определяется не типом package1.Class1 переменной с, а классом обьекта package2.Class2, на который она, переменная с, указывает???
...
Рейтинг: 0 / 0
Убейте
    #34082590
Ноль2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АСУ ТПшникОбъект класса 2 объявляется как объект класса 1. Их этого следует, что через эту ссылку (ее тип класс 1) доступны поля и методы, а так же область их доступности, только те, которые относятся к классу1 (к родительскому).
Меня лично заинтересовало другое - получается, что в этом самом объекте существет один и тот же метод, который в разных случаях имеет разную степень доступа к нему.

Это не верно для overriding методов!!!???
...
Рейтинг: 0 / 0
Убейте
    #34082615
fjord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Protected
Следующим спецификатором уровня доступа является спецификатор "защищенный" -- protected, который разрешает обращаться к членам класса самому классу, его суб-класссам (с упомянутыми ранее ограничениями), а также всем классам в той же самой библиотеке. Уровень доступа protected используют в случаях, если к члену класса нужно разрешить доступ из его суб-классов, но не из самостоятельных не связанных с ним классов. Защищенные члены (protected members) подобны семейным секретам -- вы не думаете, что об этом знает вся семья и даже некоторые ближайшие друзья, но вы не хотите, чтобы об этом знал кто-либо со стороны.
Для объявления защищенного члена служит ключевое слово protected. Сначала давайте посмотрим, как спецификатор protected влияет на доступ для классов в той же самой библиотеке. Рассмотрим следующую версию класса Alpha, которая теперь объявлена внутри библиотеки с именем Greek и которая имеет одну защищенную переменную и один защищенный метод:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 package  Greek;

 class  Alpha {
  protected   int  iamprotected;
  protected   void  protectedMethod() {
 System.out.println("protectedMethod");
 }
}
Теперь предположим, что класс Gamma уже был объявлен как член библиотеки Greek (и не является суб-классом класса Alpha). Класс Gamma может легально обращаться к переменной iamprotected объекта Alpha и может вполне легально вызывать его метод protectedMethod:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 package  Greek;

 class  Gamma {
  void  accessMethod() {
 Alpha a =  new  Alpha();
 a.iamprotected =  10 ; // legal
 a.protectedMethod(); // legal
 }
}
Это достаточно очевидно. Теперь давайте посмотрим, как спецификатор protected влияет на доступ для суб-классов класса Alpha.
Давайте введем новый класс Delta, который получен из класса Alpha, но прописан в другой библиотеке -- Latin. Класс Delta может обращаться к iamprotected и к protectedMethod, но только для объектов типа Delta или их суб-классов. Класс Delta не может обращаться к iamprotected или protectedMethod для объектов типа Alpha. accessMethod в следующем примере пытается обратиться к к переменной iamprotected, являющейся member variable для объекта типа Alpha, что недопустимо, и к объекту типа Delta, что разрешено. Аналогично, accessMethod вытается вызвать метод protectedMethod объекта Alpha, что также недопустимо:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 import  Greek.*;

 package  Latin;

 class  Delta  extends  Alpha {
  void  accessMethod(Alpha a, Delta d) {
 a.iamprotected =  10 ; // illegal
 d.iamprotected =  10 ; // legal
 a.protectedMethod(); // illegal
 d.protectedMethod(); // legal
 }
}
Если класс является суб-классом и находится в той же самой библиотеке, что и класс с защищенными членами, то класс имеет доступ к защищенным членам.

From tutorial http://www.javable.com
...
Рейтинг: 0 / 0
Убейте
    #34082620
fjord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последняя фраза ключевая.
...
Рейтинг: 0 / 0
Убейте
    #34082759
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так все просто. На момент компиляции же не известно, какой тип объекта хранится в ссылочной переменной
Код: plaintext
1.
package1.Class1 c;
Поэтому и не дается возможность вызова protected методов.
...
Рейтинг: 0 / 0
Убейте
    #34082804
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последняя фраза ключевая для понимания особенности, которая присуща потомку класса (а именно: он хоть и потомок, но доступ получить к протектед только если в том же пакете находится).
А тут акцент немного на другое - является ли в приведенном примере запись v как метода с другим уровнем доступа overriding и более того, если класс потомок имеет переопределенный метод, то если объект этого класса объявить как объект родительского типа, то в вызове (Родительский класс) Объект.метод () будет использовано содержимое метода исходного или переопределнного. Что впрочем легко проверить, работы много, надо будет сделать тест.
Хотя делов то...

Код: plaintext
1.
2.
3.
4.
 package  package1;
 public   class  Class1 {
	 public   void  v(){System.out.println ("Вызван метод родителя");}
}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
package package2;
public class Class2 extends package1.Class1 {
	public void v (){System.out.println ("Вызван метод потомка");}
	
	public static void main(String[] args){
		package1.Class1 c = new Class2();
		c.v(); 	
                          Class2 c2 = new Class2();
		c2.v(); 	//OK
	}
}
хм... самое прикольно в том что результат - вызыван класс потомка в обоих случаях... что то недопонимаю, ведь тогда даже пи overridinge остается активным вариант реализации метода как указано в потомке...
...
Рейтинг: 0 / 0
Убейте
    #34082818
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторto Leonidov
эээ не совсем понял.
...
Рейтинг: 0 / 0
Убейте
    #34082825
fjord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvНу так все просто. На момент компиляции же не известно, какой тип объекта хранится в ссылочной переменной
Код: plaintext
1.
package1.Class1 c;
Поэтому и не дается возможность вызова protected методов.
Да все там известно. Если Packege1.v1() сделать public все будет работать.
...
Рейтинг: 0 / 0
Убейте
    #34082852
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 package  ru.spb.leonidv.learn.pack1;

 public   class  Parent {
	 protected   void  proc() {
		System.out.println("parent");
	};
}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 package  ru.spb.leonidv.learn.pack2;

 import  ru.spb.leonidv.learn.pack1.Parent;

 public   class  Child  extends  Parent {

	@Override
	 public   void  proc() {
		System.out.println("Child");
	}
	
}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 public   class  PrivateProtectedInheritance {

	/**
	 * @param args
	 */
	 public   static   void  main(String[] args) {
		Parent p =  new  Parent();
		Parent cp =  new  Child();
		Child c =  new  Child();
		//p.proc();		
		///cp.proc();
		c.proc();
	}

}
Закоменнтированные строчки не работают, по указанной мною ранее причине. Если это все сделать в одном пакете, то будет
Код: plaintext
1.
2.
3.
parent
Child
Child
Если перенести класс с Main в один пакет с классом Child, то опять-таки закоментированные строки не работают. По той же причине.
...
Рейтинг: 0 / 0
Убейте
    #34082892
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь я в тупике
На момент компиляции известно что в ссылке Parent p хранится объект типа Parent, с чего же вдруг нельзя вызвать его собственный метод?! да хоть private!
...
Рейтинг: 0 / 0
Убейте
    #34083398
Ноль2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Fjord and Leonidv
Еще одна моя глупость и все
Компилирую свои package1 и package2, только в package1 метод v() - public
Потом компилирую package1, изменив предварительно метод v() на protected

Теперь
Код: plaintext
1.
2.
3.
4.
5.
6.
 package  package2;
 public   class  Class2  extends  package1.Class1 {
	 public   void  v(){}	
	 public   static   void  main(String[] args){
         package1.Class1 c =  new  Class2();
         c.v(); ...
работает без проблем
Делаю скорее всего неправильный вывод, что javac колбасит что-то не то???
Прокомментируйте, bitte
С Уважением и Благодарностью ко всем за все ранее сказанное
...
Рейтинг: 0 / 0
Убейте
    #34083631
fjord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забавный глюк. Среда показывает ошибку но сомпилятор не возмущается и делает свое дело как будто метод в первом классе public, и билдит и запускает без проблем. Думал что может ява машина что нить кеширует, но после перезапуска компа ничего не изменилось. После удаления готовых классов и жара сомпилятор выдал долгожданную ошибку. В книжке все четко описанно, что работать не должно. Почему так незнаю. Очень интересно самому.
...
Рейтинг: 0 / 0
Убейте
    #34083717
fjord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кажется понял: ошибка при protected v() должна быть (обязанна), и class2.class само собой не появится, а если v() сделать на время протектед и потом компилить и запускать то
Код: plaintext
Package2.Class1 c =  new  Class2();
будет в силе, и ошибки при компиляции не возникнет. забавно.
Наверняка я не прав. Очень интересно. Может кто нибудь в силах прояснить ситуацию?
...
Рейтинг: 0 / 0
Убейте
    #34083727
fjord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fjordкажется понял: ошибка при protected v() должна быть (обязанна), и class2.class само собой не появится, а если v() сделать на время протектед и потом компилить и запускать то
Код: plaintext
Package2.Class1 c =  new  Class2();
будет в силе, и ошибки при компиляции не возникнет. забавно.
Наверняка я не прав. Очень интересно. Может кто нибудь в силах прояснить ситуацию?
там
Код: plaintext
Package1.Class1 c =  new  Class2();
конечно, это я эксперементировал
...
Рейтинг: 0 / 0
Убейте
    #34084000
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Развиваем тему даже если не переопределять метод v в классе 2, а просто вызываем метод родителя, компилируем все, потом изменяем в классе 1 доступ к методу на private, и перекомпилируем только класс 1, то один фиг объект класса 2 спокойно запускает private метод родителя!
А вот это уже конкретный глюк.
...
Рейтинг: 0 / 0
Убейте
    #34084139
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
 package  package1;
 public   class  Class1 {
     protected   void  v(){System.out.println ("Вызван метод родителя");}
}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 package  package2;
 public   class  Class2  extends  package1.Class1 {
     public   static   void  main(String[] args){
        package1.Class1 c =  new  Class2();
        c.v();     
    }
}

Компилируем оба класса.
Меняем в классе 1 доступ к методу на приват.
Компилируем только первый класс.
Запускаем.
Все работает.

Комментарии?
...
Рейтинг: 0 / 0
Убейте
    #34084292
fjord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2АСУ ТПшник
Все так, но при надобности изменить и откомпилировать второй класс ничего невыйдет, придется лезть в первый и опять делать его паблик. Поидее все нормально, при защищенном певом классе оба класса сразу нельзя будет откомпилировать. Поэтому нужно создавать сперва классы с протектед методами и полями а потом те которые будут ими пользоваться.
...
Рейтинг: 0 / 0
Убейте
    #34084471
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот кто то уже это дело и до нас обнаружил
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4298813
на другом форуме говорят, что в 1.6 наконец это исправили.
...
Рейтинг: 0 / 0
Убейте
    #34089019
ddocker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Код: plaintext
1.
2.
3.
4.
 package  package1;
 public   class  Class1 {
     protected   void  v(){System.out.println ("Вызван метод родителя");}
}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 package  package2;
 public   class  Class2  extends  package1.Class1 {
     public   static   void  main(String[] args){
        package1.Class1 c =  new  Class2();
        c.v();     
    }
}

Компилируем оба класса.
...
Комментарии?

Странно... И это у тебя компилится?
Ведь, не должно же по тем же причинам, которые с самого начала обсуждались: ибо v() has protected access in package1.Class1. Или ты напрямую из коммандной строки? IDEA по крайней мере этот compile-error показывает!


Кстати, на rsdn вот прям недавно то же самое обсуждалось
...
Рейтинг: 0 / 0
Убейте
    #34089022
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из коммадной строки. Это оказывается очень старый баг, который заключается в том, что в runtime не проверяются уровни доступа (считается что все проверено на этапе компилляции). В 1.6 исправили
...
Рейтинг: 0 / 0
Убейте
    #34089046
ddocker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, я не про это.
Вот эти 2 файла изначально(Class1.java и Class2.java) как ты откомпилил? У меня и из командной строки тот же самый error пишет.
Файлы:
p1/c1.java
p2/c2.java

Компилю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
F:\path>cmd
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

F:\path>javac p1/c1.java

F:\path>javac p2/c2.java
p2/c2.java:5: v() has protected access in p1.c1
        c.v();
         ^
1 error


Содержимое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
// p1.c1.java
 package  p1;
 public   class  c1 {
     protected   void  v(){System.out.println ("parent");}
}

// p2.c2.java
 package  p2;
 public   class  c2  extends  p1.c1 {
     public   static   void  main(String[] args){
        p1.c1 c =  new  c2();
        c.v();     
    }
}

Может ты сначала у Class1.java public там делал?
...
Рейтинг: 0 / 0
Убейте
    #34089087
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, сначала делается public.
Компилится все.
Открываем исходник класса Class1.
Меняем доступ на private или protected
Компилируем ТОЛЬКО Class1
...
Рейтинг: 0 / 0
Убейте
    #34089103
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшникИз коммадной строки. Это оказывается очень старый баг, который заключается в том, что в runtime не проверяются уровни доступа (считается что все проверено на этапе компилляции). В 1.6 исправили
Я лично не считаю это багом. И не понимаю, откуда вы взяли, что такое поведение - баг.
В 1.6, кстати, - ситуация ровно такая же (только что проверил). Логичная.

Все файлики в аттаче.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
C:\Program Files\Java\jdk1. 6 . 0 \bin>batch

C:\Program Files\Java\jdk1. 6 . 0 \bin>del p1\*. class 

C:\Program Files\Java\jdk1. 6 . 0 \bin>del p2\*. class 

C:\Program Files\Java\jdk1. 6 . 0 \bin>copy /y p1\c_public.java p1\c1.java
Скопировано файлов:          1 .

C:\Program Files\Java\jdk1. 6 . 0 \bin>javac p1/c1.java

C:\Program Files\Java\jdk1. 6 . 0 \bin>javac p2/c2.java

C:\Program Files\Java\jdk1. 6 . 0 \bin>java p2/c2
parent

C:\Program Files\Java\jdk1. 6 . 0 \bin>copy /y p1\c_protected.java p1\c1.java
Скопировано файлов:          1 .

C:\Program Files\Java\jdk1. 6 . 0 \bin>javac p1/c1.java

C:\Program Files\Java\jdk1. 6 . 0 \bin>java p2/c2
parent

C:\Program Files\Java\jdk1. 6 . 0 \bin>javac p2/c2.java
p2\c2.java: 5 : v() has  protected  access in p1.c1
        c.v();
         ^
 1  error

C:\Program Files\Java\jdk1. 6 . 0 \bin>
...
Рейтинг: 0 / 0
Убейте
    #34089107
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще раз :)
...
Рейтинг: 0 / 0
Убейте
    #34089181
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то ли вы не правлильно поняли, то ли я плохо объяснил :)
Багом здесь считается то, что в runtime не проверяется уровень доступа к полю класса. Это действительно баг, который исправили в 1.6.

Еще раз внимательно по шагам:
1. Создаем два класса.
Код: plaintext
1.
2.
3.
4.
 package  package1;
 public   class  Class1 {
     public   void  v(){System.out.println ("Вызван метод родителя");}
}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 package  package2;
 public   class  Class2  extends  package1.Class1 {
     public   static   void  main(String[] args){
        package1.Class1 c =  new  Class2();
        c.v();     
    }
}

2. Компиллируем эти два класса:

javac package1/Class1.java package2/Class2.java

3. После успешной компилляции заменяем в первом классе уровень доступа.
Код: plaintext
1.
2.
3.
4.
 package  package1;
 public   class  Class1 {
     private   void  v(){System.out.println ("Вызван метод родителя");}
}

4. Компиллируем только первый класс
javac package1/Class1.java

5. Запускаем получившуюся конструкцию

java package2.Class2

6. Смотрим результат. А он заключается в том, чтобы вместо того чтобы ругаться, что производися доступ к private переменной, код спокойно выполняется.

Вот здесь про это рассказано, что это очень старый и очень известный баг, что он сохранен для совместимости. И всплывает он только тогда, когда класс (файл *.class) находится на жестком диске конкретной машины, а не скачивается из интернета во время выполнения како-либо программы. Поэтому он не представляет опасности.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4298813
...
Рейтинг: 0 / 0
Убейте
    #34089194
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшникто ли вы не правлильно поняли, то ли я плохо объяснил :)
Багом здесь считается то, что в runtime не проверяется уровень доступа к полю класса. Это действительно баг, который исправили в 1.6.

Почему вы не запустили мой пример? Это так сложно?
В нем четко показано, что в 1.6 ситуация ровно такая же как и во всех остальных java-машинах. О чем вы пытаетесь спорить?

Я считаю, что это не баг. Потому что это задача не runtime-машины - проверять доступность классов.
Это задача компилятора.
А то, что вы не компилите проект (все зависимые пакеты и классы, как того требуется), а только лишь выборочно - это исключительно ваши проблемы, а не java.

This is a well-known problem. It is allowed for backward compatibility. We are going to tight up verify check during the Tiger time frame.

Причем никто не утверждает, что это баг. Есть лишь слова
I don't know if it is a bug, but it make me confused.


State тоже внушает оптимизи
Closed, will not be fixed

Так что расслабьтесь, попейте чайку :)
Поведение предсказумое, стандартное. Всё хорошо.
...
Рейтинг: 0 / 0
Убейте
    #34089358
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. расслаблен
2. не запускал потому как дома нет 1.6.
3. если не вникли что написано, жаль, наверное кто-то из нас не умеет понимать/объяснять, ибо ваши комментарии по поводу вопроса и ответа на www.java.sun.com сугубо субъективны.
4. в 1.6. должно выскочить что то типа
авторException in thread "main" java.lang.IllegalAccessError
5. ушел рубать всех в старкрафт :)
...
Рейтинг: 0 / 0
Убейте
    #34089368
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник1. расслаблен
2. не запускал потому как дома нет 1.6.
3. если не вникли что написано, жаль, наверное кто-то из нас не умеет понимать/объяснять, ибо ваши комментарии по поводу вопроса и ответа на www.java.sun.com сугубо субъективны.
4. в 1.6. должно выскочить что то типа
авторException in thread "main" java.lang.IllegalAccessError
5. ушел рубать всех в старкрафт :)
1) Это хорошо.
2) Жаль. У меня есть. Я запускал.
3) Вник. Причем полностью. Мой пример лишь доказывает то, что я вник. А комментарии - естественно, субъективны. Вы даже не потрудились скачать исходники и сопоставить с приведенным мной результатом выполнения батника. На основе этого вы делаете далекоидущие выводы о моей тупости. Это не делает вам чести, прямо скажем.
4) Не выскакивает. Да и не должно.
5) Удачи.
...
Рейтинг: 0 / 0
Убейте
    #34089709
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не делаю выводов о вашей тупости/умности. Приатачьте ваши примеры, завтра постараюсь их проанализировать(сейчас их нет), если не накроет очередная волна по работе. Это вы делаете далеко идущие выводы из непонятно чего.
...
Рейтинг: 0 / 0
Убейте
    #34089711
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
упс, появились... что то с движком, я их то вижу то не вижу. Серьезно. Вчера ответ на некоторые посты форумчан в форум значился как более ранний по времни и поэтому выше того, на что был ответ :/
...
Рейтинг: 0 / 0
Убейте
    #34089714
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аттач, кстати, пропадает, если предварительный просмотр делать :(
...
Рейтинг: 0 / 0
Убейте
    #34092428
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сегодня было копание в коде и астральная медитация. Похоже вы Он же были правы, и на 1.6 все хорошо так себе работает. Если подтвердятся мои подозрения, то изложу суть проблемы/решения. Но времени сейчас нет, надеюсь что на этой неделе.....
мыло оставьте.
...
Рейтинг: 0 / 0
Убейте
    #34092475
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В профиле поставил и мыло, и аську :)
...
Рейтинг: 0 / 0
Убейте
    #34106712
fearow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ноль2Хоть убейте, но обьясните плиз, что здесь неправильно
Код: plaintext
1.
2.
3.
4.
 package  package1;
 public   class  Class1 {
	 protected   void  v(){}
}	

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 package  package2;
 public   class  Class2  extends  package1.Class1 {
	 public   void  v(){}
	
	 public   static   void  main(String[] args){
		package1.Class1 c =  new  Class2();
		c.v(); 	//Class2.java:8: 
			//v() has protected access in package1.Class1
	
		Class2 c =  new  Class2();
		c.v(); 	//OK
	}
}	

Public то он public, да только в пределах пакета package1. А когда OK, вы обращаетесь к v() из класса-потомка (соответственно, и права, как для protected). Уважаемые гуру, я прав?
...
Рейтинг: 0 / 0
Убейте
    #34106713
fearow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ноль2Я до сих пор думал, что если имеет место overriding, то какой будет вызван метод определяется не типом package1.Class1 переменной с, а классом обьекта package2.Class2, на который она, переменная с, указывает???
Если имеет место overriding, то будет вызван метот, находящийся ниже всех в стеке. И так до вершины.
...
Рейтинг: 0 / 0
Убейте
    #34114084
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник Объект класса 2 объявляется как объект класса 1. Их этого следует, что через эту ссылку (ее тип класс 1) доступны поля и методы, а так же область их доступности, только те, которые относятся к классу1 (к родительскому).
Меня лично заинтересовало другое - получается, что в этом самом объекте существет один и тот же метод, который в разных случаях имеет разную степень доступа к нему.

Че-то не вяжеться это с концепцией познего связывания... Получает в данном примере, решение какую функцию вызывать принимается на основе типа ОБЪЕКТА.

Код: plaintext
1.
2.
3.
4.
5.
 package  testPack;
 public   class  A {
	 protected   void  v(){};
} 
 package  TestPack2;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 import  testPack.A;
 public   class  B  extends  A{
	 protected   void  v(){};
	 public  B() {
		 super ();
		// TODO Auto-generated constructor stub
		A a =  new  B();
		a.v();
	
	}

}
А тогда он должен вызвать B.v()... Я знаю, что не прав, но не пойму почему...
...
Рейтинг: 0 / 0
Убейте
    #34114433
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to bemtaill

Вот что я имел ввиду. Запустите следующий код
Точка входа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 import  asutp.samples.ChildClass;
 import  asutp.samples.ParentClass;

 public   class  Main {
	 public   static   void  main(String[] args) {
		ParentClass parent =  new  ParentClass();
		ChildClass child1 =  new  ChildClass();
		ParentClass child2 =  new  ChildClass();
		System.out.println("parent1.a = " + parent.a);
		System.out.println("child1.a = " + child1.a);
		System.out.println("child1.b = " + child1.b);
		System.out.println("child2.a = " + child2.a);
		System.out.println("child2.b = " + child2.b);
	}
}

Вызываемые классы.
Код: plaintext
1.
2.
3.
4.
 package  asutp.samples;
 public   class  ParentClass {
 public   int  a;
}
Код: plaintext
1.
2.
3.
4.
 package  asutp.samples;
 public   class  ChildClass  extends  ParentClass {
 public   boolean  b;
}
...
Рейтинг: 0 / 0
Убейте
    #34114446
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но это уход от темы, собственно в приложенных файлах два кода, один запускается и выполняется на 1.6, второй нет.
Найдите пять отличий, времени разобраться почему так к сожалению не было.
Вернее я приложу не работающий код, а приложенный выше товарищем Oн Же работает нормально.
...
Рейтинг: 0 / 0
Убейте
    #34115013
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник to bemtaill

Вот что я имел ввиду. Запустите следующий код
Точка входа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 import  asutp.samples.ChildClass;
 import  asutp.samples.ParentClass;

 public   class  Main {
	 public   static   void  main(String[] args) {
		ParentClass parent =  new  ParentClass();
		ChildClass child1 =  new  ChildClass();
		ParentClass child2 =  new  ChildClass();
		System.out.println("parent1.a = " + parent.a);
		System.out.println("child1.a = " + child1.a);
		System.out.println("child1.b = " + child1.b);
		System.out.println("child2.a = " + child2.a);
		System.out.println("child2.b = " + child2.b);
	}
}

Вызываемые классы.
Код: plaintext
1.
2.
3.
4.
 package  asutp.samples;
 public   class  ParentClass {
 public   int  a;
}
Код: plaintext
1.
2.
3.
4.
 package  asutp.samples;
 public   class  ChildClass  extends  ParentClass {
 public   boolean  b;
}


Я понял, что вы имели ввиду, когда разбирался весь этот геморой с поэтапной компиляцией классов и отсутствием проверки уровня доступа, при такой линковке. У меня вопрос почему в моем примере при попытке вызывать a.v();
идет обращение к A.v(), а в соответствии с тем, что все методы "виртуальные" (если мыслить в терминах C++) должен вызываться B.v()?
...
Рейтинг: 0 / 0
Убейте
    #34115088
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bemtaill
....а в соответствии с тем, что все методы "виртуальные" (если мыслить в терминах C++) должен ...

кроме final...
...
Рейтинг: 0 / 0
Убейте
    #34115105
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Знаете нет времени к сожалению.
Попробуйте объявить как B b
а потом привести к типу A
т.е. (A)b;
думаю тогда заработает нужный метод, это требуется для полиморфизма.
...
Рейтинг: 0 / 0
Убейте
    #34115791
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшникЗнаете нет времени к сожалению.
Попробуйте объявить как B b
а потом привести к типу A
т.е. (A)b;
думаю тогда заработает нужный метод, это требуется для полиморфизма.
Да все таки хочу найти ответ на свой вопрос. Помогите плз. Реально не знаю как объяснить. У Эккеля:
авторРешение называется позднее связывание, что означает, что связывание происходит во время работы программы и основывается на типе объекта. Позднее связывание так же иногда называют динамическим связыванием или связыванием во время выполнения. Когда язык поддерживает позднее связывание, то у него должен быть механизм определения типа объекта в время работы программы и вызова соответствующего метода. Все так и есть, компилятор все еще не знает какого типа этот объект, но механизм вызова методов находит его и вызывает соответствующее тело метода. Механизм позднего связывания меняется от языка к языку, но Вы можете представить себе, что в объект должна быть встроена некоторая информация о типе объекта.
В Java все методы за исключением final используют позднее связывание. И это означает, что Вам нет необходимости принимать решения, о необходимости применения позднего связывания в том или ином месте программы, поскольку это происходит автоматически.

ХЭЛП!
...
Рейтинг: 0 / 0
Убейте
    #34116595
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://java.sun.com/docs/books/jls/third_edition/html/names.html#36191
...
Рейтинг: 0 / 0
Убейте
    #34116789
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonidvhttp://java.sun.com/docs/books/jls/third_edition/html/names.html#36191
Не совсем то, но идет действительно от туда. Во первых у меня в примере ошибка, ну да ладно:))

Короче при A a=new B(); ссылка а видит только интерфейс класса А, а там ни хрена нету, кроме унаследованных полей/методов от Object, т.к. согласно приведенной ссылке если protected и в разных паках, то не видит она метод v(). НО! Если делаем его паблик (он наследуется и становиться видим в интерфейсе класса А) , то при вызове через ссылку типа 'А' согласно положениям позднего связывания вызовется метод класса B.
Разобрался млин.
Спасибо.
...
Рейтинг: 0 / 0
Убейте
    #34116791
02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
02
Гость
Я тоже хочу поговорить об Этом (начитавшись всякой фигни в JLS)
Имеем две версии класса Class1. Назовем их public и private в соответствии с модификаторами доступа метода v():
Код: plaintext
1.
2.
3.
4.
 package  package1;
 public   class  Class1 {
     public   void  v(){System.out.println("package1.Class1.v()");}
}
Код: plaintext
1.
2.
3.
4.
 package  package1;
 public   class  Class1 {
     private   void  v(){System.out.println("package1.Class1.v()");}
}
Имеем одну версию класса Class2.
Код: plaintext
1.
2.
3.
4.
 package  package2;
 public   class  Class2  extends  package1.Class1 {
      public   void  v() {System.out.println("package2.Class2.v()");}
}
Она благополучно компилируется на любой из версий класса Class1 c одинаковыми class-файлами в результате. Тот факт, что для public-версии Class1 имеет место overriding v(), а для private-версии - нет, компилятор принимает во внимание только в первом случае и только для проверки правил overriding'a. Если правила не соблюдены, результат - compile-time error, как например
Код: plaintext
1.
2.
 class  Class1 { public  Number v(){ return   1 ;}}
 class  Class2  extends  Class1 { public  String v() { return  "";}}
А если
Код: plaintext
1.
2.
3.
4.
5.
 class  Class1 { private  Number v(){ return   1 ;}}
или
 class  Class1 { private  String v(){ return  "1";}}
или
 class  Class1 { public  String v(){ return  "1";}}
то результат для Сlass2.class один и тот же: дескриптор метода v() класса Class2

Далее, имеем одну версию класса Test
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 package  package2;
 public   class  Test {
     public   static   void  main(String[] args) {        
        package1.Class1 c =  new  Class2();
        c.v();
    }
}
Класс Test компилируется только с public-версией Class1.class
Почему?
Читаем JLS
15.12.1 Compile-Time Step 1: Determine Class or Interface to Search
The first step in processing a method invocation at compile time is to figure out the name of the method to be invoked and which class or interface to check for definitions of methods of that name. There are several cases to consider, depending on the form that precedes the left parenthesis, as follows:
...
If the form is Primary.NonWildTypeArgumentsopt Identifier, then the name of the method is the Identifier. Let T be the type of the Primary expression; then the class or interface to be searched is T if T is a class or interface type, or the upper bound of T if T is a type variable.
...

В нашем случае Primary.NonWildTypeArgumentsopt Identifier == c.v, T == package1.Class1, то есть компилятор ищет метод v() в package1.Class1
Далее
15.12.2 Compile-Time Step 2: Determine Method Signature
The second step searches the type determined in the previous step for member methods. This step uses the name of the method and the types of the argument expressions to locate methods that are both accessible and applicable, that is, declarations that can be correctly invoked on the given arguments...

Находит в public-версии Class1, но не находит в private-версии Class1(compile-time error). В первом случае результат - Test.class, в котором вызов метода с.v() интерпретируется след образом
15.12.3 Compile-Time Step 3: Is the Chosen Method Appropriate?
The following compile-time information is then associated with the method invocation for use at run time:
The name of the method.
The qualifying type of the method invocation (§13.1).
The number of parameters and the types of the parameters, in order. The result type, or void.
The invocation mode, computed as follows:
-If the compile-time declaration has the static modifier, then the invocation mode is static.
-Otherwise, if the compile-time declaration has the private modifier, then the invocation mode is nonvirtual.
-Otherwise, if the part of the method invocation before the left parenthesis is of the form super . Identifier or of the form ClassName.super.Identifier then the invocation mode is super.
-Otherwise, if the compile-time declaration is in an interface, then the invocation mode is interface.
-Otherwise, the invocation mode is virtual.

Здесь The name of the method == v,
The qualifying type of the method invocation == package1.Class1
The invocation mode virtual == invokevirtual - одна из четырех инструкций
JVM Specification 3.11.8 Method Invocation and Return Instructions
The following four instructions invoke methods:
-invokevirtual invokes an instance method of an object, dispatching on the (virtual) type of the object. This is the normal method dispatch in the Java programming language.
-invokeinterface invokes a method that is implemented by an interface, searching the methods implemented by the particular runtime object to find the appropriate method.
-invokespecial invokes an instance method requiring special handling, whether an instance initialization method (§3.9), a private method, or a superclass method.
-invokestatic invokes a class (static) method in a named class.

Теперь стартуем Test.class c Class2.class и public-версией Class1.class и читаем
15.12.4 Runtime Evaluation of Method Invocation
At run time, method invocation requires five steps. First, a target reference may be computed. Second, the argument expressions are evaluated. Third, the accessibility of the method to be invoked is checked. Fourth, the actual code for the method to be executed is located. Fifth, a new activation frame is created, synchronization is performed if necessary, and control is transferred to the method code.
[quot]15.12.4.1 Compute Target Reference (If Necessary)
Сделано: package1.Class1 c = new Class2();
15.12.4.2 Evaluate Arguments
Проехали
15.12.4.3 Check Accessibility of Type and Method
Обсудим позже, но в нашем случае с public-версией Class1 все ОК
15.12.4.4 Locate Method to Invoke
The strategy for method lookup depends on the invocation mode.

If the invocation mode is static, no target reference is needed and overriding is not allowed. Method m of class T is the one to be invoked.

Otherwise, an instance method is to be invoked and there is a target reference. If the target reference is null, a NullPointerException is thrown at this point. Otherwise, the target reference is said to refer to a target object and will be used as the value of the keyword this in the invoked method. The other four possibilities for the invocation mode are then considered.

If the invocation mode is nonvirtual, overriding is not allowed. Method m of class T is the one to be invoked.

Otherwise, the invocation mode is interface, virtual, or super, and overriding may occur. A dynamic method lookup is used. The dynamic lookup process starts from a class S, determined as follows:

-If the invocation mode is interface or virtual, then S is initially the actual run-time class R(Class2) of the target object. This is true even if the target object is an array instance. (Note that for invocation mode interface, R necessarily implements T; for invocation mode virtual, R is necessarily either T or a subclass of T.)
-If the invocation mode is super, then S is initially the qualifying type (§13.1) of the method invocation.

The dynamic method lookup uses the following procedure to search class S, and then the superclasses of class S, as necessary, for method m.

Let X(Class1) be the compile-time type of the target reference of the method invocation.
1. If class S(Class2) contains a declaration for a non-abstract method named m with the same descriptor (same number of parameters, the same parameter types, and the same return type) required by the method invocation as determined at compile time (§15.12.3), then:
- If the invocation mode is super or interface, then this is the method to be invoked, and the procedure terminates.

- If the invocation mode is virtual, and the declaration in S overrides (§8.4.8.1) X.m(Class1.v), then the method declared in S is the method to be invoked, and the procedure terminates.

2. Otherwise, if S has a superclass, this same lookup procedure is performed recursively using the direct superclass of S in place of S; the method to be invoked is the result of the recursive invocation of this lookup procedure.

The above procedure will always find a non-abstract, accessible method to invoke, provided that all classes and interfaces in the program have been consistently compiled. However, if this is not the case, then various errors may occur. The specification of the behavior of a Java virtual machine under these circumstances is given by The Java Virtual Machine Specification.We note that the dynamic lookup process, while described here explicitly, will often be implemented implicitly, for example as a side-effect of the construction and use of per-class method dispatch tables, or the construction of other per-class structures used for efficient dispatch.

Результат: System.out.println("package2.Class2.v()")

Теперь стартуем Test.class c Class2.class и private-версией Class1.class
Все так же, кроме пунктов:
a)
- If the invocation mode is virtual, and the declaration in S overrides (§8.4.8.1) X.m(Class1.v), then the method declared in S is the method to be invoked, and the procedure terminates.
Здесь Class2.v не overrides Class1.v, т.к. Class1.v - private
Поэтому
2. Otherwise, if S has a superclass, this same lookup procedure is performed recursively using the direct superclass of S in place of S; the method to be invoked is the result of the recursive invocation of this lookup procedure.
и вызывается Class1.v
Результат: System.out.println("package1.Class1.v()")
b)

15.12.4.3 Check Accessibility of Type and Method
Let C(Test) be the class containing the method invocation, and let T(Class1) be the qualifying type of the method invocation (§13.1), and m(v) be the name of the method, as determined at compile time (§15.12.3). An implementation of the Java programming language must insure, as part of linkage, that the method m still exists in the type T. If this is not true, then a NoSuchMethodError (which is a subclass of IncompatibleClassChangeError) occurs. If the invocation mode is interface, then the implementation must also check that the target reference type still implements the specified interface. If the target reference type does not still implement the interface, then an IncompatibleClassChangeError occurs.

The implementation must also insure, during linkage, that the type T and the method m are accessible. For the type T:
- If T is in the same package as C, then T is accessible.
- If T is in a different package than C, and T is public, then T is accessible.
- If T is in a different package than C, and T is protected, then T is accessible if and only if C is a subclass of T.

For the method m:
- If m is public, then m is accessible. (All members of interfaces are public (§9.2)).
- If m is protected, then m is accessible if and only if either T is in the same package as C, or C is T or a subclass of T.
- If m has default (package) access, then m is accessible if and only if T is in the same package as C.
- If m is private, then m is accessible if and only if C is T, or C encloses T, or T encloses C, or T and C are both enclosed by a third class. If either T or m is not accessible, then an IllegalAccessError occurs (§12.3)

И вот здесь я не согласен с Ним же
Я лично не считаю это багом. И не понимаю, откуда вы взяли, что такое поведение - баг.

, потому что если в JLS написано: If either T or m is not accessible, then an IllegalAccessError occurs, а ее(IllegalAccessError) не возникает, то такая ситуация, на мой взгляд, называется bug
А так же не согласен с Ним жеА то, что вы не компилите проект (все зависимые пакеты и классы, как того требуется), а только лишь выборочно - это исключительно ваши проблемы, а не java.

, потому что если бы с выходом каждой новой версии JRE Sun просила бы сообщество перекомпилироваться, то это было странноватенько.
Спасибо за внимание
...
Рейтинг: 0 / 0
Убейте
    #34121528
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшниквот кто то уже это дело и до нас обнаружил
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4298813
на другом форуме говорят, что в 1.6 наконец это исправили.
вообще то оригинальный баг здесь http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4030988 и пофикшен он еще в 1.5, но пофикшен специфично :) нужно использовать опцию JVM: -verify
он жеЯ считаю, что это не баг. Потому что это задача не runtime-машины - проверять доступность классов.
Это задача компилятора. Ага, и верификатора, который и должен кидать IllegalAccessError в таком случае
...
Рейтинг: 0 / 0
Убейте
    #34121624
02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
02
Гость
2Jozic
Спасибо Теперь все стало понятно
Правда -verify, начиная c 1.2, не упоминается ни в command line options, ни в документации
Они предлагают пользоваться -Xfuture
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4337532
...
Рейтинг: 0 / 0
Убейте
    #34121865
Фотография МТД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jozic
Мда.
Слишком это мутно у них получилось.
Проще перекомпиливать всё и не думать о плохом :)
...
Рейтинг: 0 / 0
55 сообщений из 55, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Убейте
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]