一、抽象类
1、抽象方法和抽象类(abstract)
(1) 抽象方法不能含有方法体
public abtract void test(); √
public abtract void test(){ }; ×
(2) 抽象类无法被实例化,只能当做父类被继承
抽象类无法使用new关键字调用抽象类的构造器创建抽象类的实例,它的构造器是为给子类准备的,在创建子类的是实例时会被调用。
(3) 抽象类可以包含
初始化块
·
构造器
成员变量
方法 (普通方法和抽象方法)
内部类 (接口、枚举)
只有抽象类和抽象方法,没有抽象变量、抽象构造器的说法。
(4)抽象方法————>>抽象类
如何一个类中含有抽象方法,那么这个类肯定是抽象类;
如果一个类是抽象类,那么这类中未必含有抽象方法。
当使用static修饰一个方法时,表明该方法属于类本身,通过类本身就可以调用该方法,但是如果方法被定义成了抽象方法,那么就会出现调用了一个没有方法体的方法的错误。所以
static和abstract不能同时修饰某个方法,即没有所谓的抽象类方法
二、接口
接口定义的是多种类共同的公共行为规范,所以如果使用访问权限修饰符,修饰接口里的成员,只能用public。
1、定义接口
[修饰符] interface 接口名 extends 父接口1,父接口2.........
{
0-n个常量定义...
0-n个抽象方法、类方法、默认方法定义
0-n个接口、内部类、枚举定义...
}
语法的详细说明如下:
·
·`
① 修饰符可以是public或者省略,如果省略了public访问控制符,默认会采用包访问控制符,即只有在相同包结构下才可以访问接口。
②接口名与类名采用相同的命名规则,每个单词首字母大写,单词与单词间,无需任何分隔符。
③一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。
因为接口定义的是一种规范,所接口中不能含有代码块和初始化块定义。
·接口里包含的成员:
·
· 成员变量(静态常量)
·方法(只能是抽象实例方法、类方法、默认方法)
·内部类(内部接口、枚举)
接口内定义的变量只能是静态常量,就算不写,也默认自己加上了
//系统自动的为接口里定义的成员变量增加public static final修饰符
int MAX_SIZE=100;
public static final int MAX_SIZE=100;
接口中定义的方法只能是抽象方法、类方法、默认方法
类方法和默认方法得有方法体。
·抽象方法
·
系统将自动的将普通方法增加abstract修饰符,最终就是,无论定义接口里的普通方法时加不加abstract,都会默认加上public abstract修饰符。
·类方法
·
类方法使用static修饰,类方法可以直接使用接口调用
·默认方法
·
默认方法必须使用default修饰,该方法不能使用static修饰,所以不能通过接口调用,而是通过使用接口的实现类实例来调用这些默认方法。
默认方法,接口的子类不需要实现,可以直接使用。
package com.printer;
interface Product{
int getProduceTime();
}
interface Output{
static final int MAX_CACHE_LINE = 50;
void out();
void getData(String msg);
default void print(String... msgs){
for(String sTem:msgs)
{
System.out.println(sTem);
}
}
}
public class printer implements Product,Output{
//存储打印对象的数组
private String [] printData=new String [MAX_CACHE_LINE];
//存储对象的数目
private int dataNum=0;
//
@Override
public int getProduceTime() {
return 45;
}
@Override
public void out() {
while (dataNum>0){
//打印第一个对象,之后数组整体前移一位
System.out.println("Printer打印了——:"+printData[0]);
System.arraycopy(printData,1,printData,0,--dataNum);
}
}
public void getData(String msg) {
if(dataNum>MAX_CACHE_LINE){
System.out.println("糟糕!!!打印序列已满,添加失败!");
}
else{
printData[dataNum++]=msg;
}
}
public static void main(String args[]){
Output o=new printer();
o.getData("Hello World!!!");
o.getData("Hello Cruel World!!!");
o.out();
o.getData("Hello World2222!!!");
o.getData("Hello Cruel World!!!2222");
o.out();
o.print("李白","杜甫","马云");
Product p=new printer();
System.out.println(p.getProduceTime());
}
}