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