关于protected我在一本书上看见说:“允许子类通过对象引用访问受保护的成员,但是此对象引用的类型必须与这个类或其子类相同。”
对象引用的类型和类或子类相同,这句怎么理解~?
另一本书上说:“只有在同一个package下的类才能访问这些成员,如果在不用package中可以产生对象或是继承后访问类成员和直接使用父类的成员。”
例子:package package1;public class A
{
protected int p1;
protected static void p2() {}
protected void p3() { }
}
package package1;public class B extends A
{
public B()
{
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();
p1=1;
p2();
p3();
}
}
package package1;public class C
{
public C()
{
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();
}
}package package2;import package1.A;public class D extends A
{
public D()
{
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();
p1=1;
p2();
p3();
}
}
package package2;import package1.A;public class E
{
public E()
{
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();
}
}
变译B、C通过,D、E出错,D的"a.p1""a.p3"出错,但是D类的a不就是继承A类产生的吗~?
对象引用的类型和类或子类相同,这句怎么理解~?
另一本书上说:“只有在同一个package下的类才能访问这些成员,如果在不用package中可以产生对象或是继承后访问类成员和直接使用父类的成员。”
例子:package package1;public class A
{
protected int p1;
protected static void p2() {}
protected void p3() { }
}
package package1;public class B extends A
{
public B()
{
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();
p1=1;
p2();
p3();
}
}
package package1;public class C
{
public C()
{
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();
}
}package package2;import package1.A;public class D extends A
{
public D()
{
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();
p1=1;
p2();
p3();
}
}
package package2;import package1.A;public class E
{
public E()
{
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();
}
}
变译B、C通过,D、E出错,D的"a.p1""a.p3"出错,但是D类的a不就是继承A类产生的吗~?
解决方案 »
- 现在行业里面桌面应用程序(CS)用什么语言开发比较多?
- java ip组播划分
- 指定log输出位置
- 求解HTTP Status 405问题
- 关于simpledateFormat 的用法
- java 中如何存取和操作10亿这么大的数? 老鸟进。
- 偶是新人,有个技术问题偶解决不了,请老鸟帮忙!
- Java中List转换为数组,数组转List
- 这样的日期格式"2002-09-08",能否被Calendar类直接使用,从而得到这个特定日期的一些信息??
- 大家好!!有关鼠标带提示信息问题
- 用jarsigner给sqljdbc.jar签名时候出错
- 请问怎么在一个container里同一位置加入两个jpanel,然后通过setvisible显示?
变量及方法的访问权限:类型 同一个类中 同一个包中 不同包中的子类 不同包的中的非子类 private Y N N Nprotected Y Y N Npublic Y Y Y Nfriendly Y Y Y Y
这个好像不对吧!
protected,默认,都不能通过父类的实例引用访问的---这是为什么呢?解释如下:在子类和父类在不同的包时:子类实例引用可以访问父类的public和protected方法(这不正是Java中protected关键字的作用吗?);而此时如果包外生成父类的实例引用,那么这个父类的实例引用只能访问父类的public方法的.
不在同一个pacakge中区别就是子类是否可以访问这个从父类中继承的成员,注意是他继承的,换句话说,如果声明成protected的那么子类中就有这个成员,子类当然可以访问,因为这个成员就是他自己的,别管是声明的也好是从父类继承的也好。但你给的例子不是这个样子,D继承了A那么D的实例中就有p1这个成员但它没去访问这个成员。他试图访问A的实例中的d1,这样当然不行了。举个例子,老张有头发,这个属性是protected的,生了个儿子小张继承了他爹的属性也有头发,小张可以对自己的头发做任何事情,剃秃子也好,染黄毛也好,但是它没权利动他老爹的头发。
类型 同一个类中 同一个包中 不同包中的子类 不同包的中的非子类 private Y N N N
friendly Y Y N N
protected Y Y Y N
public Y Y Y Y 从上到下权限逐渐增大。另外,说明一点:friendly在Java中也叫Default修饰符,具体写代码的时候就是在成员前不加任何权限修饰符。