Man*_*y M 8 java inheritance subclass private-members superclass
我被告知,对于Java子类,它可以继承其超类的所有成员.这甚至意味着私人会员呢?我知道它可以继承受保护的成员.
谁可以给我解释一下这个.我现在完全糊涂了.
Ken*_*nde 22
这种取决于你对继承这个词的确切用法.我会举例解释.
假设您有两个类:Parent和Child,其中Childextends Parent.此外,Parent还有一个名为的私有整数value.
现在问题是:Child继承私有value吗?在Java中,继承的定义方式是答案为"否".然而,在一般的OOP术语中,存在轻微的模糊性.
你可以说它没有继承,因为没有地方可以Child明确地引用value.即任何代码this.value都不能在其中使用Child,也不obj.value能从某些调用代码中使用(显然).
但是,从另一个意义上说,你可以说这value 是继承的.如果您认为每个实例Child也是一个实例Parent,那么该对象必须包含其中value的定义Parent.即使Child类对此一无所知,名为的私有成员value仍然存在于每个实例中Child.所以在这个意义上,你可以说这value是继承的Child.
因此,不使用"继承"一词,只需记住子类不了解父类中定义的私有成员.但是请记住,那些私有成员仍然存在于子类的实例中.
sgo*_*les 19
不,私有成员不会被继承,因为私有成员的范围仅限于定义它的类.仅继承public和protected成员.
超级私人会员
子类不继承其父类的私有成员.但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法.嵌套类可以访问其封闭类的所有私有成员 - 包括字段和方法.因此,子类继承的公共或受保护嵌套类可以间接访问超类的所有私有成员.
来自JLS,
声明为private的类的成员不会被该类的子类继承.只有声明为protected或public的类的成员才会被声明在声明类之外的包中声明的子类继承.
一个有用的链接:子类是否继承私有字段?
小智 5
您会在这里 100% 满意。我在我的电脑上测试了它,我得出的结论是我要把它贴在这里。只需通过下面编写的程序,查看程序输出并阅读最后给出的结论。要自己测试,请复制整个程序并将其保存在名为“InheritanceTest.java”的文件中,然后编译并最终运行它。
// Testing if a subclass can access the private members of a superclass
class Class1 {
private String name;
public void setName(String name) {
this.name = name;
System.out.println("The name has been set successfully.");
}
public void showName() {
System.out.println("The name is: " + name);
}
}
class Class2 extends Class1 {
private int age;
public void setAge(int age) {
this.age = age;
System.out.println("The age has been set successfully.");
}
public void showAge() {
System.out.println("The age is: " + age);
}
public void displayName() {
//Accessing the private member of superclass here
//System.out.println("The name is: " + name); //error, can't compile because access to the private member name of the superclass Class1 is not permitted here.
}
}
class InheritanceTest {
public static void main(String[] args) {
Class1 c1 = new Class1();
Class2 c2 = new Class2();
c1.setName("Name_C1");
c2.setName("Name_C2"); //No error, setName() is a public member of the superclass which indirectly gives access to the private member "name".
c1.showName();
c2.showName(); //No error, showName() is a public member of the superclass which indirectly gives access to the private member "name".
c2.setAge(25);
c2.showAge();
//c2.displayName(); //error
}
}
Run Code Online (Sandbox Code Playgroud)
The name has been set successfully.
The name has been set successfully.
The name is: Name_C1
The name is: Name_C2
The age has been set successfully.
The age is: 25
Run Code Online (Sandbox Code Playgroud)
是的,子类可以间接访问超类的私有成员。子类不能直接访问超类的私有成员。
超类的所有public、private 和protected 成员(即所有字段和方法)都由子类继承,但子类只能直接访问超类的public 和protected 成员。如果从超类继承的成员可以访问超类的私有成员,则子类可以使用此继承成员访问超类的私有成员。
| 归档时间: |
|
| 查看次数: |
22039 次 |
| 最近记录: |