抽象类--接口-- 内部类-- 枚举

简介: 抽象类--接口-- 内部类-- 枚举

抽象类

抽象类的介绍

抽象类使用的注意事项

1)   抽象类不能被实例化

2)抽象类不一定要包含abstract方法。也就是说,抽象类可以没有abstract方法

3)一旦包含了abstract方法,则这个必须声明为abstract

4) abstract 只能修饰类和方法,不能修饰属性和其它的

5)抽象类使用的注意事项和细节讨论,抽象类可以有任意成员【抽象类本质还是类】,比如:非抽象方法、构造器、静态属性等等

7)如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类

6)抽象方法不能有主体,即不能实现.如图所示

抽象类--模板设计模式

基本介绍

       抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。

模板设计模式能解决的问题

  1. 当功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现.
  2. 编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式

接口

基本介绍

注意事项和细节

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. 1.继承的价值主要在于:解决代码的复用性和可维护性。
  2. 2.接口的价值主要在于:设计,设计好各种规范(方法),让其它类去实现这些方法。即更加的灵活
  3. 3.>接口比继承更加灵活
  4. 4.接口比继承更加灵活,继承是满足is-a的关系,而接口只需满足like-a的关系。接口在一定程度上实现代码解耦[即:接口规范性+动态绑定机制]

接口的多态特性

多态参数

在前面的Usb接口案例,UsbInterface usb,既可以接收手机对象,又可以接收相机对象,

就体现了接口多态(接口引用可以指向实现了接口的类的对象)

多态数组

演示一个案例:

给Usb数组中,存放Phone和相机对象,Phone类还有一个特有的方法call(),请遍历Usb数组,如果是Phone对象,除了调用Usb接口定义的方法外,还需要调用Phone特有方法call.

接口存在多态传递现象.

内部类

如果定义类在局部位置(方法中/代码块) :    (1)局部内部类 (2) 匿名内部类

定义在成员位置 (1) 成员内部类 (2) 静态内部类

基本介绍

  1. 一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。是我们类的第五大成员
  2. 【思考:类的五大成员是哪些?[属性、方法、构造器、代码块、内部类]】,
  3. 内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系,
  4. 注意:内部类是学习的难点,同时也是重点,后面看底层源码时,有大量的内部类

基本语法

内部类的分类

定义在外部类局部位置上(比如方法内)

1)局部内部类(有类名)

2)匿名内部类(没有类名,重点!!!!)

>定义在外部类的成员位置上:

1)成员内部类(没用static修饰)

2)静态内部类(使用static修饰)

局部内部类的使用

说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名

  1. 可以直接访问外部类的所有成员,包含私有
  2. 不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final修饰,因为局部变量也可以使用final
  3. 作用域:仅仅在定义它的方法或代码块中
  4. 局部内部类--访问--->外部类的成员[访问方式:直接访问]
  5. 外部类--访问--->局部内部类的成员

