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 向上转型
因为平行四边形是特殊的四边形,也就是说平行四边形是四边形的一种,那么可以把平行四边形的对象看作是一个四边形对象。
平行四边形类继承了四边形类,常规继承图把顶级类放在页面顶部,然后逐渐向下,所以将子类对象看作成父类对象被称为“向上转型”。由于向上转型是一个较具体的类到较抽象的类转换。所以它总是安全的。
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则是,否则相反。