class son extends father { public void plus() { a++; } public int getA() { return super.a; } } 你把子类的int a 去掉 运行结果 你就明白了
public class Test { public static void main(String[] args) { Dog dog = new Dog(); dog.call(); MiniDog mini = new MiniDog(); mini.call(); Dog d = (Dog) mini; d.call(); } } class Dog { private String getName() { return "Dog"; } public String bark() { return "wang wang"; } public void call() { System.out.println("I'm " + getName() + " " + bark()); } }class MiniDog extends Dog { private String getName() { return "Mini"; } public String bark() { return "wo wo"; } } 那这个怎么解释
public class Test { public static void main(String[] args) { Dog dog = new Dog(); dog.call(); MiniDog mini = new MiniDog(); mini.call(); Dog d = (Dog) mini; d.call(); } } class Dog { private String getName() { return "Dog"; } public String bark() { return "wang wang"; } public void call() { System.out.println("I'm " + getName() + " " + bark()); } }class MiniDog extends Dog { private String getName() { return "Mini"; } public String bark() { return "wo wo"; } } 那这个怎么解释 前面不难理解,为什么后面是那样的呢? http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html里面写到子类是不能继承父类的私有成员的(私有变量,私有方法),即使子类写了一个和父类中某个私有方法一样方法名和参数的方法,那是子类自己扩展的方法。父类只能调用子类从父类继承过来的方法,而子类自己扩展的方法是不能被父类所调用的。因此,这里只能调用父类的getName()方法,而后面的bark因为在父类中不是私有方法,所以能被子类继承,因此调用的还是子类的继承过来的方法 Ps:(重载的方法属于子类扩展的方法,覆写的方法才是继承过来的)
如果变成public class father { int a = 100; public void min() { this.a--; } 在调试时候 this 指向的是 son 但是 this.a 却是 father的a。
public class Test { public static void main(String[] args) { Dog dog = new Dog(); dog.call(); MiniDog mini = new MiniDog(); mini.call(); Dog d = (Dog) mini; d.call(); } } class Dog { private String getName() { return "Dog"; } public String bark() { return "wang wang"; } public void call() { System.out.println("I'm " + getName() + " " + bark()); } }class MiniDog extends Dog { private String getName() { return "Mini"; } public String bark() { return "wo wo"; } } 那这个怎么解释 前面不难理解,为什么后面是那样的呢? http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html里面写到子类是不能继承父类的私有成员的(私有变量,私有方法),即使子类写了一个和父类中某个私有方法一样方法名和参数的方法,那是子类自己扩展的方法。父类只能调用子类从父类继承过来的方法,而子类自己扩展的方法是不能被父类所调用的。因此,这里只能调用父类的getName()方法,而后面的bark因为在父类中不是私有方法,所以能被子类继承,因此调用的还是子类的继承过来的方法 Ps:(重载的方法属于子类扩展的方法,覆写的方法才是继承过来的) MiniDog mini = new MiniDog();这个时候是子类对象,为什么在getName()方法中还是返回DOg不是应该返回Mini吗?
public class Test { public static void main(String[] args) { Dog dog = new Dog(); dog.call(); MiniDog mini = new MiniDog(); mini.call(); Dog d = (Dog) mini; d.call(); } } class Dog { private String getName() { return "Dog"; } public String bark() { return "wang wang"; } public void call() { System.out.println("I'm " + getName() + " " + bark()); } }class MiniDog extends Dog { private String getName() { return "Mini"; } public String bark() { return "wo wo"; } } 那这个怎么解释 前面不难理解,为什么后面是那样的呢? http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html里面写到子类是不能继承父类的私有成员的(私有变量,私有方法),即使子类写了一个和父类中某个私有方法一样方法名和参数的方法,那是子类自己扩展的方法。父类只能调用子类从父类继承过来的方法,而子类自己扩展的方法是不能被父类所调用的。因此,这里只能调用父类的getName()方法,而后面的bark因为在父类中不是私有方法,所以能被子类继承,因此调用的还是子类的继承过来的方法 Ps:(重载的方法属于子类扩展的方法,覆写的方法才是继承过来的) MiniDog mini = new MiniDog();这个时候是子类对象,为什么在getName()方法中还是返回DOg不是应该返回Mini吗?个人理解是: 因为子类MiniDog中没有call方法,因此调用了父类的call方法,可以看作为父类向子类的实例的引用了,那么getName()子类是没有这个方法的,前面已经说了,私有方法不能被继承,子类中的那个getName()是重新扩展的,不是继承来的,因此,父类是无法对其调用,只能调用自己的了,而bark()方法是子类继承过来的,父类可以进行调用! ps:网上我也没找到很多资料,这是我自己的理解,可能有不妥,可以有机会好好找一下!
2、之所以调用的是父类的,是因为子类自己没有写。
--------
技巧性理解:
就好比,儿子继承了父亲的财产,现在儿子在用财产(即y.min()),那么财产是谁的?当然是父亲的,只不过使用者是儿子罢了 ...
就是父类的 a。
public void plus() {
a++;
}
public int getA() {
return super.a;
}
}
你把子类的int a 去掉 运行结果 你就明白了
public static void main(String[] args) {
Dog dog = new Dog();
dog.call();
MiniDog mini = new MiniDog();
mini.call();
Dog d = (Dog) mini;
d.call();
}
}
class Dog {
private String getName() {
return "Dog";
}
public String bark() {
return "wang wang";
}
public void call() {
System.out.println("I'm " + getName() + " " + bark());
}
}class MiniDog extends Dog {
private String getName() {
return "Mini";
}
public String bark() {
return "wo wo";
}
}
那这个怎么解释
public static void main(String[] args) {
Dog dog = new Dog();
dog.call();
MiniDog mini = new MiniDog();
mini.call();
Dog d = (Dog) mini;
d.call();
}
}
class Dog {
private String getName() {
return "Dog";
}
public String bark() {
return "wang wang";
}
public void call() {
System.out.println("I'm " + getName() + " " + bark());
}
}class MiniDog extends Dog {
private String getName() {
return "Mini";
}
public String bark() {
return "wo wo";
}
}
那这个怎么解释
前面不难理解,为什么后面是那样的呢?
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html里面写到子类是不能继承父类的私有成员的(私有变量,私有方法),即使子类写了一个和父类中某个私有方法一样方法名和参数的方法,那是子类自己扩展的方法。父类只能调用子类从父类继承过来的方法,而子类自己扩展的方法是不能被父类所调用的。因此,这里只能调用父类的getName()方法,而后面的bark因为在父类中不是私有方法,所以能被子类继承,因此调用的还是子类的继承过来的方法
Ps:(重载的方法属于子类扩展的方法,覆写的方法才是继承过来的)
int a = 100;
public void min() {
this.a--;
}
在调试时候 this 指向的是 son 但是 this.a 却是 father的a。
public static void main(String[] args) {
Dog dog = new Dog();
dog.call();
MiniDog mini = new MiniDog();
mini.call();
Dog d = (Dog) mini;
d.call();
}
}
class Dog {
private String getName() {
return "Dog";
}
public String bark() {
return "wang wang";
}
public void call() {
System.out.println("I'm " + getName() + " " + bark());
}
}class MiniDog extends Dog {
private String getName() {
return "Mini";
}
public String bark() {
return "wo wo";
}
}
那这个怎么解释
前面不难理解,为什么后面是那样的呢?
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html里面写到子类是不能继承父类的私有成员的(私有变量,私有方法),即使子类写了一个和父类中某个私有方法一样方法名和参数的方法,那是子类自己扩展的方法。父类只能调用子类从父类继承过来的方法,而子类自己扩展的方法是不能被父类所调用的。因此,这里只能调用父类的getName()方法,而后面的bark因为在父类中不是私有方法,所以能被子类继承,因此调用的还是子类的继承过来的方法
Ps:(重载的方法属于子类扩展的方法,覆写的方法才是继承过来的)
MiniDog mini = new MiniDog();这个时候是子类对象,为什么在getName()方法中还是返回DOg不是应该返回Mini吗?
public static void main(String[] args) {
Dog dog = new Dog();
dog.call();
MiniDog mini = new MiniDog();
mini.call();
Dog d = (Dog) mini;
d.call();
}
}
class Dog {
private String getName() {
return "Dog";
}
public String bark() {
return "wang wang";
}
public void call() {
System.out.println("I'm " + getName() + " " + bark());
}
}class MiniDog extends Dog {
private String getName() {
return "Mini";
}
public String bark() {
return "wo wo";
}
}
那这个怎么解释
前面不难理解,为什么后面是那样的呢?
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html里面写到子类是不能继承父类的私有成员的(私有变量,私有方法),即使子类写了一个和父类中某个私有方法一样方法名和参数的方法,那是子类自己扩展的方法。父类只能调用子类从父类继承过来的方法,而子类自己扩展的方法是不能被父类所调用的。因此,这里只能调用父类的getName()方法,而后面的bark因为在父类中不是私有方法,所以能被子类继承,因此调用的还是子类的继承过来的方法
Ps:(重载的方法属于子类扩展的方法,覆写的方法才是继承过来的)
MiniDog mini = new MiniDog();这个时候是子类对象,为什么在getName()方法中还是返回DOg不是应该返回Mini吗?个人理解是:
因为子类MiniDog中没有call方法,因此调用了父类的call方法,可以看作为父类向子类的实例的引用了,那么getName()子类是没有这个方法的,前面已经说了,私有方法不能被继承,子类中的那个getName()是重新扩展的,不是继承来的,因此,父类是无法对其调用,只能调用自己的了,而bark()方法是子类继承过来的,父类可以进行调用!
ps:网上我也没找到很多资料,这是我自己的理解,可能有不妥,可以有机会好好找一下!