注:本章节用来复习抽象和接口。
一、抽象abstract
①被abstract关键字修饰的方法称为抽象方法,抽象方法没有方法体;
②被abstract关键字修饰的类是抽象类,如果一个类中包含了抽象方法,那么这个类必须是抽象类;
③当一个子类继承了抽象父类后,两种解决方案:
-
方案1:变成抽象子类,子类也不实现,继续抽象;
-
方案2:变成普通子类,实现抽象父类中的所有抽象方法。
④抽象类不可以创建对象(实例化)。
⑤抽象类是有构造函数的,但不是自己使用,是为了子类super()使用;
⑥抽象类中可以定义成员变量和成员常量;
⑦抽象类中可以全部都是普通方法或者全是抽象方法,或者半普半抽;
⑧如果一个类不想被外界实例化,可以把这个类声明成抽象类。
1.2abstract的注意事项
抽象的方法要求子类必须重写,那么当abstract与下列关键字一起使用时,在抽象类中是没有意义的:
- private:被私有化之后,子类就无法重写,与abstract相违背;
- static:静态优先于对象存在,存在加载顺序的问题;
- final:被final修饰后,无法重写,与abstract相违背。
/**本类用作抽象类的入门案例*/
public class AbstractDemo {
public static void main(String[] args) {
/**4.抽象类不可以创建对象(实例化);
* */
// Animal a1 = new Animal();
Animal a2 = new Pig();
a2.eat();
a2.fly();
a2.fly2();
}
}
/**2.被abstract关键字修饰的类是抽象类,如果
* 一个类中包含了抽象方法,那么这个类必须被声明成一个抽象类*/
abstract class Animal{
public void eat(){
System.out.println("吃啥都行~");
}
public void play(){
System.out.println("玩啥都行~~");
}
/**1.被abstract关键字修饰的方法称为抽象方法,抽象方法没有方法体*/
public abstract void fly();
public abstract void fly2();
}
/**3.当一个子类继承了抽象父类以后,有两种解决方案:
* 方案1:变成抽象子类,子类也不实现,继续抽象
* 方案2:变成普通子类,实现抽象父类中的所有抽象方法*/
//abstract class Pig Animal(){} ---方案1
class Pig extends Animal{
@Override
public void fly() {
System.out.println("可以还清~~起飞~");
}
@Override
public void fly2() {
System.out.println("抽象父类中所有的抽象方法都需要被实现~!");
}
}
/***********************************************************/
**本类用于抽象类中构造方法的测试
* 1.抽象类是有构造方法的;
* 2.抽象类不能创建对象,有构造方法,不是为了自己创建对象时使用,而是为了子类创建对象时使用super()
* */
public class AbstractDemo2 {
public static void main(String[] args) {
// Animal2 a = new Animal2();
Pig2 p = new Pig2();
}
}
/**1.抽象类中可以定义成员变量;
* 2.抽象类中可以定义成员常量;
* 3.抽象类中可以定义普通方法;
* 4.抽象类中可以都是普通方法;
* 5.如果一个抽象类都是普通方法,为什么还要被声明成抽象类?
* 因为抽象类不可以被实例化,所以如果不想让外界创建本类的对象,就可以把普通类声明成抽象类
*6.抽象类中可以定义抽象方法,也可以都是抽象方法
* */
abstract class Animal2{
public Animal2(){
System.out.println("这是抽象类的含参构造函数");
}
}
/**抽象类不能创建对象,抽象类有构造方法*/
class Pig2 extends Animal2{
public Pig2(){
super();//调用父类的无参构造
System.out.println("这是Pig2的构造方法~");
}
}
二、接口
接口在Java中是一种抽象类型,接口中的内容是抽象形成的需要具体实现的功能,接口更像是一种规则和一套标准。
接口特征:
- 通过interface来定义,通过implements让子类实现接口;
- 接口里是没有构造方法的;
- 如果一个类没有明确指定自己的父类,默认继承顶级父类Object;
- 接口里没有成员变量,有的是静态常量,会默认拼接成public static final int n = XX;
- 接口里的抽象方法可以简写,会默认拼接public abstract。
- 可以把接口理解成一个特殊的抽象类,但是接口不是类!!!
- 描述类的是一类事物的属性和方法,接口则是包含实现类要实现的方法;
- 接口和类之间可以多实现,接口与接口之间可以多继承;
- 接口是对外暴露规则,是一套开发规范;
- 接口提高了程序的扩展性,降低了耦合性;
/**本类用于测试面向接口编程*/
public class TestTeacherInter {
public static void main(String[] args) {
CGBTeacher ct = new CGBTeacher();
ct.ready();
ct.play();
ct.teach();
}
}
//创建老师接口,接口是先天设计的结果吗,最先设计的就是接口,要制定规则
interface Teacher{
void teach();//public abstract void teach()
void play();//public abstract void play()
void ready();
}
class CGBTeacher implements Teacher {
@Override
public void teach() {
System.out.println("授课电商项目~");
}
@Override
public void play() {
System.out.println("备课电商项目~");
}
@Override
public void ready() {
}
}
class SCDTeacher implements Teacher{
@Override
public void teach() {
}
@Override
public void play() {
}
@Override
public void ready() {
System.out.println("正在备课....");
}
}
/******************************************************************/
/**本类用于测试接口中的成员*/
public class TestUserInter2 {
public static void main(String[] args) {
UserInter2Impl i2 = new UserInter2Impl();
System.out.println(i2.n);
System.out.println(i2.NAME);
System.out.println(UserInter2.NAME);
//UserInter2.n = 40;//常量的值不可以被修改
/**3.接口中可以定义抽象方法*/
/**4.接口中的抽象方法定义时可以简写,会自动给方法拼接上public abstract*/
}
}
interface UserInter2{
/**1.接口中不可以定义成员变量
* 2.接口中的是静态常量,实际上的写法是:public static final int age = 20;
* 只不过接口中可以省略不写,会默认拼接,我们写成int age = 20;也可以
* */
public static final int n = 100;
final String NAME = "swx";
}
//创建接口的实现类
class UserInter2Impl implements UserInter2{
}