JAVASE-DAY09

纲要:

一、接口:是特殊的抽象类

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,本地修饰符。指定此方法的方法体是用其他语言在程序外部编写的。

参考:https://www.cnblogs.com/lixiaolun/p/4311727.html

你可能感兴趣的:(JAVASE-DAY09)