在 Java 中使用 instanceof 关键字判断一个对象到底是哪个类的实例
class A{
public void fun1(){
System.out.println("A --> public void fun1(){}");
}
public void fun2(){
this.fun1();
}
}
class B extends A{
public void fun1(){//覆写父类中的fun1()方法
System.out.println("B --> public void fun1(){}");
}
public void fun3(){//子类自己定义的方法
System.out.println("B --> public void fun3(){}");
}
}
public class Test{
public static void main(String[] args) {
A a1 = new B();//通过向上转型实例化 A 类对象
System.out.println("A a1 = new B():" + (a1 instanceof A));
System.out.println("A a1 = new B():" + (a1 instanceof B));
A a2 = new A();//通过A类的构造实例化本类对象
System.out.println("A a2 = new A():" + (a2 instanceof A));
System.out.println("A a2 = new A():" + (a2 instanceof B));
}
}
以上可以看出,由于通过子类实例化的对象同时是子类和父类的实例,所以可以直接进行向上或向下转型,但如果直接使用了父类实例化本类对象,则一定就不再是子类实例了,所以不能转换。
在进行对象的向下转型关系前最好先进行判断后再进行相应的转换操作,这样可以避免转换异常的出现
class A{
public void fun1(){
System.out.println("A --> public void fun1(){}");
}
public void fun2(){
this.fun1();
}
}
class B extends A{
public void fun1(){//覆写父类中的fun1()方法
System.out.println("B --> public void fun1(){}");
}
public void fun3(){//子类自己定义的方法
System.out.println("B --> public void fun3(){}");
}
}
public class Test{
public static void main(String[] args) {
fun(new B()); //传递B类实例,产生向上转型
}
public static void fun(A a){//此方法可以分别调用各自子类单独定义的方法
a.fun1();
if(a instanceof B){//判断是否是B类实例
B b = (B)a;//进行向下转型
b.fun3();//调用子类自己定义的方法
}
}
}
- 29
- 30
- 31
在类设计时,要不要继承一个已经实现好的类?
在类的设计中重点在于父类的设计,而且在类的设计中,永远不要去继承一个已经实现好的类,只能继承抽象类或实现接口,因为一旦发生对象的向上转型,所调用的方法一定是被子类所覆写过的方法