class A{
String c=new String();
String a="class A";
}
class B extends A{
String c=new String("abc");
String b="calss B";
}
public class Exam3_17{
public static void main(String args[]){
A a1=new A();
B b2=new B();
b2.c="asd";
a1=b2;
System.out.println(a1.c);
System.out.println(b2.c);
}
}
此题中啊a1.c为何不输出“asd”?
String c=new String();
String a="class A";
}
class B extends A{
String c=new String("abc");
String b="calss B";
}
public class Exam3_17{
public static void main(String args[]){
A a1=new A();
B b2=new B();
b2.c="asd";
a1=b2;
System.out.println(a1.c);
System.out.println(b2.c);
}
}
此题中啊a1.c为何不输出“asd”?
如果子类的方法和父类的一样,则调用子类的方法
如果子类的变量名和父类的一样,则取决于该对象的声明类型而非实际类型
class A
{
char a='A';
}
class B
{
String a="B";
public static void main(String[] args)
{
A a=new B();
System.out.println(a.a);
}
}
class B extends A
将程序改成
A a1=new B();
B b2=new B();
后,输出的数据与现在一样,也就是说,a1调用的仍然是父类的变量
String c=new String();
String a="class A";
}这是private....class A{
private String c=new String();
private String a="class A";
}现在想通了没有..全部是私有变量
所以你名字再怎么一样,值也不会影响的
如果子类的变量名和父类的一样,则取决于该对象的声明类型而非实际类型
可以把a1.c 和 b2.c 改成 a1.getC() 与 b2.getC()
就可以理解以上两句话的意思了
class A{
String c=new String(); //默认为NULL
String a="class A";
}A a1=new A();
B b2=new B();
b2.c="asd";
a1=b2; // a1指向b2变量的引用.a1内部变量本身的引用并没有改变,
System.out.println(a1.c);
System.out.println(b2.c);
我改了下你的程序
可以运行了
=====
class A
{
String c=new String();
String a="class A";
}
class B extends A
{
String c=new String("abc");
String b="calss B";
}
public class hyx
{
public static void main(String args[])
{
System.out.println("adf");
A a1=new A();
B b2=new B();
b2.c="asd";
a1.equals(b2); //调用equals方法
System.out.println(a1.c);
System.out.println(b2.c);
}
}可以输入asd
b2.c="asd";
这句的作用相当于是给c创建了一个新的对象new String()指向不同地址,所以没有修改原来B中c的地址,所以输出是不对的
SCJP中常见的题目
现在你知道是怎么回事了吧
变量是使用类型变量,方法是使用实体方法
b2.c="asd";//改了B中的c,c`没变
a1=b2;//所以a1.c依然是b2中的c`,此处为空
已经声明了a1为Class A 类型
虽然a1=b2,但是子类的变量名和父类的一样,则取决于该对象的声明类型而非实际类型
所以打出的是空
在你的public class Exam3_17的main方法中加一句b.super.c="asd"试试
改为:System.out.println(((B)a1).c)。
String c=new String();
String a="class A";
}
class B extends A{
String c=new String("abc");
String b="calss B";
}
public class Exam3_17{
public static void main(String args[]){
A a1=new A();
B b2=new B();
b2.c="asd";
a1=b2;
System.out.println(" a1 is "+a1.getClass().getName());
System.out.println(" a1.a is "+a1.a );
//System.out.println(" a1.b is "+a1.b );
System.out.println(" a1.c is "+a1.c);
System.out.println(" b2.c is "+b2.c);
}
}输出:
a1 is B
a1.a is class A
a1.c is
b2.c is asd