Java抽象类与接口
xaiobit_hl 人气:01.抽象类的语法和特性
1.1语法
1.在Java中,一个类如果被abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。
// 抽象类:被abstract修饰的类 public abstract class Shape { // 抽象方法:被abstract修饰的方法,没有方法体 abstract public void draw(); abstract void calcArea(); // 抽象类也是类,也可以增加普通方法和属性,也可以包含构造方法 public double getArea() { return area; } protected double area; // 面积 }
1.2特性
1. 抽象类不能直接实例化对象
Shape shape = new Shape(); // 编译出错 -> 抽象类不能被实例化
2. 抽象方法不能是 private 的
abstract class Shape { abstract private void draw(); } // 编译出错 -> 抽象方法不能用private修饰
注意:抽象方法没有加访问限定符时,默认是public.
3. 抽象方法不能被 final 和 static 修饰,因为抽象方法就是用来被子类重写的,两者是”天敌“;
public abstract class Shape { abstract final void methodA(); abstract public static void methodB(); } // 编译报错: final和static修饰抽象方法,会出问题,二者属于”天敌“
4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要 使用 abstract 修饰
abstract class Shape { abstract void draw(); abstract public void calcArea(); } //1.实现抽象方法 class Cycle extends Shape { @Override void draw() { System.out.println("●"); } @Override public void calcArea() { System.out.println("Π*r*r"); } } //2.不实现抽象父类的抽象方法,但是将子类也定义为抽象类 abstract class Triangle extends Shape { }
5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
2.接口的语法和使用
2.1语法
1.接口的定义格式与类的定义差不多,只要把class改成interface关键字即可。
public interface IOperation { public abstract void method1(); public void method2(); abstract void method3(); void method4(); }
接口名的的注意事项:1.接口的命名一般以大写的 "I" 开头;2.接口的名字一般使用形容词性单词
推荐:阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性。
2.2特性
1.接口不能直接使用,必须要被一个类来 "实现",并且这个类要实现这个接口中的所有抽象方法
public interface IOperation { public abstract void method1(); abstract void method2(); } class A implements IOperation { //如果不重写接口中的抽象方法,代码在编译期间就会报错 //如果不想重写,那么这个类一定是抽象类 @Override public void method1() { } @Override public void method2() { } }
2.接口与接口之间是继承(extends)关系,类与接口之间是实现关系(implements)关系
public interface IOperation { } class A implements IOperation { } interface Io extends IOperation { }
3.接口类型是一种引用类型,不能实例化对象
4.接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是public abstract,其他修饰符都会报错)
public interface IOperation { private void method() { } //编译报错 }
5. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
public interface IOperation { void method(); //编译报错:接口中的方法不能自己实现 public abstract void A() { } }
6. 重写接口中方法时,不能使用 default 访问权限修饰 7. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量,不能改变
interface IA{ double a = 3.0; // 默认被:final public static修饰 } public class TestDemo { public static void main(String[] args) { System.out.println(IA.a); // 可以直接通过接口名访问,说明是静态的 //编译报错 IA.a = 2.0; // 说明brand具有final属性 } }
8. 接口中不能有静态代码块和构造方法
interface USB { // 编译失败:接口中不能有构造方法 public USB(){ } {} // 编译失败:接口中不能有实例代码块 void openDevice(); void closeDevice(); }
加载全部内容