1.抽象类
1.1 概念
1.2 语法
在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。
代码示例如下:
java"> // 抽象类:被abstract修饰的类public abstract class Animal {private String name;private int age;// 抽象方法:被abstract修饰的方法,没有方法体abstract public void bark();abstract void sheep();// 抽象类也是类,也可以增加普通方法和属性public String getname(){return name;}}
1.3 特性
1. 抽象类不能直接实例化对象
2. 抽象方法不能是 private 的
java"> abstract class Animal {private String name;private int age;public Animal(String name, int age) {this.name = name;this.age = age;}abstract public void bark();abstract void eat();public String getname(){return name;}
}class Dog extends Animal{public Dog(String name, int age) {super(name, age);}@Overridepublic void bark() {System.out.println( getname() +" 正在汪汪叫!!");}@Overridevoid eat() {System.out.println(getname() + "正在吃狗粮!!");}}class Cat extends Animal{public Cat(String name, int age) {super(name, age);}@Overridepublic void bark() {System.out.println( getname() +" 正在喵喵叫!!");}@Overridevoid eat() {System.out.println(getname() + "正在吃猫粮!!");}}
public class test1 {public static void main(String[] args) {Dog dog = new Dog("小黄",14);Cat cat = new Cat("小花",15);dog.bark();cat.bark();dog.eat();cat.eat();}}
运行结果如下:
注意: 当一个普通类B继承一个抽象类A,如果不想重写这个抽象类A的方法,此时,可以把这个普通类改为抽象类,但是如果B这个抽象类再被普通类C继承,此时C这个类要重写所有未被重写的抽象方法。
代码如下:
java">abstract class A{abstract public void func1();}abstract class B extends A{abstract public void func2();}class C extends B{@Overridepublic void func1() {System.out.println("C:: func1()");}@Overridepublic void func2() {System.out.println("C:: func2()");}}
public class test2 {public static void main(String[] args) {C c = new C();c.func1();c.func2();}
}
运行结果如下:
如果不这么做,就会报错:
1.4 作用
2.接口
2.1 概念
在现实生活中,接口的例子比比皆是,比如:笔记本上的USB口,电源插座等。
电脑的USB口上,可以插:U盘、鼠标、键盘...所有符合USB协议的设备 电源插座插孔上,可以插:电脑、电视机、电饭煲...所有符合规范的设备 通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。
在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型
2.2 语法规则
public interface 接口名称 {// 变量public static final int a; // public static final 是固定搭配,可以不写,定义的时候必须初始化// 抽象方法public abstract void method1 (); // public abstract 是固定搭配,可以不写public void method2 ();abstract void method3 ();void method4 ();// 注意:在接口中上述写法都是抽象方法,跟推荐方式 4 ,代码更简洁}
2.3 接口使用
public class 类名称 implements 接口名称 {// ...}
java">public interface USB {void openDevice();void closeDevice();
}///
public class Mouse implements USB{@Overridepublic void openDevice() {System.out.println("打开鼠标!");}@Overridepublic void closeDevice() {System.out.println("关闭鼠标!");}public void click(){System.out.println("点击鼠标!");}
}
//
public class KeyBoard implements USB{@Overridepublic void openDevice() {System.out.println("打开键盘!");}@Overridepublic void closeDevice() {System.out.println("关闭键盘!");}public void inPut(){System.out.println("键盘输入!");}
}
/
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();}
}
运行结果如下:
2.4 特性
2.5 多个接口的实现
java">public class Animal {protected String name;public Animal(String name) {this.name = name;}
}
java">public interface ISwimming {void swim();
}
/
public interface IRunning {void run();
}
/
public interface IFlying {void fly();
}
java">public class Cat extends Animal implements IRunning{public Cat(String name) {super(name);}@Overridepublic void run() {System.out.println(this.name + " 正在奔跑");}
}
java">public 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 + " 正在水里游");}
}
java">public class Duck extends Animal implements IRunning,IFlying,ISwimming{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 + "正在水上游");}
}
猫是一种动物 , 具有会跑的特性 .青蛙也是一种动物 , 既能跑 , 也能游泳鸭子也是一种动物 , 既能跑 , 也能游 , 还能飞
2.6 多个接口的继承
在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到 多继承的目的。接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字.
示例: 两栖的动物, 既能跑, 也能游,把这两特性合并
java">public interface ISwimming {void swim();
}
/
public interface IRunning {void run();
}public interface IAmphibious extends ISwimming,IRunning{}
/
public class Frog extends Animal implements IAmphibious{public Frog(String name) {super(name);}@Overridepublic void run() {System.out.println(this.name + " 正在往前跳");}@Overridepublic void swim() {System.out.println(this.name + " 正在水里游");}
}
/
public class TestAnimal {public static void main(String[] args) {Frog frog = new Frog("小七");frog.run();frog.swim();}
}
运行结果如下:
注意:接口间的继承相当于把多个接口合并在一起。
2.7 接口使用实例
1.比较对象大小:
首先,我们来创建一个学生类,并实例化多个对象
java">public class Student {public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}
}/
public class TestStudent {public static void main(String[] args) {Student s1 = new Student("张三", 95);Student s2 = new Student("李四", 96);}}
因为Studend 是自定义类型,所以不能直接用“<”、“>”、“=”来进行比较
所以我们使用 Comparable 接口,通过重写接口中的compareTo 方法来进行比较:
java">public class Student implements Comparable<Student>{public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}//用年龄进行比较@Overridepublic int compareTo(Student o) {return this.age - o.age;}
// 用姓名进行比较
// @Override
// public int compareTo(Student o) {
// return this.name.compareTo(o.name);
// }
}/
public class TestStudent {public static void main(String[] args) {Student s1 = new Student("张三", 95);Student s2 = new Student("李四", 96);int ret = s1.compareTo(s2);if(ret > 0){System.out.println("s1 > s2");}else {System.out.println("s1 <= s2");}}
}
运行结果如下:
注意:使用这个接口的的优点是使Student 这种自定义类型具备了比较的功能;缺点就是一旦 compareTo 这个方法重写后,那么就不能随意的更改。
2.8 抽象类和接口的区别
java">class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
具体如下图:
本文是作者学习后的总结,如果有什么不恰当的地方,欢迎大佬指正!!!