本文用来整理面向对象中 封装、继承、多态、抽象类、接口、内部类、代码块的关系
文章目录
一、面向对象的三大特性
1.封装
将类的某些信息隐藏在类的内部,不允许外部直接访问,只能通过类的对象使用该类提供的方法,实现对隐藏信息的操作和访问
“隐藏信息”:由private定义的方法变量
“该类提供的方法”:与变量相对应的get、set方法
使用“this”关键字
this代表当前调用方法的引用,this.成员变量 / this(成员方法)
2.继承
让类与类之间产生父子关系,可以使子类具有父类的属性和方法 class 子类 extends 父类{ }
- 子类继承父类后,直接使用的只有父类的非私有成员,想要访问私有变量要调用get,set方法
2-1 继承的特点
①只能单继承,不能多继承(只能有一个父类)
②支持多层继承,多层继承的非私有化成员可以进行传递
2-2 变量的访问特点
“就近原则”:子类方法中→子类中→父类
2-3“super”关键字
super与this的区别:
- this:代表对当前类的对象的引用【
this( )
访问本类的构造方法】 - super:(存在继承关系),代表对父类对象的引用【
super( )
访问父类的构造方法】
2-4方法重写(Override)
子类和父类有一样的方法声明(方法名、列表参数、返回值类型都有关)
注意事项:
- 私有方法不能被重写
- 子类方法访问权限不能更低(子>父)
- 静态方法不能被重写
权限修饰符:
重写和重载的区别:
- 重写:必须在继承关系当中,子类与父类出现相同的方法声明(名字、参数都一样)
- 重载:同一个类中,方法名相同,参数不同(与返回值无关)
3.多态
同一个对象不同时刻表现的不同形态
多态的三个必要条件:
有继承关系、有重写存在、有父类引用指向子类对象Fu f=new Zi()
二、抽象类→接口
1.抽象类
一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类
- 定义抽象类
public abstract class 类名{ } ;- 定义抽象方法
public abstract void 类名( ) ;
特点:
①抽象类不能被实例化
②抽象类可以有构造方法,但无法通过其实例化
③有抽象方法的必是抽象类,但抽象类可以普通方法、抽象方法共存
final关键字:
final代表“最终”的意思,可以修饰成员变量、成员方法、类
- 修饰类:代表该类不能被继承
- 修饰方法:代表方法不能被重写
- 修饰变量:表示该变量是常量,地址不可变(基本数据类型是常量,引用数据类型的引用不可变,不可以重新new一个对象)
2.接口
当一个类中所有方法都是抽象方法时,定义这个类为接口
- 接口的定义: public interface 接口名{ }
- 可以把接口看作父类来操作
- 接口的实现类的命名:接口名+impl ( implements )
- 接口的实现类
①要么将接口中的方法全部重写
②要么将其变成抽象类
③(jvm1.8/1.9后有更新)
2-1成员特点
①成员变量:默认是由“public static final
”修饰,只能是常量
②抽象方法
(没有构造方法,和非抽象方法)
2-2接口的默认方法
public default 返回值类型 方法名 (参数列表) { }
2-3接口中的静态方法
public static 返回值类型 (参数列表) { }
- 静态方法无法被重写
- 静态方法只能通过接口名调用
- public可省,static不可省
接口中的私有方法
① private 返回值类型 方法名 (参数列表) { }
② private static 返回值类型 方法名 (参数列表) { }
- 默认方法可以调用私有的静态和非静态方法
- 静态方法只能调用私有的静态方法
3.接口和抽象类
1.共同点
①都用于实现多态性
②都不能被实例化,只能被子类实现或继承
③都可以包含抽象方法,需要由子类提供具体实现
2.区别
- 语法上的区别:
接口使用interface;抽象类使用abstract - 实现方法:
一个类可以实现多个接口,但只能继承一个抽象类 - 成员变量:
接口只能定义常量(final),但抽象类可以有普通成员变量 - 构造函数:
接口没有构造函数,抽象类有 - 方法实现:
接口中的方法无方法体,都是抽象函数
抽象类中,抽象函数、正常函数都有 - 使用场景
接口适用于定义一组相关操作,强调行为规范
抽象类适用于定义通用的基础结构,强调子类的共性
Java中有多继承,接口可以多继承。但类中没有多继承
三、内部类
1.内部类
class 外部类名{
修饰符 class 内部名{
}
}
1-1创建对象
先创建外部类对象,再创建内部类对象
Outer.Inner i = new Outer( ) . new Inner
1-2内部类的访问特点
① 内部类可以直接访问外部类的成员变量(包括私有)
② 外部类要访问内部类成员,必须创建对象
1-3内部类的分类
内部类:在类中创建的类
成员内部类:在类中方法外
局部内部类:在方法中定义的类(要在方法内部创建对象并使用)
私有成员变量:private,外部无法访问
静态内部类:被static修饰,静态内部类只能访问外部类中的静态变量静态方法
匿名内部类:一种特殊的局部内部类 new 类名(){重写方法}
//匿名内部类
use方法名(new 方法名()){
重写方法
}
2.lambda
一种特殊的匿名内部类
函数式思想:重点在做什么 (形式参数)-> {代码块}
2-1使用前提
- 有一个接口
- 这个接口只有一个抽象方法
注意:
①Lambda表达式中的形参要跟接口中抽象方法的形参保持一致
②方法体中注意有无返回值的问题
2-2省略模式
- 参数类型可以省略
- 如果参数有却只有一个,小括号可以省略
- 如果代码块只有一条语句,“{ }”、“ ; ”、“return”可以省略