面向对象的本质就是:以类的方式组织代码,以对象的组织(封装)数据
方法回顾 静态方法面向对象的三大特性:继承、封装、多态
从代码的角度,先有类后有对象
静态方法可以使用类名进行调用方法
非静态方法非静态方法,必须使用对象来进行调用
方法调用- 两个普通方法之间可以互相调用
- 两个静态方法之间可以互相调用
- 静态方法不能调用非静态方法
(原因:静态方法随着类加载而产生,非静态方法和对象有关,类实例化之后才存在,一个存在的东西调用一个不存在的东西是不可以的)
类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物
对象是抽象概念的具体实例
构造器的作用:
- 使用new关键字创建对象,本质是在调用构造器,另一个作用是用于初始化值
- 一旦定义了有参构造,如果想使用无参构造,就必须显式定义无参构造函数
程序设计的要求:高内聚,低耦合
封装(数据的隐藏):
应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息的隐藏
记住一句话:属性私有;get / set
继承 注意点封装的意义
提高程序的安全性,保护数据
隐藏代码的实现细节
统一接口
系统可维护增加了
- 使用关键字extends
- 继承的关系是两个类,一个为子类(派生类),一个为父类,子类继承父类
- 子类继承父类,就会拥有父类除私有方法和属性以外的全部方法和属性。
- 在java中,所有的类都直接或者间接继承Object类
- Java中是单继承,没有多继承
注意点
- super是调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中
- super和this不能同时使用
super VS this
- 代表的对象不同【this:本身调用者这个方法;super代表父类对象的引用】
- 前提:【this:没有继承也可以使用;super只有在继承条件下才可以使用 】
- 构造方法:【this();本类的构造;super();父类的构造】
在继承关系中,调用子类的无参构造方法,默认先调用父类的无参构造方法。如果显示调用,必须写在子类无参构造函数的第一行
父类没有无参构造方法,则子类也没有办法写无参构造函数
方法重写子类可以通过super关键字调用父类公有的属性和方法
重写都是方法的重写,和属性无关
继承关系中的静态方法,方法的调用只和左侧定义的数据类型有关
继承关系下,公有的非静态方法可以进行方法重写,结果为方法重写后的结果
方法重写:
- 需要有继承关系,子类重写父类的方法
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大,但不能缩小 public>protected>default>private
- 抛出的异常:范围可以被缩小,但是不能被扩大 ClassNotException() ---->Exception
重写:子类的方法和父类必须一致,方法体不同
为什么需要重写?
- 子类不一定需要,或者不一定满足!
是同一个方法因为传入对象不同呈现不同的行为
多态存在的条件- 有继承关系
- 父类引用指向子类对象
- 子类重写父类的方法
- 多态是方法的多态,属性没有多态
- 父类和子类有联系,类转换异常 ClassCastException
- 多态存在的条件: 有继承关系 有方法的重写 父类引用指向子类对象
static方法属于类,不属于实例
final修饰的是常量不能重写
private修饰的方法,不能重写
1.父类引用指向子类对象
2.把子类转为父类,向上转型,向上转型可能会丢失子类的一些方法
3.把父类转为子类,向下转型,强制转换
4.方便方法的调用,减少重复的代码,简洁
静态属性和静态方法可以直接通过类名来进行调用
非静态属性和方法需要通过对象来进行调用
非静态方法可以调用静态方法
静态方法可以调用静态方法,不可以调用非静态方法
- 不能new对象,只能靠子类去实现它,约束!
- 抽象类中可以写普通方法
- 有抽象方法一定是抽象类,抽象类不一定有抽象方法
- 一个类继承了抽象类,要么实现抽象类中全部抽象方法,要么继续为抽象类
1.抽象类存在构造器吗
抽象类中可以有构造器,虽然不能new对象,但是可以让子类使用
2.抽象类存在的意义
将一些代码抽象出来,提高开发效率
1.接口是一种约束
2.定义一些方法,让不同的人实现
3.接口中的方法都是被 public abstract 修饰的
4.接口中的属性都是被 public static final修饰的
5.接口不能被实例化,因为接口中没有构造方法
6.implements可以实现多个接口
7.实现类必须要重写接口中的方法
成员内部类可以访问外部类的属性和方法(包括公有和私有)
静态内部类只能访问外部类中静态的属性和方法
匿名内部类没有名字初始化类,不用将实例保存到变量中
局部内部类是在一个类的方法中再定义一个类。
局部内部类要在外部类的成员方法中初始化对象。
在外面初始化外部类对象,使用这个对象调用外部类的成员方法,同时内部类的成员方法也被调用



