基本概念
可以实现现有类的所有功能并且在无需重新编写原有类代码的情况下继承进行功能上的扩展(可重用)
class 父类 {
}
class 子类 extends 父类 {
}
判断两个类之间能否使用继承:isa
-
Java中类继承使用extends关键字
-
子类派生类,父类称为超类/基类
class Person{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Student extends Person{
//定义了一个子类
private String school; //扩充的新属性
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.setName("Steven");
student.setAge(18);
student.setSchool("高新一中");
System.out.println("姓名:"+student.getName()+",年龄:"+student.getAge()+",学校:"+student.getSchool());
}
}
继承的限制&约束
- 子类对象实例化前首先调用父类构造方法产生父类对象后在调用子类构造方法实例化子类对象
- Java只允许单继承,不允许多继承(Java的单继承局限)。要想在Java中实现类似的“多继承”,要么多层继承,要么使用内部类
显示继承&隐式继承
在继承时,子类会继承父类所有结构(包含私有域与其他属性、方法)
- 显示继承:所有非私有操作属于显示继承(可以直接调用)
- 隐式继承:所有的私有操作属于隐式继承(不可以直接调用,需要通过其他形式调用)
super关键字
用于方法
用于构造方法
- 当子类调用父类无参构造时,super()可写可不写,表示调用父类无参构造
class Person{
public Person(){
System.out.println("父类无参构造");
}
}
class Student extends Person{
public Student(){
//super() ; //此语句在无参时写于不写一样
System.out.println("子类无参构造");
}
}
public class Test{
public static void main(String[] args) {
new Student();
}
}
- 当子类调用父类有参构造时,super(参数列表)必须要写,要告诉编译器当前调用的是哪个有参构造
class Person{
public Person(String name){
System.out.println("父类有参构造");
}
}
class Student extends Person{
public Student(String name){
super("张三") ;
System.out.println("子类有参构造");
}
}
public class Test{
public static void main(String[] args) {
new Student();
}
}
- 子类构造方法中调用父类构造必须是第一行语句
- this与super不能同时调用
用于普通方法
super.方法名(参数)
,用于在子类中明确调用父类被覆写的方法,不用放在第一行。
用于属性
super.属性名
,表示调用父类中被覆写的属性(权限不是private)
super与this的区别
final关键字----终结器
修饰类(String类以及8大基本数据类型的包装类,Integer)
-
当一个类被final修饰,表示该类不能拥有子类(该类不能被继承)
-
一旦一个类被final修饰,该类的所有方法都会默认加上final(成员变量不会加final)
修饰方法
-
一个方法被final修饰,明确表示该方法不允许被覆写
-
当一个方法被private修饰后,相当加了一个final关键字
修饰属性—常量
final修饰普通数据类型的成员变量(最主要的用途)
被final修饰的成员变量必须在声明时初始化(或者构造块/构造方法中初始化),并且初始化后值无法被修改
class Person{
public final int a = 10;//声明时初始化
public final int b;
public final int c;
public Person(){//构造方法初始化
b = 5;
}
{
c = 20; //构造块初始化
}
}
public class Test{
public static void main(String[] args) {
System.out.println(new Person().a);
System.out.println(new Person().b);
System.out.println(new Person().c);
}
}
final与static的区别
- final 变量—常量
值不能改变,每个对象都有自己的final变量,在对象产生时初始化
- static final 变量—全局变量
所有对象共享此变量,并且在类加载时初始化(或者静态块初始化),效率较高,通过类名调用