一.封装
体现方式:
方法、内部类、属性的私有化 — 将属性用private修饰,然后提供对外的get和set方法来获取或者设置属性,如果不想被外界访问,可不比提供方法给外界访问。
优势:提高代码的复用性。保证数据的合法性
public class Student{
private float score;
public void setScore(float score){
this.score = score;
}
public float getScore(){
return score;
}
}
二.继承
1.定义:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或类从父类继承方法,使得子类具有父类相同的行为。
2.继承类型: 需要注意的是 Java 不支持多继承,但支持多重继承。单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
3.继承的特性
子类拥有父类非 private 的属性、方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
//公共父类: Animal
public class Animal {
private String name;
private int id;
public Animal(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+"正在吃");
}
public void sleep(){
System.out.println(name+"正在睡");
}
public void introduction() {
System.out.println("大家好!我是" + id + "号" + name );
}
}
//子类:Dog
public class Dog extends Animal {
public Penguin(String myName, int myid) {
super(myName, myid);
}
}
//子类:Cat
public class Cat extends Animal {
public Mouse(String myName, int myid) {
super(myName, myid);
}
}
三.多态
1.定义:同一个对象在不同时刻体现出来的不同状态。
2.分类:
(1) 编译时多态:方法的重载
(2) 运行时多态:向上造型(用父类来声明,用子类来创建)、方法的重写(两等两小一大)
3.多态的前提:
A:有继承或者实现关系。
B:有方法重写。
C:有父类或者父接口引用指向子类对象。
4.多态中的成员访问特点
A:成员变量
编译看左边,运行看左边
B:构造方法
子类的构造都会默认访问父类构造
C:成员方法
编译看左边,运行看右边
D:静态方法
编译看左边,运行看左边
5.多态的好处:
A:提高代码的维护性(继承体现)
B:提高代码的扩展性(多态体现)
6.多态的弊端:
父不能使用子的特有功能,即子可以当作父使用,父不能当作子使用。
方法的重载
1.方法名一样,但参数不一样,这就是重载(overload)。
2.要求:函数名要一致。
形参列表不一致(形参的个数或形参 的类型不一致)
与返回值类型无关
方法的重写
1.子父类出了同名的函数,这个我们就称作为方法的重写。
2.要求:
(1)方法名与形参列表必须一致。
(2)子类的权限修饰符必须要大于或等于父类的权限修饰符。
(3)子类的返回值类型必须要小于或 等于父类的返回值类型。
(4) 子类的异常类型必须要小于或 等于父类的返异常类型。
3.使用原因:当父类的功能无法满足子类的需求时。
4.重写的前提: 必须要存在继承的关系
向上造型
父类类型的引用可以调用父类中定义的所有属性和方法,不能调用子类的.
创建父类对象时,调用的方法为父类方法;
创建子类对象时,调用的方法是子类重写的方法或继承自父类的方法;
//父类:动物类
public class Animal{
public int age;
public String name;
public void eat(){
System.out.println("动物具有吃东西的本领!");
}
}
//子类:狗类
public class Dog extends Animal {
public void eat(){
System.out.println("狗是吃肉的。");
}
}
//测试类
public class Test{
public static void main(String[] args) {
Animal ani1 = new Animal(); //父类的引用可以指向本类的对象
Animal ani2 = new Dog(); //父类的引用可以指向子类的对象
ani1.eat(); //输出动物具有吃的本领
ani2.eat(); //输出狗是吃肉的
}
}