通过实验看 Java 中私有成员是否能被继承
2005-09-23 12:48
381 查看
关于 Java 中,子类能不能继承父类中的私有成员的问题,似乎颇有争议。在 SUN 授权 Java Language Specification 一书中,作者认为子类可以继承父类的私有成员,只是不能访问罢了。
我们知道,子类可以通过声明具有相同名字的属性来覆盖掉从父类中继承而来的相应属性,也可以声明具有相同名字相同签名的方法来覆盖掉从父类中继承而来的相应方法。也就是说,如果子类可以从父类中继承私有成员,那么也就可以覆盖掉继承而来的私有成员。反之,如果子类覆盖不了父类中的私有成员,我们就不能说子类继承了父类中的私有成员。
我们可以设计一个实验来验证父类中的私有成员是否会被子类继承。考虑如下两个类:
public class ParentClass {
private String msg = "I am a attribute in ParentClass.";
public String getMsg() {
return msg;
}
}
public class ChildrenClass extends ParentClass {
private String msg = "I am a attribute in ChildrenClass.";
}
测试类:
public class TestClass {
public static void main(String[] args) {
ParentClass p = new ParentClass();
ChildrenClass c = new ChildrenClass();
System.out.println("ParentClass object outputs:");
System.out.println(p.getMsg());
System.out.println("");
System.out.println("ChildrenClass object outputs:");
System.out.println(c.getMsg());
}
}
编译后运行测试类我们可以看到控制台输出以下结果:
ParentClass object outputs:
I am a attribute in ParentClass.
ChildrenClass object outputs:
I am a attribute in ParentClass.
可以看到,虽然我们在子类中定义了一个属性试图覆盖掉父类中的同名属性,但是从输出结果看来,这个行动是无效的。因为没有从父类中继承私有成员,所以也谈不上覆盖父类中的同名属性——没有可供覆盖的属性。相同的道理,子类也不会继承父类中的私有方法,有兴趣的程序员可以自己写一个类似的实验程序试一试。
我们知道,子类可以通过声明具有相同名字的属性来覆盖掉从父类中继承而来的相应属性,也可以声明具有相同名字相同签名的方法来覆盖掉从父类中继承而来的相应方法。也就是说,如果子类可以从父类中继承私有成员,那么也就可以覆盖掉继承而来的私有成员。反之,如果子类覆盖不了父类中的私有成员,我们就不能说子类继承了父类中的私有成员。
我们可以设计一个实验来验证父类中的私有成员是否会被子类继承。考虑如下两个类:
public class ParentClass {
private String msg = "I am a attribute in ParentClass.";
public String getMsg() {
return msg;
}
}
public class ChildrenClass extends ParentClass {
private String msg = "I am a attribute in ChildrenClass.";
}
测试类:
public class TestClass {
public static void main(String[] args) {
ParentClass p = new ParentClass();
ChildrenClass c = new ChildrenClass();
System.out.println("ParentClass object outputs:");
System.out.println(p.getMsg());
System.out.println("");
System.out.println("ChildrenClass object outputs:");
System.out.println(c.getMsg());
}
}
编译后运行测试类我们可以看到控制台输出以下结果:
ParentClass object outputs:
I am a attribute in ParentClass.
ChildrenClass object outputs:
I am a attribute in ParentClass.
可以看到,虽然我们在子类中定义了一个属性试图覆盖掉父类中的同名属性,但是从输出结果看来,这个行动是无效的。因为没有从父类中继承私有成员,所以也谈不上覆盖父类中的同名属性——没有可供覆盖的属性。相同的道理,子类也不会继承父类中的私有方法,有兴趣的程序员可以自己写一个类似的实验程序试一试。
相关文章推荐
- 《通过实验看 Java 中私有成员是否能被继承》续
- 通过实验看 Java 中私有成员是否能被继承
- 通过Java反射测试类私有成员
- Java 中子类是否只继承父类的非私有变量和方法?
- Java中子类的基本继承方法,子类通过继承父类public方法,访问父类private成员
- Java:子类是否只继承父类的非私有变量和方法?
- java在继承中父类的成员变量是否会被子类所覆盖
- Java 中子类是否只继承父类的非私有变量和方法?
- java中子类能不能继承父类的私有成员
- 继承父类私有成员是否可以修改
- Java 使用反射观察子类是否继承了父类的私有方法
- 通过Java反射测试类私有成员(新)
- Java通过反射来获取类的私有构造方法和成员方法
- C#--第七周实验--任务1--创建物体类PhysicalObject,通过其私有字段来存放重量和体积,通过公有方法判断该物体是否会在水中下沉
- 通过java反射技术访问类中私有成员属性
- Java通过反射访问私有成员变量和私有方法
- Java 中子类是否只继承父类的非私有变量和方法?
- java中子类是否继承父类私有属性的问题
- 通过Java反射测试类私有成员
- Java私有变量是否可继承