黑马程序员技术交流社区
标题:
关于Object类的
[打印本页]
作者:
郭孟涛
时间:
2013-2-19 01:45
标题:
关于Object类的
本帖最后由 郭孟涛 于 2013-2-19 02:38 编辑
Object是所有类的基类,Object不能作为父类吗?
代码如下:
class ObjectDemo
{
public static void main(String[] args)
{
Object ob = new Test();
System.out.println(ob.talk()); // 这里打印为什么出错
}
}
class Test
{
public int talk(){
return 6;
}
}
class Test1 extends Test
{
}
复制代码
这样也是错误的:
class ObjectDemo
{
public static void main(String[] args)
{
Object ob = new Test(); // 声明了一个Object 父类的ob变量,并实例化其子类Test
System.out.println(ob.talk()); // 这里打印正确
}
}
class Test extends Object // 这里又继承了一下,默认就继承了。这样写只是看上出思路更直观点
{
public int talk(){
return 6;
}
}
class Test1 extends Test
{
}
复制代码
如下这个就是打印就正确:
class ObjectDemo
{
public static void main(String[] args)
{
Test ob = new Test1(); //
System.out.println(ob.talk()); // 这里打印正确
}
}
class Test
{
public int talk(){
return 6;
}
}
class Test1 extends Test
{
}
复制代码
父类 实例 = new 子类()
实例可以调用父类中特有的方法(未在子类中覆盖的方法)
实例可以调用子类中覆盖父类的方法
但不可以调用子类中特有的方法(即父类中没有的方法
作者:
张豪杰
时间:
2013-2-19 02:28
Object就是java类里面的上帝(剽窃下毕老师的话)
不是Object类出问题了,是你的代码出问题了。
就拿你第一块代码来说
class ObjectDemo
{
public static void main(String[] args)
{
Object ob = new Test(); //这里建立了一个Object引用指向了一个Test对象
//这里就是传说中的父类引用指向子类对象,也就是说实现了多态
System.out.println(ob.talk()); //这里你就出错了,Object里面可没有talk()这个方法吧?
}
}
class Test
{
public int talk(){
return 6;
}
}
class Test1 extends Test
{
}
复制代码
对于多态,可以总结它为:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
就像上面的代码中,如果Object类里面有一个talk()方法,那么子类Test中就形成方法覆盖,那么此时就可以这么写:obj.talk(),此刻形成了多态,也就不会有错。
但是,Oject中并没有talk方法,你去使用obj.talk(),这当然会报错。
你再看看你能编译通过那块代码,不论父类Test中,和子类Test1中都有talk()方法。
作者:
冯佩
时间:
2013-2-19 02:41
在多态中,引用型变量不能调用自己所属类中没有的方法,ob属于Object类,而talk()不是Object类中的方法,因此第一份代码出现编译错误,打印失败。Test默认就是继承Object类的,所以第二份代码和第一份代码并无区别,因此一样打印错误。Object能做父类,但此处不是Object能不能做父类的问题,而是要用多态中成员函数的特点去分析错误原因。
作者:
张豪杰
时间:
2013-2-19 02:41
上面更正一下,就是最后一句话错了。
应该说“在你能编译通过那块代码中,因为父类Test中有talk方法,所以
Test ob = new Test1();
system.out.println(ob.talk());
这样写没问题,因为ob.talk()调用的是父类中的方法
如果在子类也就是Test1中,重写talk方法的话
Test ob = new Test1();
system.out.println(ob.talk());//那么这里调用的就是Test1中的talk方法了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2