Java中的对象类型

前言

Hello,好久不见,最近事情比较多,刚刚忙完就乖乖回来更新。
在上一期的更新中,我们学习了Java面向对象的三大特性,本期文章让我们继续来学习一下关于对象类型的相关知识点。这期文章的篇幅不是很长,但是我感觉还是比较精华的,希望读完这篇文章之后,会对你有所帮助。感谢支持。
(本文若有任何错误的观点,还请路过的大佬不吝赐教,感激不尽,感激不尽。)


对象类型的转换在Java编程中经常遇到,主要包括向上转型和向下转型的操作。其实理解起来也并不困难,但是,一定要记住 “父类引用指向子类对象,而子类引用不能指向父类对象”这句话。

一、向上转型

首先,向上转型。

把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换。当我们需要多个同父的对象调用某个方法时,通过向上转换后,则可以确定参数的统一.方便程序设计,同时也体现了Java语言的抽象编程思想。

代码示例:

class A {
    public void print() {
        System.out.println("A:print");
    }
}
class B extends A{
    public void print() {
        System.out.println("B:print");
    }
}
class C extends B{
    public void print() {
        System.out.println("C:print");
    }
}
public class Test {
    public static void func(A a) {
        a.print();
    }

    public static void main(String args[]) {
        func(new B());  //等价于 A a =new B();
        func(new C());  //等价于 C c =new C();
    }
}

运行结果:

java将对象转为yaml java将对象转为未知的类型_子类

注意:
向上转型时,父类只能调用父类方法或者子类覆写后的方法,而子类中的单独方法则是无法调用的。


二、向下转型

其次,向下转型。
把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换,这与向上转型恰恰相反。在java中,向下转型则是为了,通过父类强制转换为子类,从而来调用子类独有的方法(向下转型,在工程中很少用到)。
通过向上转型可以推理出向下转型是将较为抽象的类转换为较为具体的类,这样的转型通常会出现问题。

代码示例:

class A {
    public void print() {
        System.out.println("A:print");
    }
}
class B extends A{
     public void print() {
         System.out.println("B:print");
     }
     public void funcB(){
         System.out.println("funcB");
     }
}
class C extends A{
     public void print() {
         System.out.println("C:print");
     }
     public void funcC(){
         System.out.println("funcC");
     }
}
public class Test {
    public static void func(A a)
    {
        a.print();
        if(a instanceof B)
        {
            B b = (B)a;   //向下转型,通过父类实例化子类
            b.funcB();    //调用B类独有的方法
        }
        else if(a instanceof C)
        {
            C c = (C)a;  //向下转型,通过父类实例化子类
            c.funcC();   //调用C类独有的方法
        }
    }

    public static void main(String args[])
    {
        func(new A());
        func(new B());
        func(new C());
    }
}

运行结果:

java将对象转为yaml java将对象转为未知的类型_子类_02


三、使用instanceof操作符判断对象的类型

当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生ClassCastException异常,所以在执行向下转型之前需要养成一个良好的习惯,就是判断父类对象是否为子类对象的实例。这个判断通长用instanceof关键字来完成。可以使用该操作符判断是否一个类实现了某个接口(接口再此不做解释,详情见下期文章),也可以用它来判断一个实例对象是否属于一个类。

语法:

myobject instanceof ExampleClass
  • myobject:某类对象的引用
  • ExampleClass:某个类

使用该操作符的表达式返回值为布尔值,如果返回true,说明muobject对象是ExampleClass实例对象,如果返回false则该对象不是ExampleClass实例对象。

注意:
instanceof是Java语言的关键字,在Java语言中,关键字都为小写。

下面的代码示例中将instanceof操作符与向下转型操作结合使用。

代码示例:

class Quadrangle {
    public static void draw(Quadrangle q){
        //SomeSentence
    }
}
class Square extends Quadrangle{
    //SomeSentence
}
class Anything {
    //SomeSentence
}
public class Parallelogram extends Quadrangle {
    public static void main(String[] args) {
        Quadrangle q = new Quadrangle();            //实例化一个对象
        //判断父类对象是否为Parallelogram子类的一个实例
        if (q instanceof Parallelogram){
            Parallelogram p = (Parallelogram)q;     //向下转型
        }
        //判断父类对象是否为Square子类的一个实例
        if (q instanceof Square){
            Square s = (Square)q;                    //向下转型
        }
        //由于q对象不为Anything类的对象,所以这条语句是错误的
        //System.out.println(q instanceof Anything);
    }
}