抽象类和接口

一、抽象类

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());
        }
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值