A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾辉 黑马帝   /  2012-2-6 11:41  /  3284 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

A test = new B()和B test = new B()的区别?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

18 个回复

正序浏览
第一个意思是父类指向子类的对象,然后可以调用子类中和父类相同的方法,但不可调用子类另外定义的方法,这个叫做上转型对象;第二个是一个正常的实例化对象。
回复 使用道具 举报
我觉得这样更能体现问题
B b=new B();
A a=b;
B b1=b;这样问a和b1的区别,向上转型和多态,B是A的子类,或B实现了A这一接口并且a==b1;
回复 使用道具 举报
李杨 黑马帝 2012-2-14 23:38:52
17#
一看你提问就知道你在想你的女朋友!!!
回复 使用道具 举报
A test = new B():向上转型。编译时看A类型,运行时看B。当B调用了自己内部的特有的非static方法时,而在A没有这个方法时,会出现编译出错。
回复 使用道具 举报
如果B继承了A的话,A类就是B类的父类!A test = new B() 是用到多态性的编程思想,这样可以new完子类向上转换成父类类型的引用变量。B test = new B() 实例化一个对象后,引用变量还是子类的类型
回复 使用道具 举报
A test = new B():A 是B的父类或者实现接口,体现了JAVA编程思想的多态性,完成了子类的向上转型过程。
B test = new B():这只是在堆内存当中创建了B类的一个实例化对象,并将该对象的地址值赋值给了栈内存当中B类的引用变量test。
回复 使用道具 举报
A test = new B();
在栈内存中创建了一个A类型的引用变量test,
在堆内存中创建了一个B类对象,
并将堆内存中B类对象的首地址值付给了栈内存中的A类型的变量test。
是父类引用指向了子类对象,属于多态。
回复 使用道具 举报
B test = new B():这个只是为类B创建了一个实例化对象test,没有更深层次的意义。

A test = new B():这条语句体现了多态。从这条语句中首先可以看出B继承了A,或者B实现了A;父类A的引用test指向自己子类B的对象,这样test既可以被提升成父类A,也可以被强制转换为子类类型B,这样也就大大提高了程序的扩展性。
回复 使用道具 举报
A是B的父类或B的实现接口,B test =new B()是指创建B的一个实例对象
第一种方法,主要是用于多态,或面向接口编程,实现程序的通用性
第二种方法,主要是用B类的特有方法。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
B test = new B();就是我们平时正常使用的用B类去实例化一个B类对象,然后对象可以调用B类的方法。而A test = new B();则体现了java的多态性特点。此语句应该为向上转型,test所指向的是B类,故应该调用B类的方法,可是test会遗失除与父类共有的其他方法。但是向上转型的好处是以父类为参数,调用时用子类参数,可以使得代码更简洁,也体现了java的抽象编程思想。

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
A test = new B()和B test = new B()的区别?
楼主A和B给的关系不确定啊。
就你的提问想必A和B的关系有两种情况:
1,A是一个类,B类继承了A类
2,A是一个借口,B类实现了A接口

B test = new B();
在栈内存中创建了一个B类型的引用变量test,
在堆内存中创建了一个B类对象,
并将堆内存中B类对象的首地址值付给了栈内存中的B类型的变量test。


A test = new B();
在栈内存中创建了一个A类型的引用变量test,
在堆内存中创建了一个B类对象,
并将堆内存中B类对象的首地址值付给了栈内存中的A类型的变量test。
是父类引用指向了子类对象,属于多态。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
B  b = new B():
就是简单的对一个类进行实例化;

A  a = new B():
是一个简单的多态应用,
表示A是B的父类,
创建一个父类对象指向子类.

LZ看了多态入门就会理解了.

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
易伟 黑马帝 2012-2-6 12:49:41
7#
A test = new B()运用了多态思想。
我给你举个形象的例子:
Anminal  a  =  new Cat();   //这就运用了多态思想,多态最大的特点是便于性能扩展,它除了可以new  Cat类对象,也可以new Dog类对象等其他Anminal类子类的对象。
                                      //但是多态有一个缺点就是new出来的对象调用方法有局限性,楼上已经说过了,它只能调用Anminal类中的方法,如果需要调用子类独有的方法
                         //就需要进行强制转型。
Cat  a  =  new  Cat();    没有使用多态思想,Cat类中的方法可以正常调用。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
从楼主提出的问题来分析 ,是new出的对象的区别不清楚
由代码可知道 A类是B类的父类
B test = new B()很好理解
楼主不明白的应该是
A test = new B()
此处是JAVA多态的表现   父类对象指向子类引用,new出来的对象拥有子类B的所有属性和方法,
区别在于父A new出的子类对象屏蔽了相对于A多余的方法和属性,也就是那些方法是不可见的,不能直接调用和访问
楼主能理解么

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 秦碧 于 2012-2-6 11:59 编辑

在 A  test=new B();中,首先定义了一个A类的引用test, 又新建了一个B类的对象,并让test指向这个对象
而在B test = new B();中,建立B类引用,并指向B类对象;

应用上的区别:
如果A中有method_1 而B中除了继承A中的method_1外,还特有method_2
B test = new B();test可以调用method_1和method_2
A  test=new B(); test只能调用method_1  若这时希望test可以调用method_2 则需要将test强制转换成B(test1=(B)test;)

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
你能把程序发全吗?我大体估计了一下应该是类的向上转型(类的继承相关的)。如果是B继承A,然后A test = new B()向上转型获得一个对象,则在B中定义的一些新方法和新变量是A中没有的,可以说这个test对象不能调用;但B test = new B()却是使用自己的对象调用,都能够使用。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
从第一个 看 A 应该是B的父类。这是多态的体现:父类的引用指向子类的对象。 调用的是B的方法和属性等。
第二个就是单纯的实例化一个对象。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
A test = new B()面向接口或父类编程典型应用,更具有灵活性,
B test = new B()创建了一个普通对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马