java getclass() 继承_Java中类的getClass()与类继承之间的关系详解

本文详细探讨了Java中对象的getClass()方法与类继承之间的关系。通过示例代码解释了类构造函数的执行顺序,以及类型转换后对象方法的可用性。当调用getClass()时,返回的是对象实际类的Class对象,即使经过类型转换,对象的内存地址不变,getClass()仍返回最顶层子类的Class实例。
摘要由CSDN通过智能技术生成

1.获得类型类

我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例。例如,有如下一段代码:

2.类继承之间之间的逻辑关系

类C继承类B,而类B继承类A。那么类C的构造函数是怎么运行的呢?这一点一直疑惑着我。为搞明白这一疑惑,做了如下的尝试、代码如下:

public class Art

{

Art() {

System.out.println("Art");//2

System.out.println(getClass().getName());

}

public void test()

{

System.out.println("Print Art");

}

public void test2()

{

System.out.println("print 2Art");

}

}

public class Drawing extends Art

{

Drawing() {

System.out.println("Drawing");//3

System.out.println(getClass().getName());

}

public void test3()

{

System.out.println("Print Draw3");

}

public void test4()

{

System.out.println("Print Draw4");

}

}

public class Cartoon extends Drawing

{

Cartoon(){

System.out.println("Cartoon");//4

System.out.println(getClass().getName());

}

public void test5()

{

System.out.println("Print Cartoon5");

}

public void test6()

{

System.out.println("Print Cartoon6");

}

public static void main(String[] args) {

Cartoon x = new Cartoon();

System.out.println("=======");

Drawing drawing =new Drawing();

System.out.println("++++++++");

Art art =new Art();

System.out.println("**********");

/* x.test();

x.test3();*/

Drawing one = (Drawing)x;

//one的test5()、test6()的方法都没有了

//one.test5();//出现报错,表示存在test5

Art two = (Art)x;//two只有test()和test2()这两个方法,test3()...test()6的方法都没有了

if(one == two){

System.out.println("==");

}else {

System.out.println("!=");

}

System.out.println(x.toString());

System.out.println(one.toString());

System.out.println(two.toString());

}

}

运行结果如下:

cb3f1ec7cfbf1bb84e93ad6def9a5ab4.png

例子2:

Cartoon x = new Cartoon();

System.out.println("=======");

Drawing drawing =new Drawing();

System.out.println("++++++++");

Art art =new Art();

System.out.println("**********");

运行结果:

4dbb392110e0e25264e28ff80840cf7b.png

结论:

1.首先运行:Cartoon x = new Cartoon();但是并没有运行Cartoon的构造函数,而是先运行Cartoon的顶级构造函数Art,在运行父类的构造函数Drawing的构造函数。如红色标记2、3、4.

2.Cartoon x = new Cartoon();x的test、test2、test3--test6方法都可以用。是Drawing one = (Drawing)x,对x进行上溯之后,x继承的方法只有test、test2、test3、test4,而test5、test6都不能用了。同理Art two = (Art)x;x只能有test和test2方法。

3.Drawing one = (Drawing)x和Art two = (Art)x;one和two看似是两个不同的类实例,但是追根索源的话,都是通过Cartoon x = new Cartoon()的x衍生出来的,还是具有相同的内存地址。好似Cartoon 生产了编号为@6d9c的书,包含6章,one只要前4章,后面两章不要了,但是书的编号还是@6d9c,同理解释two。

4.  当调用getClass()时,返回这个对象真实的Class对象。从3个继承对象相等的情况和输出可知,这三个对象有相同的this指针,即内存地址一致。而getClass()返回的就是this指针所代表的最真实的Class的对象,也即最上层的子类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值