| 修饰符 | 当前类 | 同包 | 子类 | 其他包 |
|---|---|---|---|---|
| private | ✅ | |||
| default | ✅ | ✅ | ||
| protected | ✅ | ✅ | ✅ | |
| public | ✅ | ✅ | ✅ | ✅ |
super:它引用当前对象的直接父类中的成员
用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
this:它代表当前对象名
在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名
super()和this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类内调用本类的其它构造方法。
super()和this()均需放在构造方法内第一行。
this只能调用一个构造器。
this和super不能同时出现在一个构造函数里面
因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
this()和super()都指的是对象,所以,均不可以在static环境中使用。包括: static变量,static方法,static语句块。
从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
面向对象易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
面向过程性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源
封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
继承:继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承可以提高代码复用性。继承是多态的前提。
关于继承如下 3 点请记住:
多态:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性
方法重载(overload)
编译时的多态性(也称为前绑定),发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回 类型进行区分。
方法重写(override)
运行时的多态性(也称为后绑定)。发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。
Java实现多态有三个必要条件:继承、重写、向上转型。
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的 方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
单一职责原则
SRP(Single Responsibility Principle)
类的功能要单一
开放封闭原则
OCP(Open-Close Principle)
一个模块对于拓展是开放的,对于修改是封闭的。
里式替换原则
LSP(the Liskov Substitution Principle LSP)
子类可以替换父类出现在父类能够出现的任何地方。
依赖倒置原则
DIP(the Dependency Inversion Principle DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
接口分离原则
ISP(the Interface Segregation Principle ISP) 设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。
抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。
从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
相同点:
不同点:
| 抽象类 | 接口 | |
|---|---|---|
| 声明 | abstract | interface |
| 实现 | extends,如果子类不是抽象方法,需要提供抽象类中所有声明方法的实现 | implements,需要提供接口中所有声明方法的实现 |
| 构造器 | 可以有 | 不可以有 |
| 访问修饰符 | 任意 | 默认public,不允许private、protected |
| 继承 | 单继承 | 多继承 |
| 字段声明 | 任意 | static、final |
| 成员变量 | 局部变量 | |
|---|---|---|
| 作用域 | 整个类 | |
| 存储位置 | 堆 | 栈 |
| 生命周期 | 随对象 | 方法/语句结束 |
| 初始值 | 有 | 无,使用前需赋值 |
public class Outer {
private int age = 12;
class Inner {
private int age = 13;
public void print() {
int age = 14;
System.out.println