面向对象(oop Object Oriented Programming)
特点:封装,继承,多态
封装:属性私有化,行为的公开化 - 目的是为了将一段逻辑封装在一个方法或者是类中,便于其他对象的调用。
继承:目的是为了子类去拓展父类的功能以及直接调用父类的非私有的内容,优点:节约代码。
Java支持单继承!
多态:一个对象多种形态。贯穿于整个面向对象的编程
实现多态(多态的体现):
向上造型:父类的引用指向子类的对象
向上造型以后只能点出父类的方法,但是方法的最后执行的结果是子类中重写父类方法的结果
向下转型:其实就是强制类型转换 - 父类到子类/大类型到小类型不推荐
编译期和运行期:
编译器:绑定以及检查语法 - 在向上造型中看的是父类的引用(等号左边)
运行期:创建对象,调用方法中的内容 - 在向上造型中看的是子类的对象(等号右边)
重载 - 编译器多态
重写 - 运行期多态
abstract(抽象)
抽象类:不能被实例化,但是有构造方法,抽象类本身就是给子类继承的。
子类继承父类的时候必须实现父类的所有的抽象方法,如果没有全部实现,那么子类还是一个抽象类。
抽象类不能使用final修饰。
抽象方法:没有方法体。必须在子类中被重写,可以重载,不能使用static,final,private修饰。
interface(接口):
接口其实就是一个特殊的抽象类,他的抽象高度要高于抽象类!没有构造方法。
类与接口是实现关系,使用的是implements关键字。类在实现接口的时候需要重写接口中的所有的抽象方法,如果没有全部重写,那么这个类就是抽象类
在jdk8.0之前,接口中只定义常量和抽象方法,之后可以定义默认的方法,使用default修饰的方法,也可以定义静态方法
注意:
- 接口与类之间是多实现,接口与接口之间是多继承(单根性的拓展)
- 作用:作为模板或者是协议,约束使用功能。
方法的重载和重写:
重载:方法名相同,参数列表不同,返回值不影响。是程序中的编译器根据参数来绑定的(方法名加参数列表等于签名)
重写:方法名和参数列表相同,返回值相同(当子类与父类之间产生方法重写的时候,子类的返回值不能大于父类),权限修饰符不能使用private,也不可以使用final修饰,不能用static修饰
final:
修饰方法 - 该方法不能被重写
修饰类 - 该类不能被继承
修饰属性 - 不能被再次赋值
基本类型的变量 - 只能赋值一次
引用类型的变量 - 指向(地址值)只能赋值一次,但是对象的内容可改变
static:
表示静态资源,好处是优于main方法执行的,保存在内存中的方法区中。
static修饰成员变量,全局共享一个(只有一份)。
通常static用于加载静态资源的使用 - 静态代码块
内部类:
种类:成员内部类,方法内部内,匿名内部类,静态内部类
除了静态内部类以外,其余的内部类中都不允许定义静态的变量和静态方法 - 了解。
内部类和匿名内部类的作用:都是为了节约代码 - 通常内部类是为了外部类服务的,用完就不再用了
匿名内部类本质上是实现了对应的接口或者是继承了对应的类,所以任何一个接口都可以产生匿名内部类,任何一个可以被继承的类都可以产生匿名内部类。
权限修饰符:
public - 所有的区域都可以访问(公开的)
protected - 本类以及子类中可以访问(子类和父类可以不在一个包下)
默认 - 本类以及同包类
private - 只能在本类中被访问,子类中只能继承过去,但是不能被访问
构造函数:
作用:初始化全员参数
语法:方法名与类名完全一致(包括大小写),没有返回值类型,权限修饰符没有限制,构造函数支持重载,子类在继承父类的时候会自动调用父类的无参构造函数,然后再实例化自己,通过构造函数的第一行的super()调用,所以我们在创建实例对象的时候必须同时定义无参和有参构造函数,因为直接定义有参构造会将无参构造覆盖。构造函数被重写没有任何意义。
this和super:
this - 表示本类 - 哪个对象正在被调用,那么this就是这个对象
this. - 调用本类中的内容(属性,方法)
this( ) - 调用本类中的构造方法(如果传参就调用对应的有参的构造)
super - 表示父类 - 一般使用这个关键字表示父类中的内容
super. - 调用父类中的内容(属性,方法)
super( ) - 调用父类中的构造方法(如果传参就调用对应的有参的构造)