Java学习12

152 阅读6分钟

「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」。

interface关键字

interface是面向对象编程语言中接口操作的关键字,其主要的功能是把所需的成员进行组合,用来封装对象功能的集合。它就像一个模板,定义了对象需要实现的成员属性或者方法,通过类或结构来实现它。接口是不能直接进行实例化

INewsImpl news = new NewsImpl()是错的。

必须用一下的方法进行实例化

INews100 news = new NewsImpl()。

接口不能包含任何成员的代码,只能定义成员属性或方法的本身。接口成员的具体代码由实现接口的类具体提供。接口使用必须用interface关键字进行声明。

接口的使用限制:接口里不能是private、protected,只允许使用public,不管是属性还是方法,其权限只能是public当中的一个子类实现接口并且又需要进行继承抽象类时,首先使用extends继承一个抽象类,再使用implements实现一个接口。extends可以继承多个父类,但是interface只能使用实现一个接口,不支持多个接口的继承。

接口指明了一个类必须要做什么和不能做什么。一个接口就是描述一种能力,如果一个类实现了一个接口中所要求的所有的方法,然而没有提供方法体而仅仅只有方法标识,那么这个类一定是抽象类。(抽象方法只能存在于抽象类或者接口中,但抽象类确能存在非抽象方法,既有方法体的方法。接口其实是一个抽象类),接口通常也被用于描述一种现象。

继承是java语言的三大特征之一。 可降低代码编写的冗余度,减少重复代码的出现,提高编程的效率。通过继承,子类能获得父类的成员变量和方法。通过继承还可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量。

继承优点:继承过来的字段和方法,可以像其他字段一样直接被使用;在子类中可以声明一个与父类中同名的新字段或静态方法,从而隐藏父类中的字段或方法。还可以进行方法覆盖。子类继承了父类的所有成员及方法,在某种情况下,子类的方法又和父类的方法不同,此时可以通过重写来进行实现。当调用被重写的方法时,调用的版本是之类的方法,调用被隐藏的方法时,取决于从父类中调用还是从子类中调用。

接口的使用原则: 1、接口必须要有子类,但此时一个子类可以使用implements关键字实现多个接口; 2、接口的子类,那么必须要覆写接口中的全部抽象方法; 3、接口的对象可以利用子类对象的向上转型进行实例化; 4、对于子类而言,除了实现接口外,还可以继承抽象类。

接口跟抽象类从继承角度相比: 一个抽象类只能继承一个抽象父类,而接口可以继承多个接口;一个子类只能继承一个抽象类,却可以实现多个接口(在Java中,接口的主要功能是解决单继承局限问题)。

接口可以定义一系列的内部结构,包括内部的普通类、抽象类、内部接口, 其中使用static定义的内部接口相当于一个外部接口

interface INews100{
    public abstract String get() ;
    String MSG = "www.aka.com";//即便不写public也是public
}
abstract class AbstractMessage implements INews100{
    //只有接口中的abstract才能省略
    public abstract void print();
        }
class NewsImpl extends AbstractMessage implements INews100{
    public String get(){    //权限更严格,所以无法覆写
        return MSG;
    }
    public void print(){
        System.out.println("ssss");
    } //有方法体就叫覆写
}
public class Day12 {
    public static void main(String[] args) {
            INews100 news = new NewsImpl();
        System.out.println(news.get());
        //NewsImpl是抽象类和接口的共同子类
        AbstractMessage am = (AbstractMessage) news;
        am.print();
    }
}
//代理设计模式
//代理的业务操作都会有一个与之辅助的功能类共同完成。
interface ISubject{
    public void save();  //核心功能1是救人
}
class RealSubject implements ISubject{
    public void save(){
        System.out.println("英勇的制止了犯罪分子");
    }
}
class ProxySubject implements ISubject{     //代理实现
    private ISubject subject;//真正的操作业务
    //在创建代理类对象的时候必须设置要代理的真实主题
    public ProxySubject(ISubject subject){
        this.subject = subject;
    }
    public void broke(){
        System.out.println("破门而入");
    }
    public void get(){
        System.out.println("得到见义勇为奖");
    }
    public void save(){     //接口子类一定要实现的抽象方法
        this.broke();       //真是操作前的准备
        this.subject.save();//调用真实的业务
        this.get();         //操作后的准备
    }
}
class Factory100 {
    public static ISubject getInstance(){
        return new ProxySubject(new RealSubject());
    }
}
public class Test16 {
    public static void main(String[] args) {
        ISubject sub = Factory100.getInstance();
        //通过代理类对象发出,利用代理类来实现真实业务调用
        sub.save();         //救人的核心操作
    }
}
//使用接口定义标准
//使用接口和对象多态性的概念结合之后,对于参数统一更加明确。
interface USB{
    public void setup();//安装USB驱动
    public void work();//进行工作
}
class Computer{
    public void plugin(USB usb){//只能够插USB设备
        usb.setup();//安装
        usb.work(); //工作
    }
}
class Flash implements USB{     //定义一个USB设备
    public void setup(){
        System.out.println("安装U盘驱动!");
    }
    public void work(){
        System.out.println("进行数据传输!");
    }

}
class Print implements USB{     //定义一个USB设备
    public void setup(){
        System.out.println("安装打印机驱动!");
    }
    public void work(){
        System.out.println("进行文件打印!");
    }

}
public class Test14 {
    public static void main(String[] args) {
        Computer com = new Computer();
        com.plugin(new Flash());
        com.plugin(new Print());
    }
}
    com.plugin(new Flash());
    com.plugin(new Print());
}

}

最后: 如果要初始化父类中的字段,可以在子类的构造方法中通过关键字super调用父类的构造方法;对父类的构造放的调用必须放在子类构造方法的第一行;父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器;父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表;子类是不继承父类的构造器(构造方法或者构造函数),他只是调用了隐式或者显示。 接口还是多个类的公共规范: 在java1.7版本中接口包含的内容有常量和抽象方法,在java1.8中,接口包含额外的默认的方法和静态方法,在java9中还额外增加了私有方法。