一、抽象类、抽象方法
1、抽象类
抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。
1. 被abstract关键字修饰的类叫抽象类
2. 抽象类不能被实例化(无法使用new关键字创建对象实例)
3. 抽象类可以包含属性,方法,构造方法,普通方法,抽象方法,初始化块,内部类,枚举类
4. 含有抽象方法的类一定是抽象类
5. 不能全部实现抽象类里面的抽象方法的方法是抽象方法
6. abstract不能与private、static、final、native并列修饰同一个方法
7. 抽象类不能用final来修饰
2、抽象方法
抽象方法就是在类中没有方法体的方法,就是抽象方法。
1. 被abstract关键字修饰方法就叫抽象方法
2. 仅有声明而没有方法体,如abstract void f();
3. 格式:
访问修饰符 abstract <返回值类型> <方法名> (参数列表);
例子:Students类和Teacher类都继承实现抽象类Person实现抽象方法f()
abstract class Person {//抽象类
public abstract void f();//抽象方法
}
class Students extends Person { //实现抽象方法
public void f() {
System.out.println("学生类实现抽象方法f()");
}
}
class Teacher extends Person { //实现抽象方法
public void f() {
System.out.println("教师类实现抽象方法f()");
}
}
public class Test3 {
public static void main(String[] args) {
Person s = new Students();
Person t = new Teacher();
s.f();
t.f();
}
}
二、接口
接口(Interface),在JAVA中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
- 成员变量会默认有public static final修饰,所以必须初始化
- 方法都会默认public abstract修饰,没有方法体,不能实例化
- 接口中只能包含public static final的成员变量和public abstract的成员方法
- 接口中没有构造方法,不能被实例化
- 一个接口不能实现另一个接口,但是可以继承其他多个接口
- 一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类
接口特性:
- 接口中的方法默认都是public abstract(只能是 public abstract,其他修饰符都会报错)
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法
重写接口中声明的方法时,需要注意以下规则:
- 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
- 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
- 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。
接口格式
[可见度] interface 接口名称 [extends 其他的类名] {
声明变量;
抽象方法;
}
接口实现
...implements 接口名称[, 其他接口, 其他接口..., ...] ...
注:类描述对象的属性和方法,接口则包含类要实现的方法。
例子
Animal.java
interface Animal {
public void eat();
public void travel();
}
Cat.java
public class Cat implements Animal{
public void eat(){
System.out.println("Cat eats");
}
public void travel(){
System.out.println("Cat travels");
}
public int noOfLegs(){
return 0;
}
public static void main(String args[]){
Cat cat = new Cat();
cat.eat();
cat.travel();
}
}
运行结果
Cat eats
Cat travels
三、抽象类和接口区别
- 一个类可以实现多个接口,但只能继承一个抽象类
- 一个抽象类可以有若干个抽象方法(>=1),而接口的所有方法都是抽象的,无论是否将它的方法显示地声明为抽象的
- 一个抽象类可以有其他的东西,接口不能有static静态代码块以及静态方法和构造方法
- 一个抽象类可以声明实例变量,其子类可以继承这些实例变量。而一个接口不能声明实例变量,接口可以声明static和final变量
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的
四、练习题
2、下面说法正确的是()
-
A instanceof这个关键字是用来判定某个类是否为抽象类
B final关键字修饰的成员变量我们不需要初始化
C 接口的方法都是抽象方法(jdk1.8之前),并且没有方法体
D 当我们继承一个抽象类是我们必须实现抽象类的抽象方法
E 在向上转型的过程中,如果父类和子类拥有相同的名字的成员方法(非静态),则访问的是子类的该方法,如果父类和子类拥有相同名字的成员变量时,则访问的是子类的成员变量
F 内部类访问外部类的方法时,不用创建外部类的对象直接访问外部类的方法
G 内部类的变量不能设置为static,也不能设置为final
H 多态通常用来作为参数传入或者作为返回值返回
答案:CH
解析:A instanceof用来判断内存中实际对象A是不是B类型,B常量要初始化,D 抽象类可以不用全部实现继承的抽象类中的抽象方法,E 如果父类和子类拥有相同名字的成员变量时,则访问的是父类的成员变量 F 局部内部类需要创建一个外部类对象才能访问外部类方法,G 静态的内部类的变量和方法都可以设置为static
3、下面不正确的是()
-
A 不能和abstract一起使用的修饰符有static,final,public
B 抽象类之间是继承关系,接口之间也是
C 接口不能存在普通方法和常量
D 局部内部类可以用public、private修饰符修饰
E 接口不可以直接实例化,抽象类可以
答案:ACDE
解析:A abstract不能与private、static、final、native并列修饰同一个方法,C 接口中可以存在常量,D 局部内部类前不加修饰符public或private,其范围为定义它的所在代码块,E 接口中和抽象类都是不能被实例化的
4、下面哪些选项是正确的()
-
A instanceof是一个二元操作符,作用时来判断左边的对象是否是右边的类的实例,返回的是布尔类型
B private protected static 都不可以修饰interface
C this.属性名访问的是本类中的属性,如果本类中没有就从父类中继续查找
D 对象是对类的抽象化
E 接口中可以有常量
答案:BCE
解析:
8、以下说法正确的是()
-
A 抽象方法是一种功能契约,不实现抽象方法就无法构造对象
B 接口中的抽象方法只能是public的,而抽象类中的抽象方法可以用其他权限修饰
C类是对象的构造模型,刻画了对象中的所有信息
D抽象方法不能final来修饰,可以用static修饰
E 对计算公式已不需要改的数学函数,常用public static final修饰
F 若类中有final abstract修饰的方法,必须实现该方法才能构造对象
G 引用是对象的名字,引用值是对象的起始地址
答案:ABCEG
解析:D 抽象方法要被实现,所以不能是fianl的,因为他没有方法体所以不能是static,F final不能修饰abstract方法
9、下列说法错误的是()
-
A 抽象类必须被子类继承,子类在某些情况下可以不必覆写抽象类中的全部方法
B 对象向上转型以后,拥有相同名字的普通成员变量(静态变量)时,访问的是子类里面的
C super的主要功能是完成子类调用父类的内容,并且只能放在子类构造方法的第一行
D 接口的方法必须定义为public访问权限,并且方法只能是抽象方法(不考虑JDK1.8)
答案:B
解析:对象向上转型以后,拥有相同名字的普通成员变量(静态变量)时,访问的是父类里面的
11、下列定义正确的有哪些()
-
A 接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
B 抽象类中抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){};
C 抽象方法要被实现,所以不能是静态的,也不能是私有的
D 接口内只能有公共方法,1.8后也可有普通方法和成员变量
E 类实现接口,利用关键字implement完成
答案:ABC
解析:D 接口里面不能有public static的公共方法,E 是用implements关键字
12、以下说法不正确的是()
-
A 拥有抽象方法的类为抽象类
B 抽象类的方法是抽象方法
C 继承抽象类的子类为抽象类
D 实现接口的类为抽象类
答案:ABCD
解析:A 接口中的方法都是抽象方法,B抽象类中可以有普通方法和构造方法,C继承抽象类并全部实现抽象类中的方法的是普通类,D实现接口中的全部抽象方法的类是普通类。
20、在Java中,下面关于抽象类的描述正确的是()
-
A 抽象类可以被实例化
B 如果一个类中有一个方法被声明为抽象的,那么这个类必须是抽象类
C 抽象类的方法都必须是抽象的
D 声明抽象类必须带有关键字abstract
答案:D
解析:A抽象类和接口都不能被实例化 B 接口中的方法都是抽象方法 C抽象类的方法可以是抽象方法,也可以是构造方法,普通方法