将公共的能实现的功能实现,不能具体实现的功能定义声明好抽象作为模板,子类根据模板暴露的声明去具体实现。
只有方法定义声明,无方法体的方法称为抽象方法,需要使用abstract修饰。
修饰符 abstract 返回值类型 方法名([参数列表]);
含有抽象方法的类肯定是抽象类,必须被abstract修饰。
成员变量:同普通类的成员变量。
成员方法:可以是普通成员方法,也可以是抽象成员方法。
抽象类不能实例化:抽象类的子类必须重写父类的抽象方法,并提供方法体,若没有重写全部的抽象方法,仍是抽象类。
抽象类成员同普通类成员,并且可以有抽象方法,也可以没有抽象方法(限制使用new创建对象).
abstract不能修饰成员变量和常量。
bastract不能和final,static,private修饰符一起使用。
final:修饰符,最终的,最后的,定型的。
(1)可以修饰成员变量,成员一旦赋值就不能被修改。
(2)可以修饰成员方法,这个方法不能被修改。
(3)可以修饰类,被修饰的类就是最终的类,不能被继承(不让子类重写其功能)
当某个体系的向上抽取的共性数据全部是抽象的成员声明(规范,标准)称为接口,java中将接口用interface来表示(特殊的类)
广义的接口概念:对外暴露的规范和标准。
接口用关键字:interface表示。 interfact 接口名{.....}
子类实现接口用:implements表示。 class 子类名 implements 接口名{....}
按照多态的方法来实例化,即为让接口的子类指向接口引用。
接口的成员属性全部是public static final 修饰的常量,成员方法全是抽象方法。以上的修饰符的可以省写(不建议,阅读性差)
注意:jbk1.8版本后接口中可以使用default修饰符的非抽象默认方法,用于扩展新接口功能,同时保留原有的接口的功能。
可以是抽象类,但意义不大。
可以是具体类,要重写接口中的所有抽象方法。(推荐使用)
类和接口是实现关系,子类可以使用implements多个实现。(同时实现多个接口)
子类在继承和实现同时存在,要先extends父类,然后implements实现接口。
是用于对外提供扩展功能使用的(不是体系固有的功能)
事物表现出来的多种形态,编译和运行时表现的形态不一样,这种现象称为多态。
父类型 引用变量 = 子类对象
接口类型 引用变量 = 子类对象
编译期:向上造型,编译期看多态左侧是否有对应成员(成员属性和成员方法)有则编译通过,无则不用报错。
运行期:向下造型,运行时
成员变量:看多态左侧
成员方法:看多态右侧
总结:
成员变量:编译看左侧,运行看左侧。
成员方法:编译看左侧,运行看右侧。
package animls;
abstract class animal{
String name="小黑";
public abstract void call();//叫声的抽象方法,没法明确是什么动物叫
//public abstract void eat();//吃的抽象方法,没法明确是什么动物吃
public String getName() {
return name;
}
public void setName(String name){
this.name=name;
}
public void eat(){//吃的方法
System.out.println("动物什么都吃");
}
}
class Cat extends animal implements A,B{
String name="小白";
@Override
public void call() {
System.out.println(super.name+"喵喵叫");
System.out.println(this.name+"喵喵叫");
}
@Override
public void eat() {
System.out.println(name+"的猫正在吃鱼");
}
public void DaiMa(){//自己特有的功能
System.out.println(name+"正在敲代码");
}
@Override
public void Game() {
System.out.println(name+":打游戏");
}
@Override
public void TingYinLe() {
System.out.println(name+"正在听音了");
}
}
interface A{
abstract public void Game();//打游戏的能力
}
interface B{
abstract public void TingYinLe();//听音乐的能力
}
public class Lconog {
public static void main(String[] args) {
animal xb = new Cat();
System.out.println(xb.name);//多态变量:编译看左侧,运行也看左侧。
xb.eat();//多态方法:编译看左侧,运行看右侧。
((Cat)xb).eat();//向下转型
// xb.DaiMa(); /*为什么这个就没法运行,因为animal左侧没有,这个方法,所以编译失败*/
}
}