这样就能多态了. 比如你还有个C,也是A的子类. 就可以A c = new C(); 这里你可以假设A代表人类.B代表姚明,C代表你. A(人类) b = new B();//这时候人类就被实例化成具体的姚明了. b.play();//这里假设人类有个方法叫打篮球.这里就是姚明在打球 A(人类) c = new C();//这时候人类就被实例化成你了. c.play();//这里就是你在打球了.你打球和姚明打球差距自然不言而喻.上面就是多态的一种体现了.好好领会下.
A a = new A(); B b = new B(); 区别就是 a = b; 的时候new A()的对象就是垃圾了, 但 a = new B();的时候 a直接指向new B()的地址.
a=b;将b的引用赋给a; a = new B(); 重新分配对象B
对于多态而言,a = b; 和 a = new B(); 没有区别。无论是定义还是结果都没什么影响。把父类的引用指向子类,此时a如果调用方法的话,会调用子类重写的方法。
public class DoYou { public static void main(String[] args) { A a = new A(); B b = new B(); a.s = "[AA]"; b.s = "[BB]"; System.out.println(a.s); System.out.println(b.s); System.out.println(a.getS()); System.out.println(b.getS()); System.out.println("===================="); a = b; //a = new B(); System.out.println(a.s); 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 = "[B]"; String getS() { return s; } }请大家把这段运行下,然后把a = b;注释掉,把下面那句注释符号取消,看看结果有什么不同。原因是什么?
a=b;将b的引用赋给a; a = new B(); a直接指向new B()的地址.
如果说结果的话..LZ的方法没什么区别不过意义是不一样的 A a = new A(); B b = new B(); a = b; //是把A指向了B的引用 和 a = new B();//使A类对象重新分配一个新的内存地址..一个新对象不等于b...不过结果没什么区别
比如你还有个C,也是A的子类.
就可以A c = new C();
这里你可以假设A代表人类.B代表姚明,C代表你.
A(人类) b = new B();//这时候人类就被实例化成具体的姚明了.
b.play();//这里假设人类有个方法叫打篮球.这里就是姚明在打球
A(人类) c = new C();//这时候人类就被实例化成你了.
c.play();//这里就是你在打球了.你打球和姚明打球差距自然不言而喻.上面就是多态的一种体现了.好好领会下.
B b = new B();
区别就是
a = b; 的时候new A()的对象就是垃圾了,
但
a = new B();的时候 a直接指向new B()的地址.
a = new B(); 重新分配对象B
public static void main(String[] args) {
A a = new A();
B b = new B();
a.s = "[AA]";
b.s = "[BB]";
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
System.out.println("====================");
a = b;
//a = new B();
System.out.println(a.s);
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 = "[B]";
String getS() {
return s;
}
}请大家把这段运行下,然后把a = b;注释掉,把下面那句注释符号取消,看看结果有什么不同。原因是什么?
a = new B(); a直接指向new B()的地址.
A a = new A();
B b = new B();
a = b; //是把A指向了B的引用
和
a = new B();//使A类对象重新分配一个新的内存地址..一个新对象不等于b...不过结果没什么区别
a指向了b的引用a = new B()
新生成了个B
a是变量。new A()是创建了一个在内存中创建了一个A的实例,然后变量a指向内存中的A
a = b,那么就是a指向b指向的对象B的一个实例。
a = new B()是创建了一个内存中新的B的实例,然后换由a指向他。a和b在内存中指向的实例是不同的。
在使用上没有什么区别.
跟
int i = 2;
int b = 3;
i = b ;
i = 3;
类似.这里因为有多态 把子类的引用赋给对象了.
其实这个两个功能上是一样的.
a=new b()是在堆中创建一个B的对象
a=b //在对象池中找到对象句柄b,在将对象句柄a指向b所指的内存地址,没有开辟一个新的内存地址
a=new B() //在内存中开辟一个新的内存地址,再将对象句柄a指向新内存地址的首地址