Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.10-4.2.11)

4.2.10如何获取父类的类名

Java语言提供了获取类名的方法:getClass().getName(),开发人员可以调用这个方法来获取类名,代码如下示例1:

package com.LearningJava.pro20170604;

public class TestClassName {

    public void test(){
        System.out.println("class name is:"+this.getClass().getName());
    }

    public static void main(String[] args){
        new TestClassName().test();
    }

}

运行结果:
class name is:com.LearningJava.pro20170604.TestClassName

根据此例子的运行结果,我们是否可以认为通过调用父类的getClass().getName()方法来获取父类的类名是可行的呢?请看如下示例2:

package com.LearningJava.pro20170604;

class A{}

public class TestClassName extends A{

    public void test(){
        System.out.println("class name is:"+super.getClass().getName());
    }

    public static void main(String[] args){
        new TestClassName().test();
    }

}

运行结果:
class name is:com.LearningJava.pro20170604.TestClassName

根据运行结果可以看出来,简单的在子类中调用这个方法是不能实现获取父类的类名,这是为什么呢?主要原因在于Java语言中任何类都能继承自Object类,getClass()方法在Object类中被定义为final与native,子类不能覆盖该方法。因此this.getClass()和super.getClass()最终都调用的是Object中的getClass()方法。而Object的geiClass()方法的释义是:返回此Object的运行时类。由于在示例2中是运行的类是TestClassName而不是A,因此程序输出结果是TestClassName类的类名而不是A。那么如果我们想要在子类中得到父类的名字,可以通过Java的反射机制,使用getClass().getSuperclass().getName()。代码如下示例3:

package com.LearningJava.pro20170604;

class A{}

public class TestClassName extends A{

    public void test(){
        System.out.println("class name is:"+this.getClass().getSuperclass().getName());
    }

    public static void main(String[] args){
        new TestClassName().test();
    }

}

运行结果:
class name is:com.LearningJava.pro20170604.A

关于反射机制,参见博客:http://blog.csdn.net/qq_28814687/article/details/72810905

4.2.11this与super有什么区别

在Java语言中,this用来指向当前实例对象,它的一个非常重要的作用就是用来区分对象的成员变量与方法的形参(当一个方法的形参与成员变量的名字相同的时候,就会覆盖成员变量)。示例1如下:

public class People {

    String name;

    //正确的写法
    public People(String name)
    {
        this.name = name;
    }

    //错误的写法
    public People(String name)
    {
        name = name;
    }
}

上例中,第一个构造函数使用this.name来表示左边的值为成员变量,而不是这个构造函数的形式参数。对于第二个构造函数,由于这个数中形参与成员变量有着相同的名字,因此对于语句name=name,等号左边和右边的两个name都代表的是形式参数。在这种情况下,只有通过this才可以访问到成员变量。
super可以用来访问父类的方法或成员变量。当子类的方法或成员变量与父类有相同名字时就会覆盖父类的方法或成员变量,要访问父类的方法或成员变量只能通过super关键字来访问,如下示例2所示:

class Base{

    public void f(){
        System.out.println("Base: f()");
    }
}

class Sub extends Base{

    public void f(){
        System.out.println("Sub: f()");
    }

    public void Subf(){
        f();
    }

    public void Basef(){
        super.f();

    }


}
public class Test {

    public static void main(String[] args)
    {
        Sub s = new Sub();
        s.Subf();
        s.Basef();
    }
}

运行结果:
Sub: f()
Base: f()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值