刚学不久,刚在网上看都一多态问题,一看自己也一知半解
public class ploytest { public static void main(String[] args) {
A a = new A();
B b = new B();
a.s = "[AA]";
b.s = "[BB]";
a = b;
System.out.println(a.s); //1
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
System.out.println("====================");
((A)b).s = "[AA]";
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
}
} class A {
String s = "[A]";
String getS() {
return s;
}
} class B extends A{
String s = "";
String getS() {
return s;
}
}
//1句输出[A]不太理解,大哥们讲解下啊。。
public class ploytest { public static void main(String[] args) {
A a = new A();
B b = new B();
a.s = "[AA]";
b.s = "[BB]";
a = b;
System.out.println(a.s); //1
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
System.out.println("====================");
((A)b).s = "[AA]";
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
}
} class A {
String s = "[A]";
String getS() {
return s;
}
} class B extends A{
String s = "";
String getS() {
return s;
}
}
//1句输出[A]不太理解,大哥们讲解下啊。。
[BB]
[BB]
[BB]
====================
[AA]
[BB]
[BB]
[BB]
输出的结果是如此的。
[AA]
[BB]
[AA]
[BB]
====================
[AA]
[BB]
[AA]
[BB]这样的话很好理解,涉及方法的override
那么是吊用父类的属性,子类的方法。加了a=b,第1行的[A],我也是不是很理解。有没大大接滚。
public class ploytest { public static void main(String[] args) {
A a = new A();
B b = new B();
a.s = "[AA]";
b.s = "[BB]";
a = b;
System.out.println(a.s); //1因为a=b,故,a还是指向了原来的,上面的修改没有作用,要
//是加在a = b ;这句之后,就会变成"[AA]";
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
System.out.println("====================");
((A)b).s = "[AA]";
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
}
} class A {
String s = "[A]";
String getS() {
return s;
}
} class B extends A{
String s = "";
String getS() {
return s;
}
}
要实现多态
1 有 继承 extends 比如 class B extends A 这就满足
2 要有重写 比如 class A B都有 String getS();这就满足
3 父类引用指向子类对象 比如 你的程序 A a = new A();
B b = new B();
a = b;//将子类对象b 给 父类引用a
也就是 父类引用a 指向 子类对象b
a b是同一对象 (只不过a只能看到b的
一部分)
相当于 A a = new B();
所以一旦满足 父类a 对象调用的就是 子类b的方法
所以我觉得
A a = new A();
B b = new B();
a = b;//将子类对象b 给 父类引用a
相当于:
A a = new B();
B b = new B();
a = b;//
应该没有错吧?
所以我觉得
A a = new A();
B b = new B();
a = b;//将子类对象b 给 父类引用a
相当于:
A a = new B();
B b = new B();
a = b;//
应该没有错吧?""你的都没变,,,
A a = new A();
B b = new B();
a = b;
是相当于
A a = new B();//上面3句相当于这一句
//B b = new B();
a = b你这着做就多此一举了,不需要这, 你那样做是让a从新指向一个新的B对象
//B b = new B();
a = b你这着做就多此一举了,不需要这, 你那样做是让a从新指向一个新的B对象
是什么意思啊?
A a = new B();
a = b;
这样不行吧? b没有定义啊
那如果是这样呢:
A a ;
B b = new B();
a = b;
总可以吧?这个应该没有指向新的对象吧?(原来的没有初始化嘛)
是不是啊。。请求xiangfeidecainiao() 回答。你对我帮助很大。呵呵
B:
字段
A-->s
B-->s
方法:
B-->getS()//覆盖了基类的getS()
A a=new A();
a.s = "[AA]";
原来的a指向一个A类对象,此对象的s被设置为[AA]
但是
a=b后,a变量指向了另一个对象.原来的A类对象等着垃圾回收.
a=b换句话说,就是把b指向的B类对象向上转型为A类对象.A a = new A();
B b = new B();
a.s = "[AA]";
b.s = "[BB]";
a = b;
这些句子的作用就等于:
B b=new B();
b.s="[BB]";
A a=b;此时的b,含有两个实例:
A-->s="[A]"
B-->s="[BB]"由于
a指向基类,因此a.s得到的是A-->s
所以此时System.out.println(a.s); 输出是"[A]"((A)b).s = "[AA]";
由于b被转型为A类,故设置的是A-->s="[AA]"
因此此时System.out.println(a.s);输出变为"[AA]"由于B类的方法覆盖了A类
所以无论是a.getS(),还是b.getS()
均调用的是B-->getS()
1)实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时由Java虚拟机动态决定的。
2)静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经作了绑定。
3)成员变量(包括静态变量和实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经作了绑定。
//B b = new B();
//a = b 这里也要加,刚刚打快了忘记了,不好意思啊
楼上的CoolNO()
你讲的太抽象了,看了半天没看明白,能不能通俗点啊。
我也来说一个关于多态的问题。
在用
[父类名称]变量名称 = new [子类构造函数]
的时候,
NEW出来的对象只能调用父类的方法,子类特有的方法该对象不能使用。
如果该子类重写了父类的方法,那该对象调用的方法是子类的方法,而不是父类的方法