面向对象特征封装、继承、多态
决定调用哪个重写的方法(多态在继承关系中的表现),是由new的创建的实例对象来决定的。
特别强调了:动态绑定 一个父类对象可以指向多个子类的现象。
引用数据类型:
抽象类和接口
java为了加强动态绑定,为了加强方法重写(为了加强多态),设计了抽奖类和接口
抽象类:(抽象类和抽象方法)
父类里面的抽象方法没有方法体(没有{ })
一个子类继承抽象父类,必须要方法重写
这个类定义成抽象,这个类不能实例化。可以有构造函数
抽象类一定依赖子类完成实例化。
抽象类一定要去动态绑定。
抽象类是用abstract关键字修饰的,不能实例化,不能去new创建对象;
抽象类可以有构造函数,提供给子类的构造函数完成依赖
抽象类可以有抽象方法,也可以没有抽象方法
一般来说:抽象类提供设计抽象方法,给子类继承,就是为了方法重写。
如果一个类有抽象方法,这个类肯定是抽象类。
abstract和static不能同时修饰一个方法
输入的一个例子:
输入验证码:
抽象类可以有构造函数:
.this.b表示当前类(test),b是Base类里的,所以不能用this。
接口:接口是完全的抽象类,它不能实例化,不能有构造函数,不能有实例方法。里面只有抽象方法(static可以省略)。 依赖子类完成实例化。
作用:Java为了加强动态绑定,为了加强方法重写(为了加强多态)
例子:
动态绑定
接口中所谓的变量,不是变量,是常量。 final int a = 10; final 可以省略。 final static int a = 10;(可用static)
抽象类和接口一定是父类,一定是被子类继承和实现。
接口中所谓的变量,不是变量,是常量。
接口中的方法都是要被重写的,所以方法不能修饰成private,protected
抽象类和接口作用是一样的
何时定义成抽象类?何时定义成接口? 优秀考虑级别
*
* 1. 抽象类设计的参考是:子类是同一类型 学生 老师 学生类型和老师类型是不是同一类。 子类 is 父类 建议考虑是抽象父类 是true。
*
*
* 2. 接口设计的参考是: 接口父类 has 包含 子类 功能 人 run() 汽车 run() 球 run()
*
抽象类和接口区别,统一描述
*
* 共同点:
* 1. 都不能实例化,都不能new。
* 2. 作用:为了加强动态绑定,为了加强方法重写,就是为了加强多态。
* 3. 接口和抽象类都是父类,都是被继承和实现的。
*
* 不同点:
* 1. 接口中定义都是常量final,抽象类不是。
* 2. 抽象类可以有构造函数,接口不可以有构造函数
* 3. 接口中一定有抽象方法,抽象类可以有抽象方法,也可以没有。
* 4. 子类继承抽象类extends关键字,子类实现接口implements关键字
* 5. 继承只能单继承,接口可以多实现(多继承),多个父类。
extends只能有一个父类 implements 可以有多个父类
只能直接继承一个父类,可以实现多个父类
Java的多继承是通过接口来实现的。
(java8版本中)
函数式接口:这个接口中只能定义一个方法 (为了面向函数式编程加入的)
lambda表达式:
java从子类实现接口模式 简化成 一个表达式,函数式表达式,lambda表达式 ,箭头表达式
lambda与下面功能相同
lambda表达式实现加减:
底层代码:
内部类:
作用就是为了加强封装, 一个类中嵌套一个类
内部类总共4个表现形式:
1. 普通内部类
2. 静态内部类
3. 局部内部类
4. 匿名内部类
普通内部类:
1.普通内部类Inner中不能定义关于static
静态内部类:
可以定义全部,但是注意使用this关键字
匿名内部类:
没有class关键字,没有名字的类,也被lambda取代
局部内部类:
在一个方法中可以定义类,必须预留访问的入口。