访问方式:创建对象,再访问(注意:必须在作用域内

记住:   (1)局部内部类定义在方法中/代码块

             (2)作用域在方法体或者代码块中

             (3)本质仍然是一个类

6.  外部其他类--不能访问---->局部内部类(因为局部内部类地位是一个局部变量)

7.  如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问【演示】

                                      System.out.printIn("外部类的n2=" +外部类名.this.n2);

匿名内部类的使用(重要!!!!!!!)

(1)本质是类

(2)内部类

(3)该类没有名字

(4)同时还是一个对象

说明:匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名

匿名内部类的基本语法

  1. 匿名内部类的语法比较奇特,请大家注意,因为匿名内部类既是一个类的定义同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特证,对前面代码分析可以看出这个特点,因此可以调用匿名内部类方法。
  2. 可以直接访问外部类的所有成员,包含私有的
  3. 不能添加访问修饰符,因为它的地位就是一个局部变量
  4. 作用域:仅仅在定义它的方法或代码块中。
  5. 匿名内部类--访问-->外部类成员[访问方式:直接访问]
  6. 外部其他类--不能访问--->匿名内部类(因为匿名内部类地位是一个局部变量)
  7. 如果外部类和匿名内部类的成员重名时,匿名内部类访问的话,默认遵循就近原则如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

成员内部类的使用

说明:成员内部类是定义在外部类的成员位置,并且没有static修饰。

1.可以直接访问外部类的所有成员,包含私有的

2.可以添加任意访问修饰符(public、protected、默认、private)因为它的地位就是一个成员。

3.作用域和外部类的其他成员一样,为整个类体比如前面,在外部类的成员方法中创建成员内部类对象,再调用方法

4.成员内部类--访问-->外部类成员(比如:属性)[访问方式:直接访问]

5.外部类--访问--->成员内部类(说明)访问方式:创建对象,再访问

6.外部其他类--访问-->成员内部类

7.如果外部类和内部类的成员重名时,内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

静态内部类的使用

说明:静态内部类是定义在外部类的成员位置,并且有static修饰

  1. 可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员
  2. 可以添加任意访问修饰符(public、protected、默认private)因为它的地位就是一个成员。
  3. 作用域:同其他的成员,为整个类体
  4. 静态内部类-访问-->外部类(比如:静态属性)[访问方式:直接访问所有静态成员
  5. 外部类--访问-->静态内部类访问方式:创建对象,再访问
  6. 外部其他类--访问--->静态内部类
  7. 如果外部类和静态内部类的成员重名时,静态内部类访问的时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.成员)去访问

枚举的二种实现方式

自定义类实现枚举

  1. 不需要提供setXxx方法,因为枚举对象值通常为只读
  2. 对枚举对象/属性使用 final + static共同修饰,实现底层优化
  3. 枚举对象名通常使用全部大写,常量的命名规范
  4. 枚举对象根据需要,也可以有多个属性

小结:进行自定义类实现枚举,有如下特点:

  1. 构造器私有化
  2. 对外暴露对象(通过为对象添加 public final static 修饰符)
  3. 可以提供 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 实现接口

  1. 使用 enum 关键字后,就不能再继承其它类了,因为 enum 会隐式继承 Enum,而 Java 是单继承机制。
  2. 枚举类和普通类一样,可以实现接口,如下形式。 enum 类名implements 接口 1,接口 2{}

本章笔记是观看韩顺平的JAVA的视频和在网上找的资料 以及自己的理解总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正

目录
相关文章
|
2月前
|
Java PHP 数据安全/隐私保护
PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
本文详细介绍了PHP面向对象编程的一系列核心概念和用法,包括构造函数、析构函数、继承、方法重写、访问控制、接口、抽象类、静态成员、final关键字、以及this、self、parent这三个关键字的异同和作用。通过具体示例代码,展示了如何在PHP中使用这些面向对象的特性,以及它们在实际开发中的应用。
PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
|
3月前
|
存储 算法 编译器
c++--类(上)
c++--类(上)
|
6月前
|
安全 编译器 程序员
【C++】继承 -- 详解(上)
【C++】继承 -- 详解(上)
|
6月前
|
存储 Java 编译器
【C++】继承 -- 详解(下)
【C++】继承 -- 详解(下)
Java-----抽象类为什么不能实例化?抽象方法为什么不能被static修饰?set和get方法的使用方法
Java-----抽象类为什么不能实例化?抽象方法为什么不能被static修饰?set和get方法的使用方法
|
6月前
|
JavaScript 前端开发
ES6如何声明一个类?类如何继承?
ES6如何声明一个类?类如何继承?
43 0
|
程序员 C++
C++ -- 继承
1. 继承的概念和定义 1.1 概念 继承机制是面向对象设计程序使得代码可以复用,它允许程序员在保持原有类特性的基础上进程扩展,增加功能,这样产生的新的类叫做派生类。简单来说继承是类设计层次的复用。
59 0
|
Java
Java枚举类(1)--枚举类的定义、方法使用和接口实现
Java枚举类(1)--枚举类的定义、方法使用和接口实现
398 0
Java枚举类(1)--枚举类的定义、方法使用和接口实现
|
C#
C#--Linkeddlist类
C#--Linkeddlist类
76 0