抽象类
- 概述:动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的。
在Java中一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。 - 抽象类的特点:
- A:抽象类和抽象方法必须用abstract关键字修饰
- B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
- C:抽象类不能实例化
- 因为它不是具体的,抽象类可以有构造方法,但是不能实例化,那么构造方法的作用是什么呢?
作用:用于子类访问父类数据的初始化
- 因为它不是具体的,抽象类可以有构造方法,但是不能实例化,那么构造方法的作用是什么呢?
- D:抽象的子类
- 如果不想重写抽象方法,该子类一定是个抽象类
- 重写所有的抽象方法,该子类是一个具体的类
抽象类的实例化其实是靠具体的子类实现的是多态的方式
Animal a = new Cat() ;
抽象类的成员特点:
-
成员变量既可以是变量也可以是常量。
-
构造方法:有
用于子类访问父类数据的初始化
成员方法:既可以是抽象的也可以是非抽象的 -
抽象类的成员方法特性:
A:抽象方法强制要求子类做的事情
B:非抽象方法子类继承的事情提高代码复用性
abatract不能和哪些关键字共存
private 冲突
final 冲突
static 无意义
接口
概述:为了体现事物功能的扩展性,Java中就提供了接口来定义这些额外功能,并不给出具体实现,将来哪些猫狗需要被培训,只需要这部分猫狗把这些额外功能实现即可。
接口的特点
- A:接口用关键字interface表示
格式:interface 接口名 {} - B:类实现接口用implements表示
class 类名 implements 接口名 {} - C:接口不能实例化
那接口如何实例化呢?
按照多态的方式来实例化 - D:接口的子类
a:可以是抽象类。但是意义不太
b:可以是具体类。要重写接口虫的所有抽象方法。(推荐方案)
由此可见:
A:具体类多态(几乎没有)
B:抽象类多态(常用)
C:接口多态(最常用)
接口成员特点
- 成员变量:只能是常量,并且是静态的
默认修饰符是public static final - 构造方法:接口没有构造方法
- 成员方法:只能是抽象方法
默认修饰符是:public abstract
- 类与类:
继承关系,只能单继承,可以多层继承 - 类与接口:
实现关系,可以单实现,也可以多实现。
并且还可以在继承一个类的同时实现多个接口。 - 接口与接口
继承关系,可以单继承,也可以多继承。
抽象类和接口的区别
-
成员区别:
- 抽象类
- 成员变量:既可以是变量,也可以是常量
- 构造方法:有
- 成员方法:可以是抽象的,也可以非抽象的
- 接口
- 成员变量:只可以是常量
- 构造方法:无
- 成员方法:只可以抽象
- 抽象类
-
关系区别
- 类与类: 继承关系,只能单继承,可以多层继承
- 类与接口:实现关系,可以单实现,也可以多实现。
- 接口与接口:继承关系,可以单继承,也可以多继承。
-
设计理念区别
- 抽象类被继承体现的是: "is a”的关系,抽象类中定义的是该继承体系的共性功能。
- 接口被实现体现的是"like a”的关系,接口中定义的是该继承体系的扩展功能。
形式参数:
- 基本类型:
- 引用类型:
类名: (匿名对象的时候其实我们已经进过了)需要的是该类的对象
抽象类:需要的是该抽象的类子类对象
接口:需要的是该接口的实现类对象
返回值类型
- 基本类型: (基本类型太简单我不准备进解)
- 引用类型:
类:返回的是该类的对象
抽象类:返回的是该抽象类的子类对象
接口:返回的是该接口的实现类的对象
链式編程:
每次调用完毕方法后,返回的是一个对象。
包
1,其实就是文件夹
2,作用:
- 区分同名的类
- 对类的进行分类管理
3,包的定义
- package 包名; 多级包用.分开
4,注意事项:
- A:package语句必须是程序的第一条可执行的代码
- B:package语句在一个Java文件中只能有一个
- C:如果没有package,默认表示无包名
导包:
格式:import 包名;
这种方式 导入是到类的名称。
注意:我们用谁就导谁。
package,import,class的顺序
package>import>class
权限修饰符
常见的修饰符
(1)分类:
- 权限修饰符:private,默认,protected,public
- 状态修饰符:static,final
- 抽象修饰符:abstract
(2)常见的类及其组成的修饰
类:
- 默认,public,abstract,final
- 常用的:public
成员变量:
- private,默认,protected,public,static,final
- 常用的:private
构造方法:
- private,默认,protected,public
- 常用的:public
成员方法:
- private,默认,protected,public,static,final,abstract
- 常用的:public
(3)另外比较常见的:
- public static final int=10;
- public static void show(){}
- public final void show(){}
- public abstract void show();
内部类
(1)概述:把定义在其他类内部的类,这样的类就被称为内部类
(2)内部类的访问特点:
- A:内部类可以直接访问外部类的成员,包括私有。
- B:外部类要想访问内部类的成员,就必须创建内部类对象
(3)内部类的分类
- 成员内部类
- 局部内部类
(4)成员内部类
- A:private为了数据的安全性
- B:static为了访问的方便性
成员内部类不是静态的:
外部类名.内部类名 对象名= new 外部类名.new 内部类名();
成员内部类是静态的。
外部类名.内部类名 对象名= new 外部类名.内部类名();
(5)局部内部类
- A:局部内部类访问局部变量必须加final修饰。
- B:为什么呢?
因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
所以,堆内存还是用该变量,而该变量已经没有了。
为了让该值还存在就加final修饰。
通过反编译工具我们看到了加入final后,堆内存直接存储的是值而不是变量名。
匿名内部类
匿名内部类
- A:是局部内部类的简化形式
- B:前提:存在一个类或者接口
- C:格式:
new 类名或者接口名() {重写方法;} - D:本质:其实是继承该类或者实现接口的子类匿名对象
匿名内部类在开发中的使用,
我们在开发的时候,会看到抽象类。或者接口作为参数。
而这个时候我们知道实际需要的是一个子类对象。
如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化