接口
使用interface来修饰。interfaceIA{}接口当中,可以有static的方法里面的所有方法都是public的抽象方法,默认是·publicabstract的接口是不可以被通过关键字new来实例化的接口中的方法一定是抽象方法,因此可以省略abstract。接口中的方法一定是public,因此可以省略public
interface IShape {
void draw();
}
class Cycle implements IShape {
@Override
public void draw() {
System.out.println('○');
}
}
public class Test {
public static void main(String[] args) {
IShape shape = new Rect();
shape.draw();
}
}
对于字段来说,接口中只能包含静态常量(finalstat
其中的public,static,final的关键字都可以省略.省略后的num仍然表示public的静态常量
提示:
我们创建接口的时候,接口的命名一般以大写接口的命名一般使用“形容词”词性的单词类和接口之间的关系是通过implements实现的当一个类实现了一个接口,就必须要重写接口当中的抽象方法接口当中的成员变量,默认是publicstaticfinal修饰的当一个类实现一个接口之后,重写这个方法的时候,这个方法前面必须加上public
一个错误代码:
interface IShape {
abstract void draw() ; // 即便不写public,也是public
}
class Rect implements IShape {
void draw() {
System.out.println('□') ; //权限更加严格了,所以无法覆写。
}
}
Java中只支持单继承,一个类只能extends一个父类.但是可以同时实现多个接口,通过implements实现多个接口,接口之间使用逗号隔开,也能达到多继承类似的效果。通过类来表示一组动物:
再提供一组接口,分别表示“会飞的”,“会跑的”,“会游泳的”.
interface IFlying {
void fly();
}
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
创建几个具体的动物猫,是会跑的.
class Cat extends Animal implements IRunning {
public Cat(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name + '正在用四条腿跑');
}
}
鱼,是会游的
class Fish extends Animal implements ISwimming {
public Fish(String name) {
super(name);
}
@Override
public void swim() {
System.out.println(this.name + '正在用尾巴游泳');
}
}
青蛙,既能跑,又能游(两栖动物)
class Frog extends Animal implements IRunning, ISwimming {
public Frog(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name + '正在往前跳');
}
@Override
public void swim() {
System.out.println(this.name + '正在蹬腿游泳');
}
还有一种神奇的动物,水陆空三栖,叫做“鸭子”
class Duck extends Animal implements IRunning, ISwimming, IFlying {
public Duck(String name) {
super(name);
}
@Override
public void fly() {
System.out.println(this.name + '正在用翅膀飞');
}
@Override
public void run() {
System.out.println(this.name + '正在用两条腿跑');
}
@Override
public void swim() {
System.out.println(this.name + '正在漂在水上');
}
}
类和接口之间是通过implements来操作的,接口与接口之间是通过extends来操作的。此时,这里面意为:拓展。一个接口Bextends来拓展另外一个接口C的功能。此时当另外一个类D通过implements实现这个接口B的时候,此时重写的方法不仅仅是B的抽象方法,还有它从C接口拓展来的功能或者方法。三个常用的接口:comparablecomparatorclonable给对象数组排序给定一个学生类
class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
@Override
public 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;
}
@Override
public String toString() {
return '[' + this.name + ':' + this.score + ']';
}
@Override
public 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;再次执行程序,结果就符合预期了
// 执行结果
[[王五:97], [李四:96], [张三:95], [赵六:92]]
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点
若海2023-03-20
我唱空?我一个小散能影响股价?那么股票就很容易了,我全仓,你肯定不信,周五进了,只是看到无脑唱,真的坑人!