discuz怎么做网站,网站通栏图片代码,韩国 网站设计,网络营销广告的形式1.1 接口的概念
在现实生活中#xff0c;接口的例子比比皆是#xff0c;比如#xff1a;笔记本电脑上的USB接口#xff0c;电源插座等。 电脑的USB口上#xff0c;可以插#xff1a;U盘、鼠标、键盘...所有符合USB协议的设备 电源插座插孔上#xff0c;可以插#xff…
1.1 接口的概念
在现实生活中接口的例子比比皆是比如笔记本电脑上的USB接口电源插座等。 电脑的USB口上可以插U盘、鼠标、键盘...所有符合USB协议的设备 电源插座插孔上可以插电脑、电视机、电饭煲...所有符合规范的设备 通过上述例子可以看出接口就是公共的行为规范标准大家在实现时只要符合规范标准就可以通用。 在Java中接口可以看成是多个类的公共规范是一种引用数据类型。 1.2 语法规则
接口的定义格式与定义类的格式基本相同将class关键字换成interface关键字就定义了一个接口。
public interface 接口名称{// 抽象方法
public abstract void method1(); // public abstract 是固定搭配可以不写
public void method2();abstract void method3();void method4();}// 注意在接口中上述写法都是抽象方法更推荐方式4代码更简洁 提示: 1. 创建接口时, 接口的命名一般以大写字母 I 开头. 2. 接口的命名一般使用 形容词 词性的单词. 3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性 1.3 接口的使用
接口不能直接使用必须有一个实现类 来实现该接口实现接口中的所有抽象方法。
public class 类名称 implements 接口名称{// ...}
注意子类和父类之间是继承关系类与接口之间是implements实现关系。 请实现笔记本电脑使用USB鼠标、USB键盘的例子 1. USB接口包含打开设备、关闭设备功能 2. 笔记本类包含开机功能、关机功能、使用USB设备功能 3. 鼠标类实现USB接口并具备点击功能 4. 键盘类实现USB接口并具备输入功能 // USB接口
public interface USB {void openDevice();void closeDevice();}// 鼠标类实现USB接口
public class Mouse implements USB {Overridepublic void openDevice() {System.out.println(打开鼠标);}Overridepublic void closeDevice() {System.out.println(关闭鼠标);}public void click(){System.out.println(鼠标点击);}}// 键盘类实现USB接口
public class KeyBoard implements USB {Overridepublic void openDevice() {System.out.println(打开键盘);}Overridepublic void closeDevice() {System.out.println(关闭键盘);}public void inPut(){System.out.println(键盘输入);}}// 笔记本类使用USB设备
public class Computer {public void powerOn(){System.out.println(打开笔记本电脑);}public void powerOff(){System.out.println(关闭笔记本电脑);}public void useDevice(USB usb){usb.openDevice();if(usb instanceof Mouse){Mouse mouse (Mouse)usb;mouse.click();}else if(usb instanceof KeyBoard){KeyBoard keyBoard (KeyBoard)usb;keyBoard.inPut();}usb.closeDevice();}}// 测试类
public class TestUSB {public static void main(String[] args) {Computer computer new Computer();computer.powerOn();// 使用鼠标设备computer.useDevice(new Mouse());// 使用键盘设备computer.useDevice(new KeyBoard());computer.powerOff();}}
1.4 接口特性 1. 接口类型是一种引用类型但是不能直接new接口的对象 public class TestUSB {public static void main(String[] args) {USB usb new USB();}}// Error:(10, 19) java: day20210915.USB是抽象的; 无法实例化
2. 接口中每一个方法都是public的抽象方法即接口中的方法会被隐式的指定为public abstract只能说public abstract其他修饰符都会报错
public interface USB {// Error:(4, 18) java: 此处不允许使用修饰符privateprivate void openDevice();void closeDevice();} 3. 接口中的方法是不能在接口中实现的只能由实现接口的类来实现 public interface USB {void openDevice();// 编译失败因为接口中的方式默认为抽象方法// Error:(5, 23) java: 接口抽象方法不能带有主体void closeDevice(){System.out.println(关闭USB设备);}}
4. 重写接口中方法时不能使用默认的访问权限 public class Mouse implements USB {Overridevoid openDevice() {System.out.println(打开鼠标);}// ...}// 编译报错重写USB中openDevice方法时不能使用默认修饰符
// 正在尝试分配更低的访问权限; 以前为public
5. 接口中可以含有变量但是接口中的变量会被隐式的指定为public static final 变量
public interface USB {double brand 3.0; // 默认被final public static修饰void openDevice();void closeDevice();}public class TestUSB {public static void main(String[] args) {System.out.println(USB.brand); // 可以直接通过接口名访问说明是静态的// 编译报错Error:(12, 12) java: 无法为最终变量brand分配值USB.brand 2.0; // 说明brand具有final属性}}
6. 接口中不能有静态代码块和构造方法
public interface USB {// 编译失败public USB(){}{} // 编译失败void openDevice();void closeDevice();} 7. 接口虽然不是类但是接口编译完成后字节码文件的后缀格式也是.class
8. 如果类没有实现接口中的所有的抽象的方法则类必须设置成为抽象类
9. jdk8中: 接口中还可以包含default方法。 1.5 实现多个接口
在Java中类和类之间是单继承的一个类只能有一个父类即Java中不支持多继承但是一个类可以实现多个接口。下面通过类来表示一组动物.
class Animal {protected String name;public Animal(String name) {this.name name;}} 另外我们再提供一组接口分别表示会飞的,会跑的,会游泳的。 interface IFlying {void fly();}interface IRunning {void run();}interface ISwimming {void swim();} 接下来我们创建几个具体的动物 猫, 是会跑的.
class Cat extends Animal implements IRunning {public Cat(String name) {super(name);}Overridepublic void run() {System.out.println(this.name 正在用四条腿跑);}} 鱼, 是会游的
class Fish extends Animal implements ISwimming {public Fish(String name) {super(name);}Overridepublic void swim() {System.out.println(this.name 正在用尾巴游泳);}} 青蛙, 既能跑, 又能游(两栖动物)
class Frog extends Animal implements IRunning, ISwimming {public Frog(String name) {super(name);}Overridepublic void run() {System.out.println(this.name 正在往前跳);}Overridepublic void swim() {System.out.println(this.name 正在蹬腿游泳);}} 注意一个类实现多个接口时每个接口的抽象方法都要实现否则必须设置成抽象类。 提示, IDEA 中使用 ctrl i 快速实现接口 还有一种神奇的动物, 水陆空三栖, 叫做 鸭子 class Duck extends Animal implements IRunning, ISwimming, IFlying {public Duck(String name) {super(name);}Overridepublic void fly() {System.out.println(this.name 正在用翅膀飞);}Overridepublic void run() {System.out.println(this.name 正在用两条腿跑);}Overridepublic void swim() {System.out.println(this.name 正在漂在水上);}} 上面的代码展示了 Java 面向对象编程中最常见的用法: 一个类继承一个父类, 同时实现多种接口. 继承表达的含义是 is - a 语义, 而接口表达的含义是 具有 xxx 特性。 猫是一种动物, 具有会跑的特性. 青蛙也是一种动物, 既能跑, 也能游泳 鸭子也是一种动物, 既能跑, 也能游, 还能飞 例如现在实现一个方法叫散步 public static void walk(IRunning running) {System.out.println(我带着伙伴去散步);running.run();} 在这个 walk 方法内部, 我们并不关注到底是哪种动物, 只要参数是会跑的, 就行。 Cat cat new Cat(小猫);walk(cat);Frog frog new Frog(小青蛙);walk(frog);// 执行结果
我带着伙伴去散步
小猫正在用四条腿跑
我带着伙伴去散步
小青蛙正在往前跳 甚至参数可以不是 动物, 只要会跑
class Robot implements IRunning {private String name;public Robot(String name) {this.name name;}Overridepublic void run() {System.out.println(this.name 正在用轮子跑);}
}Robot robot new Robot(机器人);walk(robot);// 执行结果
机器人正在用轮子跑 1.6 接口间的继承 在Java中类和类之间是单继承的一个类可以实现多个接口接口与接口之间可以多继承。即用接口可以达到多继承的目的。
接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字。
interface IRunning {void run();}interface ISwimming {void swim();}// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {}class Frog implements IAmphibious {...}
通过接口继承创建一个新的接口 IAmphibious 表示 两栖的. 此时实现接口创建的 Frog 类, 就继续要实现 run 方法, 也需要实现 swim 方法 接口间的继承相当于把多个接口合并在一起. 1.7 接口使用实例
给对象数组排序 class Student {private String name;private int score;public Student(String name, int score) {this.name name;this.score score;}Overridepublic String toString() {return [ this.name : this.score ];}} 再给定一个学生对象数组, 对这个对象数组中的元素进行排序(按分数升序).
Student[] students new Student[] {new Student(张三, 95),new Student(李四, 96),new Student(王五, 97),new Student(赵六, 92),}; 按照我们之前的理解, 数组我们有一个现成的 sort 方法, 能否直接使用这个方法呢?
Arrays.sort(students);System.out.println(Arrays.toString(students));// 运行出错, 抛出异常.Exception in thread main java.lang.ClassCastException: Student cannot be cast to java.lang.Comparable
仔细思考, 不难发现, 和普通的整数不一样, 两个整数是可以直接比较的, 大小关系明确. 而两个学生对象的大小关系 怎么确定? 需要我们额外指定.
让我们的 Student 类实现 Comparable 接口, 并实现其中的 compareTo 方法 class Student implements Comparable {private String name;private int score;public Student(String name, int score) {this.name name;this.score score;}Overridepublic String toString() {return [ this.name : this.score ];}Overridepublic int compareTo(Object o) {Student s (Student)o;if (this.score s.score) {return 1;} else if (this.score s.score) {return -1;} else {return 0;
}}} 在sort 方法中会自动调用 compareTo 方法. compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象. 然后比较当前对象和参数对象的大小关系(按分数来算). 如果当前对象应排在参数对象之前, 返回大于0的数字; 如果当前对象应排在参数对象之后, 返回小于0的数字; 如果当前对象和参数对象不分先后, 返回 0 再次执行程序, 结果就符合预期了
// 执行结果
[赵六:92]],[张三:95], [李四:96],[[王五:97],
注意事项: 对于 sort 方法来说, 需要传入的数组的每个对象都是 可比较 的, 需要具备 compareTo 这样的能力. 通过重写 compareTo方法的方式, 就可以定义比较规则。