面向对象特性
封装,继承,多态,抽象
封装
本质
对事物/对象的属性进行包装
概念
把对象的所以组成部分组合在一起或 使用访问控制修饰符将数据隐藏。
作用
适当的封装可以使代码更容易理解和维护,加强代码安全性。
继承
本质
为类复用的一种语法结构
目的
代码重用
语法
class 子类名 extends 父类名{}
注意
- Java中只支持单继承,并且是链式继承(不能形成闭环继承)
- Java中必有根类:object;如果一个类没有显示继承其他类,那么该类默认继承Java.lang.Object
public class SupClass {
public void m1() {
}
public void m2() {
}
}
public class SubClass extends SupClass {
public void m3() {
}
}
多态
多态涉及到了软件设计六大原则里面的里氏替换原则:能够使用父类的地方,一定可以使用子类。
本质
父类引用指向子类对象
前提条件
在继承关系里面
多态的形式
- 局部/成员变量:直接声明,父类 变量名 = new 子类();声明是父类,赋值是子类。
- 实参/形参:参数列表是父类,调用是子类。
- 返回值:声明是父类返回子类对象
多态发生的时间
多态发生在赋值时候
缺点
丢失子类特有属性
- 如果父类没有,不能访问
- 父类有的成员方法,子类也有,覆写,执行子类
- 父类有的成员方法,子类没有,执行父类
- 如果父类有非成员方法,不管子类有没有,执行父类
Sup s=new Sub();
// 父类非成员方法
System.out.println(s.i);
// 子类独有,不能用多态访问,编译报错
// System.out.println(s.a);
// 父类和子类都有的成员方法,覆写,执行子类
s.m1();
// 父类有,子类没有覆写的,执行父类
s.m2();
// 没有编译报错 ,证明 多态发生在赋值的时候
// Sup sup=null;
// sup.m1();
// System.out.println(sup.i);
}
}
class Sup{
int i=10;
public void m1() {
System.out.println("父类成员方法");
}
public void m2() {
System.out.println("父类成员方法2");
}
}
class Sub extends Sup{
int i=20;
int a=3;
public void m1() {
System.out.println("子类成员方法");
}
}
抽象
本质
根据具体事物抽象出来的概念/标准,与之对应的是类和接口。
抽象类定义
用abstract修饰的类
抽象方法的定义
用abstract修饰的方法,没有{}
抽象类的目的
让类不能被实例化,只能用于继承
注意
- 含有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法
- 抽象类不能被实例化对象,但是抽象类有构造方法,用于子类实例化对象。
- abstract和final不能同时修饰。final修饰的抽象类不能被继承,而abstract修饰的类就是用来继承的。
- 一个类继承抽象类,那么这个类要么实现所有的抽象方法;要么实现部分或者不实现抽象方法,那么这个类也要被abstract修饰,它也是一个抽象类。
abstract class A{
public void eat() {
System.out.println("这是一个抽象类");
}
// 抽象方法
public abstract void move();
public abstract void add();
public abstract void delete();
public abstract void load();
A(){
System.out.println("A的构造方法");
}
}
abstract class B extends A{
}