今天下午看了郝斌的java视频,终于对抽象类和接口有了理解。
抽象类的由来:利用抽象类是为了更好的对类加以分类,就如同人类不但给各种具体的植物去了名字还发明了“植物”这个抽象的词对所有的具体植物进行分类一样。
抽象类通常用来作为一个类族的最顶层,用最底层的类表示现实中的具体事物,用最顶层的类表示该类族的事物的共性。
抽象方法:没有方法体的方法。
class A{
abstract public void f();//抽象方法前面必须有abstract,后面必须以分号结尾。
}
**有抽象方法的类一定是抽象类,但是抽象类不一定有抽象方法,所以上面的类前必须加abstract。
abstract class A{
abstract public void f();
}
某一个类继承抽象类可以是抽象类,也可以不是。如果不是,则必须重写方法,加上具体的方法体。
关于抽象类的使用:
abstract class A{
abstract public void f();
}
class B extends A{
public void f(){
System.out.println("BBB");
}
}
public class Test{
public void main(String[] args){
//A aa = new A();//错误 第11行
B bb = new B();
bb.f();
A aa;//正确。可以定义一个抽象类的引用,但不可以定义一个抽象类的对象,所以第11行错误,而这行正确。
aa = bb;
aa.f();//这里利用了多态的知识点。
}
}
final关键字:可以修饰类,类中的属性,类中的方法。
修饰类则是最终子类,不能再被继承;修饰属性则常量不能被修改;修饰方法则可以被子类继承,但不能被子类重写。
final修饰属性:该属性必须被赋值且只能被赋值一次。(引申:全局变量(成员变量)初始化没有被赋值,则是默认值0;局部变量初始化没被赋值则是垃圾值,如果被使用,则会报错。)属性被初始化有两种方式:1.在定义成员变量的同时初始化;2.在类中所有的构造函数中初始化。
接口的定义:就是抽象方法和常量值的集合。从本质上来说是一种特殊的抽象类。
格式:[public]interface interfaceName [extends SuperInterfaceList(可以继承多个接口)]
{
常量定义和方法定义;
}
关于接口的一些语法:
1.接口中定义的属性必须是public static final的,而接口中定义的方法则必须是public abstract的,因此这些修饰符可以部分或全部省略。
2.接口中定义的属性的值在实现类中不能被更改,因为是final的。
3.一个类只能实现某个接口(implements),而不能继承某个接口。
4.接口可以继承接口,还能继承多个接口。
5.如果一个类只实现了一个接口的部分方法,则该类必须声明为抽象类,因为该类中还存在抽象方法。
6.一个类可以继承一个父类的同时实现一个或多个接口,但extends在前。(一个类想要实现接口中的方法时,必须得在方法前加上public,因为重写方法,要同名同参同返回值,同时作用范围不能缩小,接口中的方法都是public修饰的,所以重写的方法也必须用public修饰。)
7.不可以new接口对象,但可以定义一个接口引用类型的变量并将其指向实现接口的对象,达到多态的目的(详见抽象类相关知识)
接口的作用:
1.通过接口可以实现不相关类的相同行为。如:java规定所有可以完成自我复制功能的类都必须得实现java.lang.Colneable接口,但该接口确实空的,该接口中没有任何内容,目的只是为了起个标志作用
2.接口提供了不同对象进行协作的平台。如事件处理。
3.接口弥补了类只能单继承的缺点。
4.接口使我们了解一个类功能的重要途径。如:java整个容器框架就是以接口的方式建立起来的,实现不能接口的类完成的是不同的功能,接口是我们了解一个类功能的重要途径。
希望此文能够对大家有帮助。