1. 抽象类
用关键字abstract修饰的类,都是抽象类,不能被实例化。
而含有一个或多个抽象方法的类必须定义为抽象类,否则会报错。
即使不包括任何abstract 方法,亦可将一个类声明成“抽象类”。
如果一个类没必要拥有任何抽象方法,而且我们想禁止那个类的所有实例,这种能力就会显得非常有用。
抽象方法,只有声明,没有实现主体。
抽象方法声明: 权限 abstract 返回类型 方法名(形参表);
e.g: public abstract void fun();
抽象类声明: 权限 abstract class 类名
e.g: public abstract class Test{
}
抽象类可以定义成员变量、成员方法,可以有构造方法。
如果子类没有实现父类的所有抽象方法,子类也需要定义为abstract抽象类。
2.接口
接口声明: public interface 接口名{
}
接口中的方法必须是抽象方法,只有函数声明、没有实现。
接口中可以含有 变量和方法。
但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),即只能是常量,接口中的数据对所有实现类只有一份,所以是static;
而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误)。
接口中没有构造方法。
3. 类: 单继承
接口:多继承
4. 练习题,注意接口里面方法的权限
package com.xiyou.weijie.chap5;
public interface JavaInterface {
int a = 10;
void show();
}
package com.xiyou.weijie.chap5;
public class Test implements JavaInterface {
void show() {
// TODO 自动生成的方法存根
}
}
上述代码错在哪里?
解答:
由于接口中的方法会全部默认为public, 而在实现接口时,show()方法的权限为无修饰符,低于public,违背了方法覆盖的要求。(见博客Java继承1-上溯造型)
所以Test类中的方法应为 public void show(){
}