初始Java5
目录
一.抽象类(一张图搞定基础)
二.接口
1.语法定义:
提示:
2.接口的使用
注意:
3.接口的特性
1. 不可实例化
2.抽象方法类型固定public abstract
3..接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
4.重写接口中方法时,不能使用默认(default)的访问权限
5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
6.接口中不能有静态代码块和构造方法
7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
8. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类(而后抽象类的子类要都实现)
9. jdk8中:接口中还可以包含default方法。
总结:
4.实现多个接口
5.接口间的继承
6.接口使用实例
1.给对象数组排序
2.借用Comparable 接口实现其中的 compareTo 方法实现对象排序:
一.抽象类(一张图搞定基础)
1.用abstract来定义抽象类与抽象方法;当有抽象方法的时候必定前面的类名前加abstract ,后面的“{}”要去掉;
2.抽象类不能被实例化只能被继承 ;
3. 抽象类里面可以定义普通的成员变量与成员方法;
4.当抽象类被继承的时候子类要完全重写父类的抽象方法,除非子类也是一个抽象类(如果这样那子类的子类如果是普通类则要重写父类与父类没重写的父父类方法。);
5.抽象类中abstract抽象方法不能连用一些不能重写的关键字比如static private final等,
二.接口
1.语法定义:
public interface 接口名称{
// 抽象方法
public abstract void method1(); // 所用抽象方法public abstract 是固定搭配,可以不写
public void method2();
abstract void method3();
void method4();
// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
//抽象成员变量(public abstract final 是固定搭配,可以不写)
public abstract final a;
}
提示:
2.接口的使用
public class 类名称 implements 接口名称{
// ...
}
注意:
子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。
3.接口的特性
1. 不可实例化
接口类型是一种引用类型,但是不能直接new接口的对象
public class TestUSB {
public static void main(String[] args) {
USB usb = new USB();
}
}
// Error:(10, 19) java: day20210915.USB是抽象的; 无法实例化
2.抽象方法类型固定public abstract
public interface USB {
// Error:(4, 18) java: 此处不允许使用修饰符private
private void openDevice();
void closeDevice();
}
3..接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
public interface USB {
void openDevice();
// 编译失败:因为接口中的方式默认为抽象方法
// Error:(5, 23) java: 接口抽象方法不能带有主体
void closeDevice(){
System.out.println("关闭USB设备");
}
}
4.重写接口中方法时,不能使用默认(default)的访问权限
public interface USB {
void openDevice(); // 默认是public的
void closeDevice(); // 默认是public的
}
public class Mouse implements USB {
@Override
void openDevice() {
System.out.println("打开鼠标");
}
// ...
}
// 编译报错,重写USB中openDevice方法时,不能使用默认修饰符
// 正在尝试分配更低的访问权限; 以前为public
5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
6.接口中不能有静态代码块和构造方法
7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
8. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类(而后抽象类的子类要都实现)
9. jdk8中:接口中还可以包含default方法。
总结:
4.实现多个接口
//下面通过类来表示一组动物.
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);
}
@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 + "正在蹬腿游泳");
}
}
本质:让类来继承一个父类(只能继承一个父类)并且实现多个接口(可以实现多个接口),从而实现多继承。 父类:该对象属于的更高层次概括。 接口,该对象的功能。
5.接口间的继承
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {
}
class Frog implements IAmphibious {
...
}
6.接口使用实例
1.给对象数组排序
正常使用:
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
分析:sort可排序整数,但是无法排序对象(不知道按照什么排序)。
2.借用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;
}}}