纲要:
一、接口:是特殊的抽象类
1、优点:
定义开发规范
提高代码复用性
解耦
多实现,类只能单继承
2、修饰符可以省略,默认存在
公共的静态的常量
public static final 数据类型 变量名=赋值;
使用:类名.常量名| 实现类名.常量名|实现类对象.常量名
公共的抽象的方法
public abstract 返回值类型 方法名();
使用:实现类对象.方法名
3、注意:
定义接口使用interface关键字
抽象方法必须重写
接口如何使用:
具体的实现类实现接口,重写里面所有的抽象方法,按需扩展
抽象的实现类实现接口,重写部分抽象方法,按需扩展
实现和继承很像,都能使用父类或者父接口中的功能
接口不能实例化
类只能单继承类,接口可以多实现接口
接口之间只能继承不能实现,接口可以继承多个接口
避免实现的多个接口中存在同名方法
4、版本特性
在JDK1.7及之前接口中只能存在公共的静态的常量+公共的抽象方法
JDK1.8新增:
default默认方法,是个具体的方法,只能够通过实现类的对象使用
静态方法,只能在当前接口中使用,不能通过实现类使用
5、接口多态
二、单例模式(23中设计模式之一 ):这个类只能有一个实例
1、 实现单例的步骤:
私有的构造器
私有的静态的该类引用
公共的静态的访问方式
2、实现:
饿汉式单例
懒汉式单例
3、对比:饿汉式: 无论是否使用,在类加载的时候先创建一个对象 线程安全的 --效率低
懒汉式: 在使用的时候才创建对象,不适用不创建 线程不安全的--效率高,通过加锁控制(使用synchronized)
注意:加双重锁,第一个为提高效率,第二个为提高安全考虑,解决多线程访问不会出现不同步问题
三、静态代理
1、代理角色,真实角色实现相同的接口|继承相同的父类
2、代理角色持有真实角色的引用
3、代理行为
四、内部类:在类的内部定义的类
1、定义场合:在一个类中,内部的成员有事一个其他事物,就可以将之定义为内部类
2、分类
成员内部类
静态内部类
私有内部类
局部内部类
匿名内部类(重点)
3、成员内部类:在外部类的成员位置,既是成员也是类
特性:
成员特性:使用成员修饰符(public、static等)
类的特性:类之间可以继承、可以实现接口
注意:
内部类可以使用外部类的内容,包括私有的
内部类中只能定义静态常量,其他静态内容不可以
在外部类中使用内部类的对象使用内部类的内容
内部类编译后使用$表示
在其他类中使用内部类的内容:
外部类 引用=new 外部类();
外部类.内部类 引用=引用.new 内部类();
外部类.内部类 引用=new 外部类().new 内部类();
public class InnerTest {
int a=5;
class Inner{
int a=10;
public void test(){
int a=15;
//创建对象获取
InnerTest outer=new InnerTest();
InnerTest.Inner inner= new Inner();
System.out.println(a+" "+outer.a+" "+inner.a);
//第二种
System.out.println(a);
System.out.println(this.a);
System.out.println(InnerTest.this.a);
}
}
public static void main(String[] args) {
//分别获取到三个a的值
InnerTest.Inner inner1=new InnerTest().new Inner();
inner1.test();
}
}
4、静态内部类
定义:
只能在其中定义静态的内容(除了静态常量,静态常量可以定义在所有内部类中)
静态内部类中可以定义静态的可以定义成员的
使用:
内部类的静态方法和成员方法:
可以直接使用静态内部类和外部类中的静态内容,通过对象使用非静态的内容
其他类中使用静态内部类的内容:
外部类.内部类 引用 = new 外部类.内部类();
5、私有内部类
外部类中:
只能在通过私有内部类的对象使用私有内容
6、局部内部类:方法中的内部类
局部:{}-->作用域
注意:
局部内部类中的内容只能在当前所有在方法中通过对象使用
局部内部类不能使用成员修饰符,但是final可以
在局部内部类中使用当前所在方法的参数,需要把这个参数定义为final修饰,jdk1.7及之前必须显示定义final,1.8中可以省略final,默认存在
方法中的局部不能在其他位置使用,可以把局部内部类中的属性当做当前方法的返回值
7、匿名内部类
简化接口的实现类|子类,可以使用匿名内部类
public class AnonymousInner {
public static void main(String[] args) {
//匿名内部类,只能使用一次
new Car() {
@Override
public void run() {
System.out.println("滴滴滴");
}
@Override
public void drive() {
System.out.println("考驾照了吗");
}
}.run();
//通过引用使用,可多次使用
Car car=new Car() {
@Override
public void run() {
System.out.println("靠右行驶");
}
@Override
public void drive() {
System.out.println("行车不规范,亲人两行泪");
}
};
car.drive();
car.run();
//匿名内部类可以作为一个方法的参数使用
test(new Car(){
@Override
public void run() {
System.out.println("111");
}
@Override
public void drive() {
System.out.println("222");
}
});
}
static void test(Car car){ //Car car=-->匿名内部类
car.run();
}
}
//接口
interface Car{
void run();
void drive();
}
五、lambda表达式(JDK1.8新增)
1、目的:简化匿名内部类
2、格式: ()->{}
(): 抽象方法的参数列表
->:箭头函数,箭头符号,具有上下文推倒的作用
{}:抽象方法的方法体
3、前提:函数式接口(只有一个抽象方法的接口)
检测是否为函数式接口: @FunctionalInterface
4、注意:
抽象方法存在一个参数,参数的数据类型可以省略,前后()可以省略
抽象方法存在2个参数,参数的数据类型可以省略,前后的()不可以省略
抽象方法的方法体语句只有一句,前后的{}可以省略
如果抽象方法有返回值,只有一条返回值语句,return和前后的{}都可以省略
public class LambdaTest {
public static void main(String[] args) {
//匿名使用
Test test = new Test() {
@Override
public int a(int num) {
System.out.println("匿名内部类的方法体");
return -1;
}
};
test.a(5);
//Lambda表达式
test=(num)->{
System.out.println("我是lambda表达式");
return 0;
};
test.a(5);
//抽象方法存在2个参数,参数的数据类型可以省略,前后的()不可以省略
//抽象方法的方法体语句只有一句,前后的{}可以省略
//如果抽象方法有返回值,只有一条返回值语句,return和前后的{}都可以省略
test=(num)->0;
}
}
//函数式接口
@FunctionalInterface
interface Test{
int a(int num);
}
六、修饰符总结
1、类修饰符:
public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类。
abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现。
final,将一个类生命为最终(即非继承类),表示他不能被其他类继承。
friendly,默认的修饰符,只有在相同包中的对象才能使用这样的类。
2、成员变量修饰符:
public(公共访问控制符),指定该变量为公共的,他可以被任何对象的方法访问。
private(私有访问控制符)指定该变量只允许自己的类的方法访问,其他任何类(包括子类)中的方法均不能访问。
protected(保护访问控制符)指定该变量可以别被自己的类和子类访问。在子类中可以覆盖此变量。
friendly ,在同一个包中的类可以访问,其他包中的类不能访问。
final,最终修饰符,指定此变量的值不能变。
static(静态修饰符)指定变量被所有对象共享,即所有实例都可以使用该变量。变量属于这个类。
transient(过度修饰符)指定该变量是系统保留,暂无特别作用的临时性变量。
volatile(易失修饰符)指定该变量可以同时被几个线程控制和修改。
3、方法修饰符:
public(公共控制符)
private(私有控制符)指定此方法只能有自己类等方法访问,其他的类不能访问(包括子类)
protected(保护访问控制符)指定该方法可以被它的类和子类进行访问。
final,指定该方法不能被重载。
static,指定不需要实例化就可以激活的一个方法。
synchronize,同步修饰符,在多个线程中,该修饰符用于在运行前,对他所属的方法加锁,以防止其他线程的访问,运行结束后解锁。
native,本地修饰符。指定此方法的方法体是用其他语言在程序外部编写的。