Java程序开发学习之子类与继承

(学习参考书:Java2实用教程第5版)

一、子类与父类

继承是一种由已有的类创建新类的机制。利用继承,可以先定义一个共有属性的一般类,根据该一般类在定义具有特殊属性的子类,子类继承一般类的属性和行为,并根据需要增加它自己的新的属性和行为。由继承得到的类称为子类,被继承的类称为父类(超类)。Java不支持多重继承,即子类只能有一个父类。

二、子类的定义

使用关键字extends来定义一个类的子类。格式如下:

class 子类名 extends 父类名{
    
    
	...}

三、类的树形结构

在Java中所有类的祖先是Object类。每个类(除了Object类)有且仅有一个父类,但是可以有0个或多个子类。如果一个类的声明没有extends关键字,这个类就被系统认为是Object类的子类。即声明“class A”与“class A extends Object”是相同的。

四、子类的继承

(1)如果子类和父类在同一个包下,子类自然地继承了其父类中不是私有的变量和方法,继承的成员变量和方法的访问权限保持不变。

(2)如果子类和父类不在同一个包下,子类不会继承私有和友好的成员变量和方法,只会继承共有和受保护的成员变量和方法。

五、子类的对象

当用子类的构造方法创建对象时,不仅子类中声明的成员变量分配了内存空间,父类中被该子类继承的成员变量也被分配了内存空间。

六、instanceof运算符

双目运算符,左边是对象,右边是类。当左边的对象是右边的类或其子类创建的对象时,返回值是true,否则是false。

七、成员变量的隐藏和方法重写

(1)成员变量的隐藏
当子类中声明的成员变量和从父类继承来的成员变量的名字相同,子类会隐藏所继承的成员变量。子类继承的成员变量的特点如下:

  • 子类对象以及子类自己定义的方法,操作与父类同名的成员变量是指子类重新声明的这个成员变量。
  • 子类对象可以调用从父类继承的方法操作被子类隐藏的成员变量,也就是说,子类继承的方法所操作的成员变量一定是被子类继承或隐藏的成员变量。
  • 子类新定义的方法无法操作子类隐藏的成员变量(需要使用super关键字)

(2)方法重写

  • 语法规则:如果子类可以继承父类的某个方法,那么子类就权力重写这个方法。所谓的方法重写,是指子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的子类型,并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。
  • 重写目的:子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。重写的方法既可以操作继承的成员变量和方法,也可以操作子类新声明的成员变量和定义的新方法。但无法操作被子类隐藏的成员变量和方法。
  • 重写的注意事项:重写父类的方法时,不允许降低方法的访问权限,但是可以提高访问权限。(权限排序:public>protected>友好的>private)

八、super关键字

(1)super关键字的作用和使用:
子类一旦隐藏了继承的成员变量或方法,那么子类创建的对象就不再拥有该变量或方法,该变量就归关键字super所有。如下:

super.x//操作被隐藏的成员变量x
super.play()//调用被隐藏的方法

(2)使用super关键字调用父类的构造方法
当子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法。如果不明确指出使用父类的哪一个构造方法,就调用父类不带参数的那一个。
由于子类不能继承父类的构造方法,所以在书写子类构造方法时需要使用super关键字来调用父类的构造方法,而且super必须是子类构造方法的头一句。如果没有写super语句,那么默认地有:super ();
由于Java的无参构造器,当父类中定义多个构造方法时,应当包括一个不带参数的构造方法,以防子类省略super时出现错误。

class 父类{
    
    
	父类(构造方法){
    
    
		...;
	}
	...;
}

class 子类 extends 父类{
    
    
	子类(构造参数){
    
    
		super(构造参数);	//父类的构造方法
		...;			//构造方法
	}
}

九、final关键字

final关键字可以修饰类、成员变量和方法中的局部变量。
(1)final类
可以用final声明final类,final不能被继承。如下:

final class A{
    
    
	...;
}

(2)final方法
如果用final修饰父类的一个方法,那么这个方法不允许子类重写。(老老实实继承,不允许做任何篡改)

(3)final常量
用final修饰的成员变量和局部变量就是常量,声明时必须给出确定的值。

十、对象的上转型对象

定义一个父类对象,一个子类对象。把子类对象的引用放到父类对象中去,则这个父类对象叫做该子类对象的上转型对象。具有如下特点:

  • 上转型对象不能操作子类新增的成员变量(失去这部分属性),不能调用子类新增的方法(失掉一些行为)
  • 上转型对象访问的是子类继承或隐藏的成员变量和方法。如果子类重写了父类某个实例方法后,当上转型对象调用这个方法的时候,一定是调用子类重写后的实例方法。
  • 如果子类重写了父类的类方法,那么子类对象的上转型对象不能调用子类重写的类方法。只能调用父类的类方法。
  • 父类创建的对象 !=子类对象的上转型对象

十一、abstract类和abstract方法

用关键字abstract修饰的类和方法称为抽象类和抽象方法。对于抽象方法,只能声明,不能实现(即没有方法体),而且不允许使用final和abstract修饰同一个方法或类。也不允许使用static修饰abstract方法,即abstract方法必须是实例方法。

  • 抽象类中可以有抽象方法,也可以没有抽象方法。但是非抽象类不能有抽象方法。
  • 抽象类不能用new运算符创建对象。如果一个非抽象类是某个抽象类的子类,那么它必须重写父类的抽象方法,并给出方法体。如果一个抽象类时另一个抽象类的子类,它既可以重写父类的抽象方法,也可以继承父类的抽象方法。
  • 可以使用抽象类声明对象,尽管不能用new运算符创建该对象,但是可以通过让该对象成为其子类的上转型对象,那么该对象就可以调用子类重写的方法。

猜你喜欢

转载自blog.csdn.net/YCF8746/article/details/112758171