三个修饰符
一、abstract
-
什么是抽象类:被abstract修饰的类
-
什么样的类应该被定义为抽象类
1)被当成父类
2)不会创建对象
创建子类:alt+enter实现抽象类
-
作用
1)可被子类继承,提供共性属性和方法
2)可声明为引用,更自然地使用多态
-
抽象方法?被abstract修饰的方法
ps.抽象方法没有方法体
-
什么样的方法要被定义为抽象方法?
1)需要这个方法,但是难以设计方法体
2)
public static void teach();
-
原则:
1)如果一个类中存在抽象方法,这个类也应当被定义为抽象类
2)如果一个类被定义为抽象类,那么这个类的子类就要重写所有的抽象方法
如果子类没有重写所有的抽象方法,那么子类也要定义为抽象类
二、static
-
static:静态,可以修饰属性和方法(静态属性,静态方法)
-
被static 修饰的成员属于类,和对象是否创建无关,被static修饰的成员是所有对象共享的——“只有一份”
-
如何访问静态成员:
1)类.属性 类.方法
2)对象名.属性 对象名.方法
-
已知的静态方法:
System.exit() Arrays.copyOf()
-
static修饰的属性随着类的加载而存在,和是否创建对象无关
-
注意事项:
1)static的方法可以直接访问static的属性
2)非static的方法可以直接访问static的属性
3)static的方法不能直接访问非static的属性
如果static的方法访问非static的属性,需要先创建对象
4)静态方法中不能用super和this关键字
-
单例设计模式:一个类的对象只能有一个(Sun God Config)
-
如何实现单例设计模式?
1)将构造方法设计为private
2)提供一个方法获取唯一的对象
-
分类
1)饿汉式
2)
懒汉式
三、final
-
final:最终的,最后的 -- 可以修饰变量/方法/类
-
修饰类,则类无法继承
修饰方法,则方法不能被重写
修饰变量,则为常量:XXX_YYY_ZZZ
-
被final修饰的属性系统不会再提供默认值,必须手动初始化
-
修饰引用,引用的对象不能改
public class Student{ int x = 10; } public class MyTest{ main{ final Student s1 = new Student(); s1.x = 1000; //s1 = new Student();不能new对象 } } //s1指向 new Student(),s1不能再指向另外的对象,但是new Student()可以修改
两个代码块
-
动态代码块创建对象时运行
-
顺序:
1)动态代码块和属性初始化的顺序由编写顺序决定
2)属性和动态代码块的初始化先于构造方法执行
-
类加载:首次使用某个类时,将类相关的信息加载到内存中
类加载时机:
-
创建对象
-
创建子类对象
-
访问静态属性
-
调用静态方法
-
主动加载
-
静态代码块:
-
静态代码块和静态属性的初始化顺序,由在类中书写的顺序决定;
-
代码块和属性的初始化先于构造方法执行。
-
静态属性和代码块在类加载时完成,先于实例属性和动态代码块
接口:一种规范
-
java8之前的接口:所有方法都是抽象方法
[修饰符] interface 接口名{
常量
抽象方法
}
-
接口用interface关键字定义
-
修饰符用public
-
接口名遵循标识符取名规范
-
接口中只能包括常量和抽象方法
-
所有属性都是常量,默认用public static final修
-
所有方法都是抽象方法,用public abstract修饰
-
接口可以继承其他接口
[修饰符] interface 接口名 extends 接口1,接口2{
常量;
抽象方法;
}
-
接口需要被实现类实现
[修饰符] class 实现类的类名 implements 接口1,接口2{}
-
接口通过implements关键字被实现类实现,实现类可以实现多个接口
-
如果一个实现类实现了接口就要重写/实现接口中所有的抽象方法
-
如果没有重写/实现接口中所有的抽象方法,那么这个实现类要定义为抽象类
-
既有继承父类又有实现接口:先继承再实现
[修饰符] class 类名
extends
父类名implements
接口1,接口2{} -
jdk8对接口的改进
-
新增了默认方法(default) -- 对接口实现了扩展,对旧的代码实现了兼容(新增方法时旧的实现类不会报错)
可以通过实现类对象来调用
-- 如果默认方法不能满足类的需求,可以重写
-- 默认方法必须要有方法体
-
新增了静态方法 -- 通过接口调用
接口名.静态方法名()
-
如果一个接口定义了默认方法,另一个接口定义了同名同参数的
抽象
方法,并且实现类实现了这两个接口,就会出现接口冲突
解决:在实现类中重写发生接口冲突的方法
实现类必须覆盖接口中同名同参数的方法,来解决冲突。
内部类
-
匿名内部类:需要创建这个类的对象,但是只创建一次 ==> 需要创建这个类的对象,不需要单独设计这个类
本质:接口的实现类
-
基于接口的多态
如何实现:接口的引用指向实现类的对象、实现类的对象赋值给接口的引用
-
应用:
1)接口作为参数
2)接口作为方法返回值
//匿名内部类
包
-
用其他包的类要导入
-
导入全部带*