函数签名:函数名,函数参数的个数、类型以及顺序
封装
把属性声明为private私有化,对外提供public的getter和setter方法,封装增强了对属性的控制。
class person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
if (0 < age && age < 150) {
this.age = age;
} else {
this.age = 18;
}
}
public String getName() {
return name;
}
public void setName(String name) {
if (name.isBlank()) {
this.name = "Triagen";
} else {
this.name = name;
}
}
}
继承
子类继承父类非private的属性和方法,实现代码复用。子类不仅可以修改父类的方法,还可以添加自己的属性和方法。子类对父类方法的修改通过覆盖实现,覆盖要求子类和父类函数签名相同,子类返回类型和父类相同或者为父类返回类型的子类,且子类方法的存取权限不能比父类低,即父类方法为public时,子类方法不能为protected。
class Monster {
A frighten(int x) {
System.out.println("Arrrgh");
return new A();
}
}
class Vampire extends Monster {
B frighten(int f) {
System.out.println("a bite?");
return new B();
}
}
class Dragon extends Monster {
A frighten(int degree) {
System.out.println("breath fire");
return new A();
}
}
class A {
}
class B extends A {
}
多态
多态三要素:继承、覆盖、向上转型。子类继承父类的方法,对父类方法进行了覆盖重写,在调用时,将子类对象的引用赋给父类类型,父类类型在调用同一名称的方法时,因其具体指向子类的不同调用不同的方法。
public class HelloWorld {
public static void main(String[] args) {
Monster[] ma = new Monster[3];
ma[0] = new Vampire();
ma[1] = new Dragon();
ma[2] = new Monster();
for (int x = 0; x < 3; x++) {
ma[x].frighten(x);
}
}
}
class Monster {
A frighten(int x) {
System.out.println("Arrrgh");
return new A();
}
}
class Vampire extends Monster {
B frighten(int f) {
System.out.println("a bite?");
return new B();
}
}
class Dragon extends Monster {
A frighten(int degree) {
System.out.println("breath fire");
return new A();
}
}
class A {
}
class B extends A {
}
输出结果
a bite?
breath fire
Arrrgh
覆盖与重写
覆盖要求函数签名一致,子类返回类型和父类返回类型相同或者为父类返回类型的子类,且子类方法的存取权限不能比父类低。重写要求函数名相同,但函数签名不相同,对返回类型、存取权限并无限制。覆盖存在于子类继承父类,重写并无此类关系,同一类中就可以进行重写。