系统学习JAVA第十二天
一、抽象类和接口的异同
1、类和类是单根继承,继承了类就拥有了什么特征,成为了什么——is-a
类拥有:属性、setget、构造方法、静态代码块、代码块、可以有也可以没有抽象方法
类是具有相同特征和行为的一类事物
抽象类可以通过匿名内部类进行实现
匿名内部类,可以实现多个抽象方法
抽象类补充:
一个类继承了抽象类,报错的解决方式:要么重写抽象类中的方法,要么把自己声明为抽象类
(抽象类也是类,遵守单根继承)
2、接口——注重的是方法 ,实现了接口就拥有了什么功能 ——has-a
接口可以多实现,拥有常量和抽象方法,在jdk1.8开始才能有方法体
接口可以通过匿名内部类进行实现,还可以通过lambda表达式
Lambda 表达式的格式:
(要实现的方法 是不是又参数 ---------参数的位置)->{实现方法要写的代码}
方法调用时再传入具体的数据
//jdk1.8 lambda 表达式 接口中 替代匿名内部类的
Shape s = new Shape() {
@Override
public void area() {
System.out.println("匿名内部类对接口的实现。。。。");
}
};
//方法调用
s.area();
// 方法的实现
Shape s1 = ()-> System.out.println("Lambda表达式替换匿名内部类对接口的实现。。。。");
//方法调用
s1.area();
如果方法有参数 就必须在()写上对应个数的参数,并且数据类型可以省略
Shape s = (a,b)-> System.out.println(a);
如果没有参数 则必须写一个空()
Shape s1 = ()-> System.out.println("Lambda表达式替换匿名内部类对接口的实现。。。。");
方法是否有返回值,如果有且代码只有一句 则{} 和return都可以省略
Shape s3 = (a)->a;
方法如果没有返回值 且代码只有一句 则{} 可以省略
Shape s4 = (int a)-> System.out.println("hhh"+a);
①接口和类的应用场景:
多个类之间有共同特征————继承
框架,面向接口的开发————接口
写项目,设计模式————面向接口 书写实现类
②接口类型:
1 普通接口
一个类实现一个接口,要么重写接口中的抽象方法,要么声明成抽象类不用重写方法,接口拥有:常量、抽象方法,在JDK1.8之后关键词default和static修饰的方法可以出现方法体
2 标记接口
例如:序列化接口
实现了序列化接口就被标记,具有了序列化的功能
3 注解接口
Public @interface Override {}
③注:
Lambda表达式对接口实现,接口中只能有一个抽象方法
接口默认的方法都是抽象方法
二、static
static优先分配内存,类加载时进行的分配内存空间
1、 static可以修饰
①全局变量——类变量
②自己定义的方法——类方法(static修饰的方法不能进行方法重写)
③静态代码块
格式:
static{}
静态代码块 不用我们手动调用执行 ,随着类的加载(当我们使用一个类就会被加载 ),自动执行 只执行一次(以后遇到在类加载时 只执行一次的代码 放到静态代码块中)
如何使用一个类?
1 创建了这个类的对象
2 main方法所在的类 默认被加载
3 类调用了类变量或者类方法
类和类之间继承关系, 父类和子类谁先加载?
父类先加载,子类后加载;类和子类都有静态代码块,父类先执行
引申:构造代码块
格式
{}
在类中直接写了一个{}就是构造代码块,在构造方法执行前默认执行的一段代码,只要使用了构造方法 ,就会在构造方法前执行这段代码。
在有继承关系的类中,静态代码块、构造代码块、构造方法执行顺序:
父类的静态代码块
子类的静态代码块
父类的构造代码块
父类的构造方法
子类的构造代码块
子类的构造方法
2 、static不可以修饰
①类
②局部变量
③getset方法
④构造方法
⑤抽象方法
注:
JDK 1.8 的版本中出现了新的关键词,default可以修饰方法,抽象方法可以有方法体;同时在这个版本后static,也能让抽象方法拥有方法体
default void a(){}
static void b(){}
三、final
1、final可以修饰
final最后的、最终的————不改了————只读(有值可读)
①普通类(final修饰的类不能被继承)
②全局变量
给全局变量赋值的方式:
1 直接定义变量时,给final的变量赋初值
2 在使用final修饰的变量前,给变量赋初值就可以,{}构造代码块,使用对象之前执行的代码
3 构造方法中赋值
③局部变量
④getset(但是我们一般不会这么用)
⑤自己定义的方法(final修饰的方法不能被重写)
2、final不可以修饰
①构造方法
②抽象方法
③抽象类
四、static final
static final修饰的变量——值不能在修改 = 常量
1 、基本数据类型
基本数据类型的值不能改变
static final int A = 10 ; //A是常量不可变,用大写字母表示常量
2 引用数据类型
引用数据类型的地址不能改变,但是值可以改变
static final int[] A = new int[10]; //A地址,地址不可变,里面的内容(值)可以变