Java中类的getClass()与类继承之间的关系详解

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());
    }
}

运行结果如下:

                              

例子2:

        Cartoon x = new Cartoon();
        System.out.println("=======");
        Drawing drawing =new Drawing();
        System.out.println("++++++++");
        Art art =new Art();
        System.out.println("**********");

运行结果:

                

结论:

    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的对象,也即最上层的子类。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值