程序如下:
class A {
String s="class: A";
}
class B extends A{
String s="class: B";
}
class TypeV{
public static void main(String args[]){
B b1,b2= new B();
A a1,a2;
a1=(A)b2;
a2=b2;
System.out.println(a1.s);
System.out.println(a2.s);
b1 = (B)a1;
System.out.println(b1.s);
}
}请问:1。在A a1,a2;
a1=(A)b2;时,是否给a1开辟空间?还是只是a1指向了b2?
2。上面b2对a1赋值时,是不是把所有的成员变量都赋给了a1?赋值后a1仍然是A类的对象吗?
3。(A)b2时,(A)是不是只是一个标识什么也不做,还是将b2转成了A类类型,或是转成A类的对象。
4。父类和子类中有相同名称成员变量时,是不是父类对象调用父类的,子类对象调用子类的,不存在覆盖一说??菜鸟问题,请高手耐心指教!!
class A {
String s="class: A";
}
class B extends A{
String s="class: B";
}
class TypeV{
public static void main(String args[]){
B b1,b2= new B();
A a1,a2;
a1=(A)b2;
a2=b2;
System.out.println(a1.s);
System.out.println(a2.s);
b1 = (B)a1;
System.out.println(b1.s);
}
}请问:1。在A a1,a2;
a1=(A)b2;时,是否给a1开辟空间?还是只是a1指向了b2?
2。上面b2对a1赋值时,是不是把所有的成员变量都赋给了a1?赋值后a1仍然是A类的对象吗?
3。(A)b2时,(A)是不是只是一个标识什么也不做,还是将b2转成了A类类型,或是转成A类的对象。
4。父类和子类中有相同名称成员变量时,是不是父类对象调用父类的,子类对象调用子类的,不存在覆盖一说??菜鸟问题,请高手耐心指教!!
2.如上,如果是新开辟空间的话也只是复杂b2空间中存在的部分
3.如上
a1=(A)b2
这句的却在main的栈空间中分配了两个引用变量的空间一个给a1另一个给a2
a1和b2指向堆中的同一个对象 (由new B()创建的)但是对类对象的成员变量的访问是取决于引用的实际类型,也就是说如果声明
时a1为A的引用类型,则a1.s访问的是父类A的s,反之则是B的成员s这跟访问类对象的方法不同,对方法的访问取决于实际的对象类型而不管引用这个对象
的类型是父类类型还是子类类型,这就是面向对象的 多态
String s="class: A";
void fun(){System.out.println("A has been fun");}
}
class B extends A{
String s="class: B";
void fun(){System.out.println("B has ben fun");}
}
class TypeV{
public static void main(String args[]){
B b1,b2= new B();
A a1,a2;
a1=new A();
a2=b2;
System.out.println(a1.s);
System.out.println(a2.s);
//b1 = (B)a1;
//System.out.println(b1.s);
a1.fun();
b2.fun();
a2.fun();
}
}