我在理解Java(或其背后的设计)中的受保护的访问修饰符时遇到了一些麻烦。我认为这意味着程序包访问和通过继承包含抽象成员的类的对象的访问。
我编写了以下示例代码。我看到,如果未注释,注释掉的行会产生编译错误。为什么我可以通过Second中的Second对象而不是Second中的First对象访问pro?
package first;
public class First {
protected void pro(){
System.out.println("Can see protected method");
}
}
package first;
public class InFirst {
public static void main(String[] args){
First fst = new First();
fst.pro();
}
}
package second;
import first.First;
public class Second extends First {
public static void main(String[] args){
First fst = new First();
// fst.pro();
Second sec = new Second();
sec.pro();
}
}
该网页链接@MadProgrammer给出了一个体面的解释:
“ protected修饰符指定只能在自己的包中访问该成员(与package-private一样),并且只能由其在另一个包中的类的子类访问。”
这意味着受保护的成员必须直接通过其定义的类或该类的子类进行访问,同时也要位于适当的包中。这不一定意味着您可以通过在所述类的子类中创建的所述类的实例来访问受保护的成员。重点是所涉及的软件包。
package first; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
试图从哪个软件包访问有问题的成员? 第一
是否在同一包中定义了包含所述成员的(子)类或其父类(从其继承该成员的类)? 是的,First
被定义在package first
,所以protected
成员是从访问First
中package first
。
package second; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
试图从哪个软件包访问有问题的成员? 第二
是否在同一包中定义了包含所述成员的(子)类或其父类(从其继承该成员的类)? 不,First
被定义在package first
,所以protected
使得成员从人迹罕至First
的package second
。
package second; // Current package
Second sec = new Second(); // from package second and extends First from package first
sec.pro();
试图从哪个软件包访问有问题的成员? 第二
是否在同一包中定义了包含所述成员的(子)类或其父类(从其继承该成员的类)? 是的,Second
,这是在所定义package second
,继承了部件First
,因此protected
部件是从访问Second
中package second
。
package first; // Current package
Second sec = new Second(); // from package second and extends First from package first
sec.pro();
试图从哪个软件包访问有问题的成员? 第一
是否在同一包中定义了包含所述成员的(子)类或其父类(从其继承该成员的类)? 是的,Second
继承了构件First
,这是在所定义package first
的,所以protected
构件是从访问Second
中package first
。
package first; // Current package
Third third = new Third(); // from package third and extends Second from package second,
// which extends First from package first
third.pro();
试图从哪个软件包访问有问题的成员? 第一
是否在同一包中定义了包含所述成员的(子)类或其父类(从其继承该成员的类)?
是的,Third
继承了构件Second
,它继承它从First
其中该构件被定义(package first
),所以protected
部件是从访问Third
在package first
。
我在package1中有一个名为a的类,在Package2中有另一个名为C的类。C类扩展了A类。 A有一个实例变量,声明如下: 这是怎么回事?
问题内容: 我已经看到一些参考引用了Java中称为(两个词在一起)的访问修饰符: 我发现与此有关的页面之一在这里。我的学校课上也提到了这个访问修饰符(并说它存在)。但是,使用它会导致Java语言错误。 我尝试了变量和方法,我很确定它不存在,但是我想解释一下发生了什么。是否考虑过然后拒绝了?还是在新版本的Java中将其删除? 编辑:我不是在寻找有关关键字的信息。 问题答案: 删除访问修饰符 Java
问题内容: 我想了解以下示例中的情况(通过包从子类外部访问受保护的成员)。 我知道对于包外部的类,子类只能通过继承才能看到受保护的成员。 有两个包:和。 : : : 可以理解,中的方法可以访问,因为受保护的成员只能通过继承来访问。 我的问题是,为什么是方法,通过在基准访问时,工作正常的方法 ,但 将无法正常工作 通过访问时的参考? 问题答案: 该类中的代码被允许通过type的引用访问受保护的成员。
根据留档(http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)的第二个表,没有标识符的成员对子类不可见。 但是,当我运行下面的示例代码时,“1”(b的内容)被打印出来! 如果没有访问修饰符的成员不能从子类访问,那么为什么在本例中打印它 它应该抛出一个错误,就像在私有访问修饰符中一样,不是吗?
问题内容: 在下面的代码中,Consumer类可以访问Parent类的受保护方法。由于Parent和Consumer类之间没有关系,这怎么可能。 谢谢 问题答案: 表示:相同的包或通过继承。由于您的课程都在(实际上不建议使用),因此可以进行访问。顺便说一句:如果您尝试测试Java访问控制,则会忘记(= no修饰符= )。 另一方面,访问是指:从该特定类(以及仍然是主机类成员的非静态内部类)之外的任
问题内容: 我有两节课。 类具有受保护的方法,是的实例。 Class 与class在同一包中。 我正在尝试访问,但正在获取… 怎么了? 问题答案: 编译器应该捕获这样的错误。当您显然在运行时得到此消息时,发生了一些奇怪的事情。可能您已更改了源代码,但已完全重新编译。 另一个潜在但晦涩的问题是通过不同的类加载器加载类。即使包名称相同,从不同的类加载器加载的类也将位于不同的包中(以与由不同的类加载器加