java 类与类之间的强制类型转换
classa{Strings="class:a";publicvoidt1(inta,intc,Stringb){System.out.println("thisisT....
class a
{
String s="class:a";
public void t1 (int a,int c,String b){
System.out.println("this is T.t1");
}
}
public class b extends a
{
String s="class:b";
public void t1 (int a,int c,String b){
System.out.println("this is P.t1");
}
public static void main(String args[])
{
b b1,b2,t=new b();
a a1,a2,t3;
a1=(a)b2;
a2=b2;
t3 = (a) t;
t3.t1(1,1,"");
System.out.println(a1.s);
System.out.println(a2.s);
b1=(b)a1;
System.out.println(b1.s);
}
}
运行程序 结果显示:
this is P.t1
class:a
class:a
class:b
上面的程序首先是属性之间的强制转换
a1=(a)b2;
a2=b2;
这时 调用a1.s 和 a2.s输出都是为 class:a 可以理解 因为是把子类对象b1,b2强制类型转换成父类赋给a1,a2
然后是方法的强制转换
t3 = (a) t;
但是这时输出的是 this is P.t1 这时子类 b的方法 我觉得找个跟上面的属性应该一样子类对象 t强制类型转换成父类赋给t3、
应该输出父类的方法 this is T.t1 才对
请教java 高手
看懂了这个程序再回答 谢谢 展开
{
String s="class:a";
public void t1 (int a,int c,String b){
System.out.println("this is T.t1");
}
}
public class b extends a
{
String s="class:b";
public void t1 (int a,int c,String b){
System.out.println("this is P.t1");
}
public static void main(String args[])
{
b b1,b2,t=new b();
a a1,a2,t3;
a1=(a)b2;
a2=b2;
t3 = (a) t;
t3.t1(1,1,"");
System.out.println(a1.s);
System.out.println(a2.s);
b1=(b)a1;
System.out.println(b1.s);
}
}
运行程序 结果显示:
this is P.t1
class:a
class:a
class:b
上面的程序首先是属性之间的强制转换
a1=(a)b2;
a2=b2;
这时 调用a1.s 和 a2.s输出都是为 class:a 可以理解 因为是把子类对象b1,b2强制类型转换成父类赋给a1,a2
然后是方法的强制转换
t3 = (a) t;
但是这时输出的是 this is P.t1 这时子类 b的方法 我觉得找个跟上面的属性应该一样子类对象 t强制类型转换成父类赋给t3、
应该输出父类的方法 this is T.t1 才对
请教java 高手
看懂了这个程序再回答 谢谢 展开
展开全部
个人见解:
你把子类对象强制转换成父类对象时,你调用父类对象的某个属性时,输出的是父类中对应属性的值,因为在内存空间中属性和方法的执行原理是不一样的,什么类型的对象调用对应的属性。而对于方法,只要子类重写了父类的方法,不管你把子类强制转换成父类还是父类的父类,你调用方法时,总是调用子类的方法,父类方法被覆盖(父类的静态方法是不可以覆盖的,只可以隐藏),所以你的t3=(a)t;t3.t1()调用的是t的t1方法。其实这个问题比较复杂,你可以参考一些资料自己写一些简单的类来验证,举一反三,效果会很好的,还有要区别覆盖和隐藏的区别,祝你成功!
你把子类对象强制转换成父类对象时,你调用父类对象的某个属性时,输出的是父类中对应属性的值,因为在内存空间中属性和方法的执行原理是不一样的,什么类型的对象调用对应的属性。而对于方法,只要子类重写了父类的方法,不管你把子类强制转换成父类还是父类的父类,你调用方法时,总是调用子类的方法,父类方法被覆盖(父类的静态方法是不可以覆盖的,只可以隐藏),所以你的t3=(a)t;t3.t1()调用的是t的t1方法。其实这个问题比较复杂,你可以参考一些资料自己写一些简单的类来验证,举一反三,效果会很好的,还有要区别覆盖和隐藏的区别,祝你成功!
展开全部
//由于没有实例化,这两句话是编译通不过的,所以这一切得从头再来
a1=(a)b2;
a2=b2;
//如题
b b1,b2,t=new b();
//这条语句中只有t被初始化了
a1=(a)b2;
a2=b2;
//如题
b b1,b2,t=new b();
//这条语句中只有t被初始化了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这程序写的看着好费劲。
首先你根本就没有实例化.
然后之所以输出this is P.t1是因为子类重写了父类的方法,调用的固然就是重写后的方法.
你搞那么多转换,远没有去好好搞搞多态实在.
首先你根本就没有实例化.
然后之所以输出this is P.t1是因为子类重写了父类的方法,调用的固然就是重写后的方法.
你搞那么多转换,远没有去好好搞搞多态实在.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这个问题相当于是由一个父类去实例化了一个子类对象,比方说:
class Animal这是父类,然后Person类继承了这个类,然后用
Animal a_person = new Person();
虽然进行了类型转换,但是 Person对象就是Person对象,用它的对象调用它自己的方法,输出的当然是person类自己的内容。
给你一个我写的小代码:
class Animal
{
public void say()
{
System.out.println("I am a animal");
}
}
class Person extends Animal
{
public void say()
{
System.out.println("I am a person");
}
}
public class TestImpl
{
public static void main(String[] args)
{
Animal testImpl = (Animal)new Person();
testImpl.say();
}
}
输出为 I am a person
你想问的应该是这个问题吧!
class Animal这是父类,然后Person类继承了这个类,然后用
Animal a_person = new Person();
虽然进行了类型转换,但是 Person对象就是Person对象,用它的对象调用它自己的方法,输出的当然是person类自己的内容。
给你一个我写的小代码:
class Animal
{
public void say()
{
System.out.println("I am a animal");
}
}
class Person extends Animal
{
public void say()
{
System.out.println("I am a person");
}
}
public class TestImpl
{
public static void main(String[] args)
{
Animal testImpl = (Animal)new Person();
testImpl.say();
}
}
输出为 I am a person
你想问的应该是这个问题吧!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
b b1,b2,t=new b();
//这条语句中只有t被初始化了
改正:
b b1=new b(),b2=new b(),t=new b();
子类去构建父类,取同名变量的时候是得到的父类的变量,同名方法的时候是得到子类的方法,这是常识,记住就行。
//这条语句中只有t被初始化了
改正:
b b1=new b(),b2=new b(),t=new b();
子类去构建父类,取同名变量的时候是得到的父类的变量,同名方法的时候是得到子类的方法,这是常识,记住就行。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
系统默认子类调用基类的无参构造方法。所以打印的是子类中的构造方法。不知道对不对。楼主自己可以考虑考虑。因为我也是才学的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询