1、类的继承

继承基本思想:基于某个父类的拓展,制定出一个新的子类,子类可以继承父类原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者重写父类中的某些方法。

使用关键字extends来标识两个类的继承关系。

例1:在项目中创建Test1和Test2类,进行相关说明演示。

public class Test1 {
    public Test1(){  //构造方法
        
    }
    public void doSomething(){ //成员变量
        
    }
    protected Test1 dolt(){   //方法返回值类型为Test1类型
        return new Test1();
    }
}
public class Test2 extends Test1{  //继承父类
    public Test2(){                //构造方法
        super();                   //调用父类构造方法
        super.doSomething();       //调用父类成员方法
    }
    public void doSomethingnew(){  //新增方法
            
    } 
    public void doSomething(){     //重写父类方法
            
    }
}

Test2类继承Test1类,所以Test1为Test2的父类。

在子类构造方法中使用super()语句调用父类的构造方法,也可以在子类中使用super关键字调用父类的成员方法。

子类没有权限去调用父类中被修饰为private方法,只可以调用父类修饰为public或protected的成员方法。

在重写父类方法时,修改方法的修饰权限只能从小到大的范围改变。

例2:创建Test1、Test2、Test3类,继承关系为Test2继承Test1,Test3继承Test2,分别在这三个类构造方法中输出构造方法名称。

public class Test1 {
    Test1() {  //构造方法
        System.out.println("调用父类Test1()构造方法");
    }
}
class Test2 extends Test1{
    Test2(){
        System.out.println("调用子类Test2()构造方法");
    }
}
class Test3 extends Test2{
    Test3(){
        System.out.println("调用子类Test3()构造方法");
    }
    public static void main(String[] args){
        Test3 s=new Test3();
    }
}
调用父类Test1()构造方法
调用子类Test2()构造方法
调用子类Test3()构造方法

从结果中可以看出调用构造方法的顺序,首先是顶级父类,然后是上一级父类,最后是子类。也就是说,实例化子类对象时首先要实例化父类对象,然后在实例化子类对象。

在实例化子类对象时,父类无参构造方法将自动调用,但有参构造方法并不能被自动调用,只能依赖于super关键字显式调用父类构造方法。

2、Object类

在java中,所有的类都直接或者间接继承了java.lang.Object类。

Object类是比较特殊的类,它是所有类的父类,是java类层中的最高层类。

由于所有类都是Object子类,所以在定义类时,省略了extends Object关键字。

Object类中几个重要方法:

2.1 getClass()方法

getClass()方法是Object()类定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。

getClass().getName();

2.2 toString()方法

将一个对象返回为字符串形式,它返回一个String实例。

public class Test4 {
    public String toString(){
        return "在"+getClass().getName()+"类中重写toString方法";
    }
    public static void main(String[] args){
        System.out.println(new Test4());
    }
}
在Test4类中重写toString方法

2.3 equals()方法

两种比较方式:“==”和equals()方法;

“==”和equals()方法比较内容是不同的,equals()方法是String类中的方法,它用于比较两个对象引用所指的内容是否相等;

而“==”运算符比较的是两个对象引用的地址是否相等。

3、对象类型转换

3.1 向上转型

因为平行四边形是特殊的四边形,也就是说平行四边形是四边形的一种,那么可以把平行四边形的对象看作是一个四边形对象。

安卓一个类继承 Presentation什么作用_object

平行四边形类继承了四边形类,常规继承图把顶级类放在页面顶部,然后逐渐向下,所以将子类对象看作成父类对象被称为“向上转型”。由于向上转型是一个较具体的类到较抽象的类转换。所以它总是安全的。

public class Test6 {
    public static void draw(Test6 q){
        
    }
}
public class Test7 extends Test6{
    public static void main(String[] args){
        Test7 p=new Test7();
        draw(p);//调用父类方法
    }
}

3.2 向下转型

通过向上转型可以推出向下转型是将较抽象的类转换为较具体的类。

public class Test6 {
    public static void draw(Test6 q){

    }
}
public class Test7 extends Test6{
    public static void main(String[] args){
        draw(new Test7());
        Test6 q=new Test7();//向上转型
        
        Test7 p=q;//错误写法,将父类对象赋予子类对象;
        
        Test7 p=(Test7)q;//将父类对象赋予子类对象,并且强制转换为子类型,这种写法正确
        
    }
}

如果将父类对象直接赋予给子类,会发生编译器错误,因为一个父类对象不一定是子类的实例。

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

当程序中执行向下转型操作时,如果父类对象不是子类对象实例,就会发生异常,所以呢,我们在用到向下转型之前,一定要首先判断父类的对象是否为子类的实例。

我们用操作符instanceof来完成。格式如下:

myobject instanceof ExampleClass

myobject:某类的引用对象。

ExampleClass:某个类。

操作符返回值为布尔类型,如果返回值为true则是,否则相反。