java向下转型引用和直接实例化引用的区别

来源:互联网 发布:长江证券for mac 编辑:程序博客网 时间:2024/06/03 15:46

复习java遇到个问题,发现书上向下转型的例子得到的引用和直接实例化子对象得到的引用拥有同样的方法和变量


于是猜测这两种引用得到的内容是相同的


举个例子证明一下

A a=new B();

B b=(B) a;


B b1=new B()


按照java的储存方式


A a=new B();//a引用地址应该放到栈里,B对象放入堆

B b=(B) a;//a引用地址赋给b引用,根据栈的特点,a,b指向同一地址,即a==b

这里可以用if(a==b)确认



B b1=new B()//B放入堆,b放入栈指向B

因此猜测这两种方法得到的对象是相同的;

根据堆的特点两次new的B并不在同一个地址


先在B类里重写equals()方法

public boolean equals(Object obj) {
if(getClass()==obj.getClass())
return true;
else
return false;
}

然后

if(b.equals(b1))
            System.out.println("yes");
        else
            System.out.println("no");

返回true,说明向下转型得到对象与直接实例化得到的对象是相同的,猜测成立


至于他们的区别


举一个用到向下转型的例子

String str=(String)request.getParameter("info");

可以这样写

Object ob=new String();
ob=request.getParameter("info");
String checkcode1 = (String) ob;

很明显用到了向下转型

它和String checkcode=new String("");的区别,我们并不知道getParameter("info")具体的值,假设是1,可以把1放到""中去,那么两种引用获得内容是一样的,都是1。与上面的结论不冲突


但是获得的内容"1"的意义不一样

做个假设:object代表最高抽象ob,第一个方法是假设人request喝了什么水getParameter(),得到的热水是object的一员,但需要输出print()热水,文字string

有这个方法print(),用向下转型在这里可以解释这个过程:被作为热水的事物ob可以看作是一段文字输出。

这和直接的实例化文字“热水”去输出内容是一样,但意义不同

第一种方法可以知道热水是人喝的,而第二种只知道热水


所以结论应该是,引用到的内容一样但意义不同


0 0