面向对象进阶二(包、final、权限修饰符、代码块、abstract、接口、内部类)

面向对象进阶二

  • 一、包、final、权限修饰符、代码块
    • 1.1 包
    • 1.2 final关键字
    • 1.3 权限修饰符
    • 1.4 代码块
      • 1.4.1 局部代码块(已淘汰,了解)
      • 1.4.2 构造代码块(了解内容)
      • 1.4.3 静态代码块
  • 二、抽象方法和抽象类
  • 三、接口
    • 3.1 接口中的成员特点
    • 3.2 类和接口的关系
    • 3.3 接口的升级规则
      • 3.3.1 JDK8以后接口中新增的方法:
      • 3.3.2JDK9以后接口中新增的方法:
      • 3.3.3总结
    • 3.4 接口的应用
    • 3.5 适配器设计
  • 四、内部类
    • 4.1 成员内部类
    • 4.2 静态内部类
    • 4.3 局部内部类
    • 4.4 匿名内部类

一、包、final、权限修饰符、代码块

1.1 包

包就是文件夹,管理各种不同的Java类。
● 使用同一个包中的类时,不需要导包。
● 使用java.lang包中的类时,不需要导包。
● 其他情况都需要导包
● 如果同时使用两个包中的同名类,需要用全类名。

1.2 final关键字

final关键字可修饰方法、类、变量。
● 修饰方法:该方法为最终方法,不能被重写;
● 修饰类:该方法为最终类,不能被继承;
● 修饰变量:只能赋值一次,不能更改,其实也就是常量。

常量:
实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性。

命名规范

  • 单个单词:全部大写
  • 多个单词:全部大写,单词之间用下划线隔开

final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。
final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,对象内部的可以改变。

1.3 权限修饰符

权限修饰符:是用来控制一个成员能够被访问的范围的。
可以修饰成员变量,方法,构造方法,内部类。
面向对象进阶二(包、final、权限修饰符、代码块、abstract、接口、内部类)_第1张图片

1.4 代码块

1.4.1 局部代码块(已淘汰,了解)

用大括号括起来的范围。
作用:提前结束变量的生命周期

1.4.2 构造代码块(了解内容)

定义:写在成员位置的代码块。
作用:可以将多个构造方法中重复的语句抽取出来。
执行时机:在创建本类对象时会先执行构造代码块的内容,再执行构造方法。

1.4.3 静态代码块

格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次。
使用场景:在类加载的时候,做一些数据初始化的时候使用。

二、抽象方法和抽象类

修饰词:abstract。

作用:
抽取共性时无法确定方法体,就把该方法写成抽象的,强制让子类进行重写。

● 抽象方法:将共性的行为(方法)抽取到父类之后。
由于每一个子类执行的内容是不一样,所以,在父类中不能确定具体的方法体。
该方法就可以定义为抽象方法。

● 抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类。

定义格式
抽象方法:public abstract 返回值类型 方法名(参数列表)
抽象类: public abstract class 类名{}

抽象类和抽象方法的注意事项
● 抽象类不能实例化(创建对象);
● 抽象类中不一定有抽象方法,有抽象方法的类-定是抽象类;
● 可以有构造方法;
● 抽象类的子类:
- 要么重写抽象类中的所有抽象方法
- 要么是抽象类

三、接口

abstract在对方法体不确定时进行修饰,侧重于该类事物的性质。而接口更偏向于是对行为的“抽象”。
面向对象进阶二(包、final、权限修饰符、代码块、abstract、接口、内部类)_第2张图片
面向对象进阶二(包、final、权限修饰符、代码块、abstract、接口、内部类)_第3张图片

3.1 接口中的成员特点

  • 成员变量:只能是常量;默认修饰符:public static final
  • 构造方法:没有
  • 成员方法:只能是抽象方法;默认修饰符:public abstract

3.2 类和接口的关系

  • 类和类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承。
  • 类和接口的关系:实现关系,可以单实现, 也可以多实现,还可以在继承一个类的同时实现多个接口。
  • 接口和接口的关系:继承关系,可以单继承,也可以多继承。(如果实现类实现了最下面的子接口,那么就需要重写所有的抽象方法)

