一、抽象类
1.abstract修饰类:抽象类
- 不可被实例化
- 抽象类有构造器 (凡是类都有构造器)
- 抽象方法所在的类,一定是抽象类
- 抽象类中可以没有抽象方法
2.abstract修饰方法:抽象方法
- 格式:没有方法体,包括{}.如:public abstract void eat();
- 抽象方法只保留方法的功能,而具体的执行,交给继承抽象类的子类,由子类重写此抽象方法。
- 若子类继承抽象类,并重写了所有的抽象方法,则此类是一个"实体类",即可以实例化
- 若子类继承抽象类,没有重写所有的抽象方法,意味着此类中仍有抽象方法,则此类必须声明为抽象的!
注意:abstract 不能用来修饰属性、构造器、private、final、static
package com.yyx.pratice; public class JavaPratice { public static void main(String[] args) { Student stu = new Student(); /* 报错 Person person=new Person(); */ new Person() { //匿名类 @Override void sayWord() { System.out.println("我是一个匿名类"); } }.sayWord();; stu.sayWord(); } } abstract class Person { abstract void sayWord(); public void readBook() { System.out.println("人会读书"); } public Person() { System.out.println("抽象类有构造器,不能new实例化,但子类创建对象时我会先创建实例"); } } class Student extends Person { @Override void sayWord() { System.out.println("我是人的子类,我会讲话"); } }
运行结果:
抽象类有构造器,不能new实例化,但子类创建对象时我会先创建实例
抽象类有构造器,不能new实例化,但子类创建对象时我会先创建实例
我是一个匿名类
我是人的子类,我会讲话
二、接口
接口(interface) 是与类并行的一个概念
- 接口可以看做是一个特殊的抽象类。是常量与抽象方法的一个集合,不能包含变量、一般的方法
- 接口是没有构造器的
- 接口定义的就是一种功能。此功能可以被类所实现(implements)
- 实现接口的类,必须要重写其中的所有的抽象方法,方可实例化。若没有重写所有的抽象方法,则此类仍为一个抽象类
- 类可以实现多个接口。----java 中的类的继承是单继承的
- 接口与接口之间也是继承的关系,而且可以实现多继承
package com.yyx.pratice; public class TestInterface { public static void main(String[] args) { /* * 多态,不能调用接口没有,实现类有的方法 */ CC cPerson = new Person(); DD dPerson = new Person(); print(cPerson); printSpeak(dPerson); System.out.println(cPerson.age); } public static void print(CC c) { c.walk(); c.eat(); c.study(); } public static void printSpeak(DD d) { d.speak(); } } interface AA { void walk(); } interface BB { void eat(); } interface DD { void speak(); } interface CC extends AA, BB { // 接口支持多继承 final int age = 22; void study(); } class Person implements CC, DD { @Override public void walk() { System.out.println("人会走路"); } @Override public void eat() { System.out.println("人会吃饭"); } @Override public void study() { System.out.println("人会学习"); } @Override public void speak() { System.out.println("人会说话"); } public void swim() { System.out.println("人会游泳"); } }