java中的私有方法重写
我试图理解java中的方法重写。 理解私有方法不能被重写java中的私有方法重写,java,inheritance,Java,Inheritance,我试图理解java中的方法重写。 理解私有方法不能被重写 public class Superclass { private String name; Superclass(String name) { this.name=name; } private void printName(String name) { System.out.println("This is a Superclass output"+name);
public class Superclass
{
private String name;
Superclass(String name) {
this.name=name;
}
private void printName(String name) {
System.out.println("This is a Superclass output"+name);
}
}
public class Subclass extends Superclass
{
Subclass(String name) {
super(name);
}
public void printName(String name) {
System.out.println(name);
}
}
我正在尝试执行这段代码
输出:“这是一个超类输出这是一个超类变量”
请帮助我理解objectsb实际上指的是哪个类。
当printName
在超类中是公共的时,我看到的输出是:
“这是超级类变量”
另外,请帮助我理解为什么
sb
根据修饰符private和public指向两个不同的类。您不能访问其类之外的私有方法
请看下表*:
| Class | Package | Subclass | Subclass | World
| | |(same pkg)|(diff pkg)|
————————————+———————+—————————+——————————+——————————+————————
public | + | + | + | + | +
————————————+———————+—————————+——————————+——————————+————————
protected | + | + | + | + |
————————————+———————+—————————+——————————+——————————+————————
no modifier | + | + | + | |
————————————+———————+—————————+——————————+——————————+————————
private | + | | | |
+ : accessible
blank : not accessible
因此,如果您想打印“这是一个超类输出,这是一个超类变量”
,您必须使超类的printName()
至少为包私有(=无修饰符)
关于你的第二个问题:
请帮助我理解objectsb实际上指的是哪个类。当printName在超类中是public时,我看到的输出是:
“这是超类变量”
java自动获取子类的函数,因为您在以下位置创建了该子类的实例:
Superclass sb = new Subclass("Superclass");
不能访问其类之外的私有方法 请看下表*:
| Class | Package | Subclass | Subclass | World
| | |(same pkg)|(diff pkg)|
————————————+———————+—————————+——————————+——————————+————————
public | + | + | + | + | +
————————————+———————+—————————+——————————+——————————+————————
protected | + | + | + | + |
————————————+———————+—————————+——————————+——————————+————————
no modifier | + | + | + | |
————————————+———————+—————————+——————————+——————————+————————
private | + | | | |
+ : accessible
blank : not accessible
因此,如果您想打印“这是一个超类输出,这是一个超类变量”
,您必须使超类的printName()
至少为包私有(=无修饰符)
关于你的第二个问题:
请帮助我理解objectsb实际上指的是哪个类。当printName在超类中是public时,我看到的输出是:
“这是超类变量”
java自动获取子类的函数,因为您在以下位置创建了该子类的实例:
Superclass sb = new Subclass("Superclass");
这里,超类
参考变量sb
将在子类
对象中搜索超类
对象,它将找到它,因为子类扩展了超类
sb.printName("this is super class variable");
这里因为sb
指向子类
对象,所以如果有被重写的方法,它将执行该方法
但是
如果没有重写的方法,它将始终执行超类
方法,因为引用类型是超类
sb.printName("this is super class variable");
参考:
这里,超类
参考变量sb
将在子类
对象中搜索超类
对象,它将找到它,因为子类扩展了超类
sb.printName("this is super class variable");
这里因为sb
指向子类
对象,所以如果有被重写的方法,它将执行该方法
但是
如果没有重写的方法,它将始终执行超类
方法,因为引用类型是超类
sb.printName("this is super class variable");
参考:
首先,你应该自己探索更多,这样当你的输出本身回答问题时,你就不需要问这样的问题了。 你的问题是关于哪个对象,而不是为什么会有这种行为。 我很乐意回答你的问题。考虑以下2个问题: 案例1:
Super Super=new Super()代码>
案例2:超级子类=新的子类()//扩展Super和Super引用的实例
案例3:子类Subclass=new Subclass();//由自己引用
案例1:该类不知道地球上有任何其他实现,因此它所能访问的只是它自己在超类中声明的方法(所有的意思都包括Private)。所以不要混淆,只要看看这个类
Case2:根据语句,子类是Super的扩展实现,实例是由Super引用创建的。
在这种情况下,除了案例1之外,超级子类还可以访问扩展实现中的重写方法。表示子类中SUPER+重写方法的所有方法
<强> Case3:< /强>将其视为情况1。引用与它的实例相同,它可以访问它的子类的所有方法+非私有方法
我用与你问题相同的语气回答了这个问题,试图澄清你的困惑。
但我认为你们需要理解的主要问题是为什么这种行为最终会澄清你们的概念。
然而,正如我所看到的,你们是初学者,所以一旦你们开始预测我上面提到的输出,你们就会学习
干杯 首先,你应该自己探索更多,这样当你的输出本身回答了问题时,你就不需要问这样的问题了。
你的问题是关于哪个对象,而不是为什么会有这种行为。
我很乐意回答你的问题。考虑以下2个问题:
案例1:Super Super=new Super()代码>
案例2:超级子类=新的子类()//扩展Super和Super引用的实例
案例3:子类Subclass=new Subclass();//由自己引用
案例1:该类不知道地球上有任何其他实现,因此它所能访问的只是它自己在超类中声明的方法(所有的意思都包括Private)。所以不要混淆,只要看看这个类
Case2:根据语句,子类是Super的扩展实现,实例是由Super引用创建的。
在这种情况下,除了案例1之外,超级子类还可以访问扩展实现中的重写方法。表示子类中SUPER+重写方法的所有方法
<强> Case3:< /强>将其视为情况1。引用与它的实例相同,它可以访问它的子类的所有方法+非私有方法
SuperClass sc = new SubClass();
SuperClass.access$1(sc);// sc.print();