3.3 接口的升级规则

3.3.1 JDK8以后接口中新增的方法:

允许在接口中定义默认方法,需要使用关键字default修饰
作用:解决接口升级的问题
接口中默认方法的定义格式:

  • 格式: public default返回值类型方法名(参数列表) { }
    范例: public default void show() { }
  • 接口中默认方法的注意事项:
    ① 默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字。
    ② public可以省略, default不能省略。
    ③ 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写。

允许在接口中定义定义静态方法,需要用static修饰

  • 接口中静态方法的定义格式: public static返回值类型方法名(参数列表){ }
    范例: public static void show(){ }

  • 接口中静态方法的注意事项:
    ① 静态方 法只能通过接口名调用,不能通过实现类名或者对象名调用
    ② public可以省略, static不 能省略

3.3.2JDK9以后接口中新增的方法:

允许在接口中定义私有方法

格式1: private 返回值类型方法名(参数列表){ }
范例1: private void show(){ }

格式2: private static返回值类型方法名(参数列表){ }
范例2: private static void method() { }

3.3.3总结

  • JDK7以前:接口中只能定义抽象方法。
  • JDK8: 接口中可以定义有方法体的方法。(默认、 静态)
  • JDK9: 接口中可以定义私有方法。
  • 私有方法分为两种: 普通的私有方法,静态的私有方法

3.4 接口的应用

  • 接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了。
  • 当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。

3.5 适配器设计

1.当一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以适配器设计模式
2.书写步骤:
编写中间类XXXAdapter,实现对应的接口;
对接口中的抽象方法进行空实现,让真正的实现类继承中间类,并重写需要用的方法;
为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰。

四、内部类

类的五个成员:属性、方法、构造方法、代码块、内部类。
内部类就是在一个类内,再创建的一个类。将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类
内部类是外部类的一部分,且单独出现时没有意义。
① 内部类可以直接访问外部类的成员(包括私有的);
② 外部类不能直接访问内部类的成员,必须创建对象。

内部类分为:成员内部类、静态内部类、局部内部类、匿名内部类四种。前三种均属于了解内容,可能在源码中才会看。

  1. 成员内部内,类定义在了成员位置 (类中方法外称为成员位置,无static修饰的内部类)
  2. 静态内部类,类定义在了成员位置 (类中方法外称为成员位置,有static修饰的内部类)
  3. 局部内部类,类定义在方法内
  4. 匿名内部类,没有名字的内部类,可以在方法中,也可以在类中方法外。

4.1 成员内部类

使用格式:外部类.内部类

获取成员内部类对象:
外部类.内部类 变量 = new 外部类().new 内部类();
② 在外部类中定义一个方法提供内部类的对象。

编写成员内部类的注意点:

  1. 成员内部类可以被一些修饰符所修饰,比如: private,默认,protected,public,static等
  2. 在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量。
  3. 创建内部类对象时,对象中有一个隐含的Outer.this记录外部类对象的地址值。

4.2 静态内部类

属于成员内部类的特殊情况。有static修饰,属于外部类本身的。

  • 拓展1:静态内部类可以直接访问外部类的静态成员。
  • 拓展2:静态内部类不可以直接访问外部类的非静态成员,如果要访问需要创建外部类的对象。
  • 拓展3:静态内部类中没有银行的Outer.this。

使用格式:外部类.内部类
创建静态内部类的对象:部类.内部类 变量 = new 外部类.内部类构造器;

调用非静态方法的格式:先创建对象,用对象调用
调用静态方法的格式:外部类名.内部类名.方法名();

4.3 局部内部类

局部内部类:定义在方法中的类。

4.4 匿名内部类

匿名内部类 :是内部类的简化写法。他是一个隐含了名字的内部类。
格式:

new 类名或者接口名() {
     重写方法;
};

包含了:

  • 继承或者实现关系
  • 方法重写
  • 创建对象

整体就是一个类的子类对象或者一个接口的实现类对象

你可能感兴趣的:(JAVA学习记录,java,笔记)