初入社会的萌新Java选手-----总结Java基础知识2

时间:2021-11-04 20:00:42

2.抽象类和接口

抽象类:在描述事物时,没有足够的信息描述一个事物,这时这个事物就是抽象的。

即在定义一个对象(类)的时候,无法对某个方法进行具体化。

特点:1.抽象类和抽象方法都需要被abstract关键字修饰,抽象方法一定要定义在抽象类中,

但抽象类中可以不全部是抽象方法

2.抽象类不可以创建实例,原因是调用抽象方法无意义

3.只有覆盖了抽象类中所有的抽象方法后,子类才可以实例化,否则仍是一个抽象类

细节:1.抽象类一定是一个父类吗?

抽象类一定是父类,因为抽象类是通过不断向上抽去得来的,一定有某个或某些类实现了

它的抽象方法

2.抽象类是否有构造方法?

有,虽然不能给自己的对象初始化,但是可以给自己的子类对象初始化

3.抽象类中是否可以不定义抽象方法

可以,abstract关键字的存在可能仅仅是不允许该类实例化

4.抽象关键字abstract不可以和哪些关键字共存?

finalfinal修饰的类没有子类

privateprivate修饰的类不允许被覆盖

static 静态修饰的类会在编译时自动就实例化了,固可以直接调用,但抽象类不允许实例化

抽象类与一般类的异同点: 同:1.它们都是用来描述事物的 2.它们里面都可以定义属性和方法

异:1.一般类可以具体地猫叔事物,抽象类描述的事物信息不具体

2.抽象类中可以定义一个成员:抽象方法

3.一般类可以实例化(创建对象),抽象类不行


接口:一种抽象类型,是抽象方法的集合,用interface声明,且其中的成员有固定的的修饰符

变量的修饰符:public static final方法的修饰符:public abstract

特点:1.接口不可以创建对象

2.子类必须实现接口中内所有的抽象方法,否则子类就是一个抽象类

3.接口不可以被类继承extends,只可以被实现implements

接口的作用:1.接口的出现对功能实现了扩展

2.接口的出现定义了规则

3.接口的出现降低了耦合性PS:甲在使用这个规则。乙在实现这个规则

注意:类负责描述事物的基本功能(属性和方法),而接口负责描述事物的扩展功能(抽象方法)

举例(网上摘抄):

抽象函数的作用有很多,我就举一个例子,(mars老师的例子):
打印机:
父类---Printer
子类---HBPrinter
子类----CanonPrinter
测试类----Test
//定义一个打印机类
abstract class Printer{
//定义三个成员函数
void open(){
System.out.println("open");
}


void close(){
System.out.println("close");

abstract void print(); 
}


//定义一个HB(惠普)打印机
class HBPrinter extends Printer{
//复写Printer的print
void print(){
System.out.println("我是惠普打印机");
}
}


//定义一个佳能打印机
class CanonPrinter extends Printer{
//复写Printer的print方法
void print(){
System.out.println("我是佳能打印机");
}
}




//测试函数
class Test{
public static void main(String args [] ){
//向上转型
Printer p1 = new HBPrinter();
p1.open();
p1.print();
p1.close();


Printer p2 = new CanonPrinter();
p2.open();
p2.print();
p2.close();
}
}
输出


open
我是惠普打印机
close
open
我是佳能打印机
close






 如果父类Printer没有用abstract其方法print也没用abstract,那么当其子类有很多时,突然某一个子类忘记复习print()方法,
那么问题就出现了:可以正常运行,但是打印有问题,不知道哪里出错了,
 而当有用抽象,那么其子类忘记复写时,就会出错,提示哪一个有问题,就可以bug