原书代码:package mypack1;public class ClassA {
public int v1;
protected int v2;
int v3;
private int v4;
}
package mypack2;import mypack1.ClassA;class ClassC extends ClassA {
public void method() {
v1 = 1;
v2 = 2;// OK
ClassA a = new ClassA();
a.v1 = 1;
a.v2 = 2;// err
a.v3 = 3;
a.v4 = 4;
}
}
为什么 v2 = 2;// OK
而 a.v2 = 2;// errprotected不是子类及同包 可以访问吗?
ClassC虽然与ClassA不同包,但却是ClassA的子类啊高手来解答啊?
public int v1;
protected int v2;
int v3;
private int v4;
}
package mypack2;import mypack1.ClassA;class ClassC extends ClassA {
public void method() {
v1 = 1;
v2 = 2;// OK
ClassA a = new ClassA();
a.v1 = 1;
a.v2 = 2;// err
a.v3 = 3;
a.v4 = 4;
}
}
为什么 v2 = 2;// OK
而 a.v2 = 2;// errprotected不是子类及同包 可以访问吗?
ClassC虽然与ClassA不同包,但却是ClassA的子类啊高手来解答啊?
protected的类、类属变量及方法,包内的任何类,及包外的那些继承了此类的子类才能访问;
private的类、类属变量及方法,包内包外的任何类均不能访问;
如果一个类、类属变量及方法不以这三种修饰符来修饰,它就是默认类型的,那么包内的任何类都可以访问它,而包外的任何类都不能访问它(包括包外继承了此类的子类),
楼主 你后边的 a.v3 = 3 和 a.v4 = 4 ; 出错么
仔细看过问题吗?
package mypack2;import mypack1.ClassA;public class ClassC extends ClassA { public void method() {
v1 = 1;
v2 = 2;// OK
ClassA a = new ClassA();
a.v1 = 1;
a.v2 = 2;// err
a.v3 = 3;//err
a.v4 = 4;//err
}}
是继承关系所以可以访问。
LZ实际上可能对某些知识误解了 如:
public class TestPrivate {
private int i;
public void setTestPrivate(TestPrivate testPrivate) {
this.i = testPrivate.i; //LZ想要的这个样子吧?
}
}
主要你重新NEW一下的话并是用NEW的来调用V2的,并不是用ClassC 来调用,而在不同的包中用protected修饰的属性是不能够调用的
public int v1;
protected int v2;
int v3;
private int v4;
}
package net.com.protect;import com.basic.Producted;public class ProtectedB extends Producted {
public void method(){
v1=1;
v2=2;//继承 可以访问protected 限制的成员
v3=3;//err
v4=4;//err
Producted p=new Producted();
p.v1=12;
p.v2// err 新对象的引用,不能访问受保护的成员变量
p.v3=13;// err 同上
p.v4=14;//这个是p引用的私有成员变量,当然可以访问
}
}
public void method() {
v1 = 1;
v2 = 2;// OK 子类访问父类数据成员
ClassA a = new ClassA();
a.v1 = 1;
a.v2 = 2;// err 已经不是子类访问父类了,是子类对象访问了
a.v3 = 3;// err v3在父类中是default的,只能在同一个包下才能访问
a.v4 = 4;// err 父类的私有成员,不可访问
}
}