当前位置:编程学习 > JAVA >>

java中继承的问题




这个程序在执行y.min()的时候编译器是调用父类中的方法吗?  如果是为什么不调用子类的方法呢?


如果不是的话  那么答案为什么是 0 100 0  99 呢? --------------------编程问答-------------------- 你子类又没写min这个方法。 当然是调用父类了 --------------------编程问答-------------------- 1、是的,是调用父类的
2、之所以调用的是父类的,是因为子类自己没有写。
--------
技巧性理解:
    就好比,儿子继承了父亲的财产,现在儿子在用财产(即y.min()),那么财产是谁的?当然是父亲的,只不过使用者是儿子罢了 ... --------------------编程问答-------------------- 子类没有那个方法怎么用?
就好像花钱一样,自己没有,还不用老子的啊?(败家子的做法) --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 1 楼 elinehideaki 的回复:
你子类又没写min这个方法。 当然是调用父类了


调用父类的方法,a--为什么也是用父类的成员变量?而不是用子类的成员变量a? --------------------编程问答--------------------
引用 2 楼 weidu23 的回复:
1、是的,是调用父类的
2、之所以调用的是父类的,是因为子类自己没有写。
--------
技巧性理解:
    就好比,儿子继承了父亲的财产,现在儿子在用财产(即y.min()),那么财产是谁的?当然是父亲的,只不过使用者是儿子罢了 ...


调用父类的方法,a--为什么也是用父类的成员变量?而不是用子类的成员变量a? --------------------编程问答-------------------- 因为父类中的 min方法
就是父类的 a。 --------------------编程问答--------------------
class son extends father {
public void plus() {
a++;
}
public int getA() {
return super.a;
}
}

你把子类的int a 去掉 运行结果 你就明白了 --------------------编程问答--------------------
引用 3 楼 ganshenml 的回复:
子类没有那个方法怎么用?
就好像花钱一样,自己没有,还不用老子的啊?(败家子的做法)



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";
}
}
那这个怎么解释 --------------------编程问答--------------------
引用 9 楼 crazyprogrammer0 的回复:
Quote: 引用 3 楼 ganshenml 的回复:

子类没有那个方法怎么用?
就好像花钱一样,自己没有,还不用老子的啊?(败家子的做法)



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:(重载的方法属于子类扩展的方法,覆写的方法才是继承过来的) --------------------编程问答-------------------- 3楼,10楼回答已非常详细了  --------------------编程问答--------------------
引用 3 楼 ganshenml 的回复:
子类没有那个方法怎么用?
就好像花钱一样,自己没有,还不用老子的啊?(败家子的做法)

如果变成
public class father {
        int a = 100;
        public void min() {
                this.a--;
        }
在调试时候 this 指向的是 son  但是 this.a 却是 father的a。
--------------------编程问答--------------------
引用 10 楼 ganshenml 的回复:
Quote: 引用 9 楼 crazyprogrammer0 的回复:

Quote: 引用 3 楼 ganshenml 的回复:

子类没有那个方法怎么用?
就好像花钱一样,自己没有,还不用老子的啊?(败家子的做法)



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吗? --------------------编程问答--------------------
引用 13 楼 u011883721 的回复:
Quote: 引用 10 楼 ganshenml 的回复:

Quote: 引用 9 楼 crazyprogrammer0 的回复:

Quote: 引用 3 楼 ganshenml 的回复:

子类没有那个方法怎么用?
就好像花钱一样,自己没有,还不用老子的啊?(败家子的做法)



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:网上我也没找到很多资料,这是我自己的理解,可能有不妥,可以有机会好好找一下! --------------------编程问答-------------------- 子类中没有min呀。。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,