抽象类
抽象类的介绍
抽象类使用的注意事项
1) 抽象类不能被实例化
2)抽象类不一定要包含abstract方法。也就是说,抽象类可以没有abstract方法
3)一旦类包含了abstract方法,则这个类必须声明为abstract
4) abstract 只能修饰类和方法,不能修饰属性和其它的
5)抽象类使用的注意事项和细节讨论,抽象类可以有任意成员【抽象类本质还是类】,比如:非抽象方法、构造器、静态属性等等
7)如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类。
6)抽象方法不能有主体,即不能实现.如图所示
抽象类--模板设计模式
基本介绍
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。
模板设计模式能解决的问题
- 当功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现.
- 编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式
接口
基本介绍
注意事项和细节
1)接口不能被实例化
2)接口中所有的方法是public方法,接口中抽象方法,可以不用abstract修饰图示:
3)一个普通类实现接口,就必须将该接口的所有方法都实现。
4)抽象类实现接口,可以不用实现接口的方法。
5)一个类同时可以实现多个接口
6)接口中的属性,只能是final的,而且是 public static final 修饰符。
比如:int a=1;实际上是 public static final int a=1;(必须初始化)
7)接口中属性的访问形式:接口名.属性名
8)接口不能继承其它的类,但是可以继承多个别的接口
[举例] interface A extends B,C{}
9)接口的修饰符只能是public和默认,这点和类的修饰符是一样的。
实现接口 vs 继承类
当子类继承了父类,就自动的拥有父类的功能 // 如果子类需要扩展功能,可以通过实现接口的方式扩展. // 可以理解 实现接口 是 对 java 单继承机制的一种补充
接口和继承解决的问题不同
- 1.继承的价值主要在于:解决代码的复用性和可维护性。
- 2.接口的价值主要在于:设计,设计好各种规范(方法),让其它类去实现这些方法。即更加的灵活
- 3.>接口比继承更加灵活
- 4.接口比继承更加灵活,继承是满足is-a的关系,而接口只需满足like-a的关系。接口在一定程度上实现代码解耦[即:接口规范性+动态绑定机制]
接口的多态特性
多态参数
在前面的Usb接口案例,UsbInterface usb,既可以接收手机对象,又可以接收相机对象,
就体现了接口多态(接口引用可以指向实现了接口的类的对象)
多态数组
演示一个案例:
给Usb数组中,存放Phone和相机对象,Phone类还有一个特有的方法call(),请遍历Usb数组,如果是Phone对象,除了调用Usb接口定义的方法外,还需要调用Phone特有方法call.
接口存在多态传递现象.
内部类
如果定义类在局部位置(方法中/代码块) : (1)局部内部类 (2) 匿名内部类
定义在成员位置 (1) 成员内部类 (2) 静态内部类
基本介绍
- 一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。是我们类的第五大成员
- 【思考:类的五大成员是哪些?[属性、方法、构造器、代码块、内部类]】,
- 内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系,
- 注意:内部类是学习的难点,同时也是重点,后面看底层源码时,有大量的内部类
基本语法
内部类的分类
定义在外部类局部位置上(比如方法内)
1)局部内部类(有类名)
2)匿名内部类(没有类名,重点!!!!)
>定义在外部类的成员位置上:
1)成员内部类(没用static修饰)
2)静态内部类(使用static修饰)
局部内部类的使用
说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名
- 可以直接访问外部类的所有成员,包含私有的
- 不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final修饰,因为局部变量也可以使用final
- 作用域:仅仅在定义它的方法或代码块中。
- 局部内部类--访问--->外部类的成员[访问方式:直接访问]
- 外部类--访问--->局部内部类的成员
访问方式:创建对象,再访问(注意:必须在作用域内)
记住: (1)局部内部类定义在方法中/代码块
(2)作用域在方法体或者代码块中
(3)本质仍然是一个类
6. 外部其他类--不能访问---->局部内部类(因为局部内部类地位是一个局部变量)
7. 如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问【演示】
System.out.printIn("外部类的n2=" +外部类名.this.n2);
匿名内部类的使用(重要!!!!!!!)
(1)本质是类
(2)内部类
(3)该类没有名字
(4)同时还是一个对象
说明:匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名
匿名内部类的基本语法
- 匿名内部类的语法比较奇特,请大家注意,因为匿名内部类既是一个类的定义同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特证,对前面代码分析可以看出这个特点,因此可以调用匿名内部类方法。
- 可以直接访问外部类的所有成员,包含私有的
- 不能添加访问修饰符,因为它的地位就是一个局部变量
- 作用域:仅仅在定义它的方法或代码块中。
- 匿名内部类--访问-->外部类成员[访问方式:直接访问]
- 外部其他类--不能访问--->匿名内部类(因为匿名内部类地位是一个局部变量)
- 如果外部类和匿名内部类的成员重名时,匿名内部类访问的话,默认遵循就近原则如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问
成员内部类的使用
说明:成员内部类是定义在外部类的成员位置,并且没有static修饰。
1.可以直接访问外部类的所有成员,包含私有的
2.可以添加任意访问修饰符(public、protected、默认、private)因为它的地位就是一个成员。
3.作用域和外部类的其他成员一样,为整个类体比如前面,在外部类的成员方法中创建成员内部类对象,再调用方法
4.成员内部类--访问-->外部类成员(比如:属性)[访问方式:直接访问]
5.外部类--访问--->成员内部类(说明)访问方式:创建对象,再访问
6.外部其他类--访问-->成员内部类
7.如果外部类和内部类的成员重名时,内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问
静态内部类的使用
说明:静态内部类是定义在外部类的成员位置,并且有static修饰
- 可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员
- 可以添加任意访问修饰符(public、protected、默认private)因为它的地位就是一个成员。
- 作用域:同其他的成员,为整个类体
- 静态内部类-访问-->外部类(比如:静态属性)[访问方式:直接访问所有静态成员
- 外部类--访问-->静态内部类访问方式:创建对象,再访问
- 外部其他类--访问--->静态内部类
- 如果外部类和静态内部类的成员重名时,静态内部类访问的时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.成员)去访问
枚举的二种实现方式
自定义类实现枚举
- 不需要提供setXxx方法,因为枚举对象值通常为只读
- 对枚举对象/属性使用 final + static共同修饰,实现底层优化
- 枚举对象名通常使用全部大写,常量的命名规范
- 枚举对象根据需要,也可以有多个属性
小结:进行自定义类实现枚举,有如下特点:
- 构造器私有化
- 对外暴露对象(通过为对象添加 public final static 修饰符)
- 可以提供 get 方法,但是不要提供 set
使用 enum 关键字实现枚举注意事项
1)当我们使用enum关键字开发一个枚举类时 默认会继承 Enum 类, 而且是一个 final 类
2) 传统的 public static final Season2 SPRING = new Season2("春天", "温暖");
简化成 SPRING("春天", "温暖"), 这里必 须知道,它调用的是哪个构造器.
3) 如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略
4)当有多个枚举对象时,使用,间隔,最后有一个分号结尾
5) 枚举对象必须放在枚举类的行首.
enum 用方法说明
1) toString:Enum 类已经重写过了,返回的是当前对象名,子类可以重写该方法,用于返回对象的属性信息
2) name:返回当前对象名(常量名),子类中不能重写
3) ordinal:返回当前对象的位置号,默认从 0 开始
4) values:返回当前枚举类中所有的常量
5) valueOf:将字符串转换成枚举对象,要求字符串必须 为已有的常量名,否则报异常!
6) compareTo:比较两个枚举常量,比较的就是编号!
enum 实现接口
- 使用 enum 关键字后,就不能再继承其它类了,因为 enum 会隐式继承 Enum,而 Java 是单继承机制。
- 枚举类和普通类一样,可以实现接口,如下形式。 enum 类名implements 接口 1,接口 2{}
本章笔记是观看韩顺平的JAVA的视频和在网上找的资料 以及自己的理解总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正