抽象(abstract)
抽象的定义:
- 抽象方法 : 没有方法体的方法。
- 抽象类:包含抽象方法的类。
抽象方法的作用:
提醒作用
抽象方法的格式:
修饰符 abstract 返回值类型 方法名 (参数列表);
和普通方法对比:
- 在返回值的前面添加abstract。
- 把方法体的{}换成 ;
抽象方法需要放在抽象类中。
抽象类的定义:
如果一个类包含抽象方法,那么该类必须是抽象类
抽象类的格式:
abstract class 类名字 {
}
对抽象的初识:
- 因为抽象方法没有代码,即使创建出了对象也无法调用抽象方法,所以不能创建对象。
- 抽象类就是在以前的标准类基准上增加抽象方法。
- 抽象方法没有方法体,是无法执行的。
- 一个抽象类继承一个抽象类,可以添加抽象方法。
- 抽象类也可以继承普通类。
抽象类的使用步骤:
- 定义一个类继承抽象类。
- 重写抽象方法。
- 创建子类对象。
父类中抽象方法存在的必要性:
- 如果父类不写抽象方法,子类也可以不写该方法,子类就功能缺失了。(提醒作用)
- 如果父类添加了抽象方法,强制子类去重写这个方法,保存功能完整。
抽象总结:
- 抽象类不能创建对象。(无论有没有抽象方法)
- 抽象类中有构造方法,给抽象类的成员变量赋值。
- 抽象方法需要放在抽象类中,但是抽象类中可以没有抽象方法。
- 子类需要重写抽象类中的所有方法,如果只重写部分抽象方法,另外的抽象方法还在,需要放在抽象类中,则子类还是抽象类。
接口(interface)
回顾引用数据三种类型:
- 数组
- 类
- 接口
接口的概述:
- 接口也是一种类型,接口主要用来放事物额外的功能。
- 接口是功能的集合。
接口的三大注意事项:
- 接口中的方法默认会添加:public abstract(不写就有)。故:若在接口中,方法不加修饰符,例:void show(),则默认是抽象方法。
- 接口中的成员变量默认会添加:public static final。 故:接口中的成员变量不能改变,可以视为常量。
- 接口中没有构造方法。
接口的定义格式:
public interface 接口名称 {
// 抽象方法
// 默认方法(JDK1.8以后才有)
// 静态方法(JDK1.8以后才有)
// 私有方法(JDK1.9以后才有)
}
接口的使用:
- 定义类实现接口。
- 重写抽象方法。
- 创建实现类对象。
接口的实现:(implements)
- 接口不能创建对象,只能实现(implements)
- 类与接口的关系为实现关系,即类实现接口,该类可以称为接口的实现类,也可以称为接口的子类
非抽象子类实现接口:
- 必须重写接口中所有抽象方法。
- 继承了接口的默认方法,即可以直接调用,也可以重写。
实现的格式:
class 类名 implements 接口名 {
// 重写接口中抽象方法(必须)
// 重写接口中默认方法(可选)
}
抽象方法:
上面讲抽象时已详细介绍,看上面即可。
默认方法:
概述:
使用 default 修饰,不可省略,供子类调用或者子类重写。
格式:
修饰符 default 返回值类型 方法名(参数列表){
}
默认方法的使用:
- 实现类继承了,直接拿来使用。
- 实现类重写默认方法。(重写时,不用加default修饰)
- 二选一,但是只能通过实现类的对象来调用。
静态方法:
概述:
- 使用 static 修饰,供接口直接调用。
- 只能使用接口名调用,不可以通过实现类的类名或者实现类的对象调用。
格式:
static 返回值类型 方法名(参数列表){
}
使用方法:
接口名.方法名(参数);直接调用即可。
私有方法:
概述:
使用 private 修饰,供接口中的默认方法或者静态方法调用。(只能在该接口使用,实现类不能使用)
类型:
- 私有方法:只有默认方法可以调用。
- 私有静态方法:默认方法和静态方法可以调用。
格式:
private 返回值类型 方法名(参数列表){
}
作用与存在的意义:
如果一个接口中有多个默认方法,并且方法中有重复的内容,那么可以抽取出来,封装到私有方法中,供默认方法
去调用。从设计的角度讲,私有的方法是对默认方法和静态方法的辅助。
接口的多实现
概述:
- java的类可以同时实现多个接口。
(而java中类只能单继承,一个类只有一个父类)
实现格式:
class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... {
// 重写接口中抽象方法【必须】
// 重写接口中默认方法【不重名时可选】
}
实现的注意事项:
- 多个接口中有相同的抽象方法,只需要实现一次即可。
- 多个接口中默认方法重名,实现类一定要重写这个方法。
- 接口中,存在同名的静态方法并不会冲突,原因是只能通过各自接口名访问静态方法。
- 若类既继承父类,又要实现接口。且父类与接口的默认方法重名,则就近原则,用父类的。
一个接口可以继承另外的多个接口:
格式:
interface 接口名 extends 接口1,接口2{
}
注意事项:
如果父接口中的默认方法有重名的,那么子接口需要重写一次。
java有多继承吗?
- 类只能单继承。
- 接口可以多继承。
写代码时的分析思路:
- 将相同的类容往父类中抽取。
- 将一部分人会的功能放到接口中。
- 写代码时,先写父类,再写接口。
final
final可修饰:
- 类
- 方法
- 变量
final修饰类:
- final修饰的类不能被继承,故final修饰的类不能有子类。
- final修饰的类,可以创建对象,且该对象的成员变量可以改变。
final修饰方法:
final修饰的方法不能被重写,但是可以直接使用。
final修饰变量:
final修饰的变量只能使用一次 = 赋值。(包括成员变量) 否则会报错。
- final修饰的变量对象也一样,new了就不能使用等号,但是对象里面的属性是可以改变的。
final修饰成员变量有两种方式:
- 立刻赋值。
- 用构造方法赋值。
常量的命名规则:
所有字母大写,使用_连接。
权限修饰符
- 无关类使用该类的意思是:不同类需要创建对象才能调用方法。
- 暂时不同模块不能使用一个类(无论用什么修饰),以后会学到共享模块,再去讨论这个问题。
常用的修饰符:
- public:所有地方都能用。
- private:只有本类能用。
不常用的修饰符:
- protected:主要给子类使用。
- default(不写):主要给本包中的类使用。
编写代码时,如果没有特殊的考虑,建议这样使用权限:
- 成员变量使用 private ,隐藏细节。
- 构造方法使用 public ,方便创建对象。
- 成员方法使用 public ,方便调用方法。
static(静态)
被static修饰的成员可以并且建议通过类名直接访问。虽然也可以通过对象名访问静态成员。
格式:
访问类变量:
类名.类变量名;
调用静态方法:
类名.静态方法名(参数);
static可以修饰:
- 成员变量。
- 成员方法。
- 用static修饰的成员不会进堆中,会进入静态区(在方法区里面)。
- 静态修饰的内容,优先于对象存在,所以可以被所有对象共享。
static修饰成员变量格式:
static 数据类型 变量名;
static修饰成员变量的好处:
- static修饰的成员变量在静态区保存一份,所有对象都能用,节省了内存。
- static是类加载到内存的时候就有了,比对象早。
- 可以使用类名调用。(推荐使用)
什么样的数据适合使用static修饰:
这个类共享的数据。
static修饰静态方法:
格式:
修饰符 static 返回值类型 方法名 (参数列表) {
// 执行语句
}
静态方法调用的注意事项:
- 静态方法可以直接访问静态变量和静态方法。
- 静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可以直接访问静态变量或静态方法。
- 静态方法中,不能使用this关键字。
间接调用:
同一个类中,静态方法里面可以创建对象,调用该类非静态内容。
static修饰静态方法的好处:
不同类中,可以使用类名调用静态方法。
什么方法定义静态方法:
如果方法中没有使用到非静态内容,就可以考虑定义为静态方法。
静态代码块
格式:
public class ClassName {
static {
// 执行语句
}
}
位置:
类中方法外
特点:
在创建对象前自动执行一次。
- 只会执行一次,执行时会比构造方法先运行,无论创几个对象,都只会执行总共一次。
作用:
可以给静态的成员变量赋值。
- 数据库驱动