封装
- 将程序封装到类中,通过权限修饰符[ private / default / protected / public ]进行访问权限限制
继承
关系
【类与类】
隐藏:子类通过[super]关键字访问父类构造方法
【抽象类与抽象类】
【抽象类与类】
【抽象类与接口】
【接口与接口】
【接口与类】
优点:公共代码作用域提升并合并,统一管理,提高复用性
缺点:类是单继承的,继承侵略性强,提高耦合度
同名成员如何区分访问
[this]代表当前类
[super]代表当前父类
注意:this()和super()不能同时出现在构造方法中,保证初始化所以必须方到第一行,二者不可共存;
就近原则访问特点
【变量】: [ 局部变量->this.成员变量->super.对象类父类 ]
【方法】: [ 成员方法->父类成员方法 ]
【静态】:父类与子类继承,类加载阶段静态会完全开辟两片空间,不建议子类实例获取父类静态上下文
抽象
- 多个类存在 “方法体相同的方法” 与 “不同方法体但方法声明相同的方法”,共性代码抽取到父类中,“方法体相同的方法” 子类通过继承获取,“不同方法体但方法声明相同的方法”无法实现使用abstract修饰,其实现应交给子类。
- 抽象类不一定有抽象方法,但是有抽象方法一定是抽象类
- 子类可以成为抽象类的实现子类,也可以成为抽象类的抽象子类
模板模式
public abstract class ContentTemplate {
public void before(){
System.out.println("文章开头");
}
public abstract void content();
public void after(){
System.out.println("文章结尾");
}
public void totalContent(){
before();
content();
after();
}
}
接口
成员变量:public static final
构造方法:已禁用
成员方法:public abstract
jdk8为了解决接口方法升级的问题加入了[default]与[static]修饰则可以有方法体
访问父类方式变动
public class ImplClass interface InterfaceA,InterfaceB{
public void classMetho(){
InterfaceA.super.method();
InterfaceB.super.method();
}
}
注意:多实现冲突问题,实现的子类必须对多接口冲突的方法进行重写@Override
多态
【类与类】
【类与抽象类】
【接口与接口】
匿名对象
public class Test {
public static void main(String[] args) {
polymorphism(new Cat());
polymorphism(new Dog());
System.out.println();
}
public static void polymorphism(Animal animal){
animal.method();
}
}
运行时机
类存在继承关系,会出现两种重写模式,实现接口重写,继承父类重写,由于重写覆盖的缘故。
成员变量编译看左边,运行看左边。
成员方法编译看左边,运行看右边。
注意:强制类型转换 使用[ instanceof ] 关键词进行类运行时类型效验
代码块
>静态代码块
public class CodeBlock{
static{
System.out.println("在类加载阶段将会被初始化");
}
}
>构造代码块
public class CodeBlock{
{
System.out.println("触发构造函数时,构造代码块优先执行被初始化");
}
}
注意:构造代码块和构造函数容易混淆,两个不同
>局部代码块
public class CodeBlock{
public void method(){
{
System.out.println("方法内短暂的存在,不会太长时间占用内存");
}
}
}
代码块运行顺序
可变参数
- 最大特点:调用可变参数的方法时,传递的参数数量没有上限和下限。最骚的是你可以传参一个数组。
- 底层:数组
- 注意:必须放形参最后
- 使用:需要用方法参数名[索引],如: args[0]
public static void method(Object...args){
// 获取可变参数数组长度
int lenght =args.lenght
// 根据长度通过索引获取元素
args[0];
args[1];
}