封装
概念
通过 private 修饰,使其只能在本类中访问(合理隐藏)
提供set/get方法,用于成员变量的 赋值/获取 (合理暴露)
构造方法
作用:
初始化对象,主要是初始化成员变量,new的时候调用对应的构造方法
特点:
方法名和类名一样,没有返回值,也没有void
注意事项:
所有的类都有构造,如果不写,有默认的无参构造,写了则没有默认的,实际开发中,无参和有参都要定义
this关键字:
this代表当前对象引用,区分成员变量和局部变量,通过它可以访问当前对象的成员。
继承
概念
通过 extends 关键字,让类与类之间产生父子关系,子类自动拥有了父类的属性和方法。
有利于提高代码的复用性。
定义格式:
class Fu{} //父类
class Zi extends Fu{} //子类
特点
支持单继承,不支持多继承,可以多层继承
继承中成员访问特点
遵循就近原则变量:局部 –> 本类成员位置 –> 父类成员位置 方法:本类成员方法 –> 父类成员方法
方法的重写
子类中出现了和父类方法名,参数列表一模一样的方法,该现象称为方法的重写
私有和静态不存在重写。
子类权限>=父类权限 父类返回值>=子类返回值类型
super
父类标识,通过它可以访问父类成员
抽象类
概念
被abstract 修饰的类就是抽象类
被abstract 修饰的方法就是抽象方法
被abstract 修饰的接口就是抽象接口
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类是做特殊父类出现的,表示多个子类共性方法不具体,不具体用抽象表达
定义格式:
修饰符 abstract 返回值类型 方法名(...); //abstract修饰且{}方法体没有了。
特点
一个类中如果有抽象方法,那么这个类就是抽象类。
抽象类有构造,但是不能直接创建对象。
抽象类的使用是为了让子类继承,从而去实现抽象方法。限制子类有这个方法且要重写。
类继承抽象类后子类必须要实现所有抽象方法,否则是一个抽象子类。
接口
概念
接口是一种特殊的结构,最初设计 里面只能有常量和抽象方法。可以说接口是一个规范。只定义方法没有给实现。
定义格式:
修饰符 interface 接口名{
public static final 数据类型 常量名 = 值;//修饰符 是默认存在
public abstract 返回值类型 方法名(..);// 修饰符 是默认存在的
}
class 类名 implements 接口名{ 所有的抽象方法都要实现 } //子类要实现所有抽象方法,否则是一个抽象子类。
不能直接使用,没有构造,不能创建对象。是为让类来实现,因为它里面定义的称为规范,类去实现规范。
接口和类之间的关系
类和类之间存在继承关系:只能单继承,不能多继承,可以多层继承。
类和接口间存在实现关系:可以单实现,可以多实现。
接口和接口之间存在继承关系:可以单继承,可以多继承。
模板方法设计模式
解决什么问题?
解决方法中存在重复代码的问题。
当系统中出现同一个功能多处在开发,而该功能中大部分代码是一样的,只有其中部分可能不同的时候。
怎么设计?
1、定义一个抽象类。
2、在里面定义2个方法
一个是模板方法:把相同代码放里面去。
一个是抽象方法:具体实现交给子类完成。
多态
多态的概念
同一个对象 表现的多种形态。
基本格式:
父类类型 变量名 = new 子类();
多态的前提
1:有继承/实现
2:方法重写(重写之后调用子类的)
3:父类引用指向子类对象。(格式)
多态的转型
//自动向上转型 --> 子转父
父类类型 变量名 = new 子类(); //自然而然发生
//强制向下转型 --> 父转子
子类类型 变量名 = (子类类型)父类引用; //强制发生
//注意:完成向下转型时 原来什么类型就转换成什么类型,否则会出现 类型转换异常。
多态好处
提高代码的复用性和扩展性
多态的弊端
多态情况下,只能调用父类定义的方法,无法调用子类特有方法。
如果想要调用子类特有方法就进行强转!!
//强转之前进行判断
if(父类变量 instanceof 子类){
子类类型 变量名 = (子类类型)父类引用;
}
//jdk14之后
if(父类变量 instanceof 子类 变量名){
}