版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/f2764052703/article/details/88962800
在现实世界的实际开发过程中,人们发现在程序设计过程中有的类中的方法是为了让子类继承的,是为了增强程序的可扩展性而存在的,为了让子类能够强制的重写父类的这个方法,并且参数,返回值,函数名也不能有一点改变,就出现了abstract关键字
abstract
使用abstract修饰的方法是抽象方法,抽象方法有以下特点:
- 抽象方法只有声明,没有实现,抽象方法必须由子类进行重写实现。
- abstract 关键字不能应用于 static、private 或 final 方法,因为这些方法不能被重写。
拥有抽象方法的类叫做抽象类,抽象类使用abstrat class
进行声明。抽象类具有以下特点:
-
抽象类不能被实例化对象,想要实例化对象就必须实现全部方法,实现全部方法后这个类就不是抽象类。(实例化没意义)。
-
子类继承自抽象类,必须实现抽象类的全部抽象方法,这样的子类也叫具体类,具体类才可以被实例化(这个实现全部方法方法的子类不是抽象类,抽象类不能实例化)。如果没有实现全部抽象方法,那么这个子类必须也是抽象类。
-
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
-
抽象类中可以有非抽象方法,可以有变量
-
构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
举个栗子:
package objectStudy;
public class main {
public static void main(String[] args) {
B b = new B();
b.see();
b.ko();
}
}
abstract class A{
int a;
int b;
abstract public void see();
public void ko(){
System.out.println("hello world");
}
}
class B extends A{
@Override
public void see() {
System.out.println("this is a method of abstract");
}
}
接口(Interface)
在后来的研发过程中,老板只是想要给员工定义一些规范,并不去考虑怎么去实现具体的功能,使用完全的abstract类有些不太合适,因为类是单继承的,无法同时实现多个规范,所以就使用了支持多继承的接口(Interface)来为员工定义编写规范。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
接口的特点:
- 接口没有构造方法。
- 接口中所有的方法必须是抽象方法。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被类继承了,而是要被类实现。
- 类是单继承的,而接口支持多继承。
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为public abstract(只能是 public abstract,其他修饰符都会报错)。
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量,也就是常量(并且只能是 public,用 private 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
再举个栗子:
package objectStudy;
public interface interfaceTest {
// here only can define static final value
static final int a = 4;
public abstract void see();
}