1 继承
1.1 何为继承
▪ 继承是利用现有的类创建新类的过程,现有的类称作基类(父类)(超类),创建的新类称为派生类(子类),派生类可以拥有所有基类的非私有的属性和方法。
1.2 继承的规则
▪ 子类不能直接访问父类中私有的成员方法和变量,但是可以通过get和set获得。
▪ java支持单继承,不支持多继承。
▪ 一个子类只能有一个父类,但是一个父类可以有多个子类。
▪ 子类继承了父类,就继承了父类的方法和属性。
▪ 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。
▪ 继承的关键词是extends。
语法:
class Xxxxx extends Zzzzzz{ }
代码示意
public class Drink {
abstract void taste();
int t; //咖啡
int p; //啤酒
int q; //牛奶
public static void getDrink(int drinkType) throws DrinkNotFoundException { //声明异常
if ( drinkType<1||drinkType>3){
throw new DrinkNotFoundException("请输入正确的编号");
}
switch (drinkType) {
case 1:
System.out.println("咖啡");
break;
case 2:
System.out.println("啤酒");
break;
case 3:
System.out.println("牛奶");
break;
default:
break;
}
}
public class Milk extends Drink{
@Override
void taste() {
// TODO Auto-generated method stub
System.out.println("纯的");
}
}
public class Coffee extends Drink{
@Override
void taste() {
// TODO Auto-generated method stub
System.out.println("咖啡不错");
}
}
public class Beer extends Drink {
@Override
void taste() {
// TODO Auto-generated method stub
System.out.println("有点醉");
}
}
上面代码中Beer,Coffee ,Milk都继承了Drink。
public class Beer extends Drink,Coffee{}(这种写法是错误的),java中不允许多继承。
2 方法的重写(override/overwrite)
2.1 定义
▪ 在子类中可以根据需要对从父类中继承来的方法进行改造,也称
为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
2.2 要求
▪ 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
▪ 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
▪ 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
▪ 子类不能重写父类中声明为private权限的方法
▪ 子类方法抛出的异常不能大于父类被重写方法的异常
▪ 子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
上面代码中taste方法就进行了重写。
3 super关键词
▪ super可用于访问父类中定义的属性
▪ super可用于调用父类中定义的成员方法
▪ super可用于在子类构造器中调用父类的构造器
▪ 尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员
▪ super的追溯不仅限于直接父类
▪ 子类中所有的构造器默认都会访问父类中空参数的构造器
▪ 当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器。同时,只能“二选一”,且必须放在构造器的首行
▪ 如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错
public class Person {
private String name;
private int age;
private Date birthDate;
public Person(String name, int age, Date d) {
this.name = name;
this.age = age;
this.birthDate = d;
}
public Person(String name, int age) {
this(name, age, null);
}
public Person(String name, Date d) {
this(name, 30, d);
}
public Person(String name) {
this(name, 30);
}
}
public class Student extends Person {
private String school;
public Student(String name, int age, String s) {
super(name, age);
school = s;
}
public Student(String name, String s) {
super(name);
school = s;
}
// 编译出错: no super(),系统将调用父类无参数的构造器。
public Student(String s) {
school = s;
}
}
子类对象的实例化过程