目录
3.4抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类
4.2接口中的方法只能是public abstract修饰的方法
4.3接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
4.5 接口中的变量会被隐式的指定为 public static final 变量
4.8 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
(一)抽象类
(1)什么是抽象类
在面向对象编程中,抽象类是一个不能被实例化的类,它通常作为其他类的父类。抽象类可以包含抽象方法和非抽象方法,它定义了子类的一般形式,并强制要求子类实现其定义的抽象方法。——>百度百科
(2)抽象类语法
被abstract修饰的类叫抽象类,在抽象类中被abstract修饰的方法叫做抽象方法,抽象方法不用给出具体的实现。
如下代码中有一个被abstract修饰的抽象类Animal,抽象类中可以包含普通方法和属性,和构造方法。
public abstract class Animal {//父类animal
String name;
int age;
public Animal(String name, int age) {//抽象类可以包含构造方法
this.name = name;
this.age = age;
}
public abstract void bark();//抽象类里的抽象方法不能有具体的实现
public void breath(){//抽象类中可以包含普通方法
System.out.println("正在呼吸");
}
}
(3)抽象类的特性
3.1抽象类不能直接实例化对象
如下图,抽象类Animal直接实例化对象,编译器报错
3.2抽象方法不能是 private 的
如下图抽象方法bark()加入private修饰符编译报错
原因:抽象方法设计的初衷是希望定义一个必须由子类实现的方法规范,但是private修饰符限制了访问范围仅在定义它的类内部,子类就无法对抽象方法进行访问和实现,这与抽象方法的初衷相违背的,所以private 与abstract之间是存在根本的语义冲突和设计原则上的不符。
3.3抽象方法不能被final和static修饰
如下图final和static修饰编译器都会报错
原因:被static修饰的方法是静态方法,静态方法是属于类的,而不是类的实例,因此静态方法不能被重写(重写需要依赖类的实例),final表示“最终的”,“不可变的”,因此被final修饰的方法也不能被重写。但是抽象方法设计初衷就是要被子类重写的,这与抽象方法的初衷相违背,所以abstract与final,abstract与static是不能同时出现的。
3.4抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类
如下图中Dog子类未实现抽象类的抽象方法,则Dog类也必须为抽象类,Cat子类实现了抽象类的抽象方法,因此不需要再加abstract
(4)抽象类目的
有个问题,既然普通的类和普通的方法也可以被继承和重写, 那么为啥非得用抽象类和抽象方法呢
(5)抽象类小结
(二)接口
(1)接口的定义
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)——>百度百科
(2)接口语法
接口的定义和类相似,只需将class换成interface就定义了一个接口
如下就定义了一个接口Mouse
public interface Mouse {//Mouse接口
void click();
}
(3)接口的使用
要使用接口,需要有一个类使用implements来实现该接口,并实现接口中的所有抽象方法
如下代码中,Computer类实现了Mouse接口,并实现接口中抽象方法click()
public interface Mouse {
void click();
}
class Computer implements Mouse{
public void click() {//实现抽象方法
System.out.println("鼠标点击");
}
}
(4)接口特性
4.1不能直接new出接口的实例对象
4.2接口中的方法默认是public abstract修饰的方法
如下图中,接口中的方法除了 public abstract 能够修饰,其他任何修饰符组合都不能修饰,第一句中没有任何修饰符也未报错,说明接口中的方法会被隐式的指定为 public abstract
但在jdk8中引入了个新特性,接口中也能定义一个default修饰的有具体实现的方法
如下图的click2方法
4.3接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
因为接口中方法被隐式地指定为public abstract修饰,所以为抽象方法,与抽象类中的抽象方法类似,只能由实现接口的类来实现方法。
4.4重写接口中方法时,不能使用默认的访问权限
、
原因:Java的访问控制规则要求子类(或实现类)不能降低父类(或接口)中方法的访问级别(接口方法为public,默认级别为default),因为如果允许子类降低方法的访问级别,那么依赖于父类方法的客户端代码可能会突然失去对这些子类方法的访问权限,导致运行时错误或编译时错误。这破坏了程序的稳定性和可预测性。
4.5 接口中的变量会被隐式的指定为 public static final 变量
4.6接口中不能有静态代码块和构造方法
4.7 接口编译完成后字节码文件的后缀格式也是.class
4.8 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
4.9接口之间可以实现多继承即一个接口继承多个接口
![](https://i-blog.csdnimg.cn/direct/ef3f0bdb9ac840bda0b15f63bf5a390d.png)