1.抽象类
1.1 概念
1.2 语法
在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。
代码示例如下:
// 抽象类:被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 的
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);
}
@Override
public void bark() {
System.out.println( getname() +" 正在汪汪叫!!");
}
@Override
void eat() {
System.out.println(getname() + "正在吃狗粮!!");
}
}
class Cat extends Animal{
public Cat(String name, int age) {
super(name, age);
}
@Override
public void bark() {
System.out.println( getname() +" 正在喵喵叫!!");
}
@Override
void 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这个类要重写所有未被重写的抽象方法。
代码如下:
abstract class A{
abstract public void func1();
}
abstract class B extends A{
abstract public void func2();
}
class C extends B{
@Override
public void func1() {
System.out.println("C:: func1()");
}
@Override
public 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 接口名称 {// ...}
public interface USB {
void openDevice();
void closeDevice();
}
///
public class Mouse implements USB{
@Override
public void openDevice() {
System.out.println("打开鼠标!");
}
@Override
public void closeDevice() {
System.out.println("关闭鼠标!");
}
public void click(){
System.out.println("点击鼠标!");
}
}
//
public class KeyBoard implements USB{
@Override
public void openDevice() {
System.out.println("打开键盘!");
}
@Override
public 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 多个接口的实现
public class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
public interface ISwimming {
void swim();
}
/
public interface IRunning {
void run();
}
/
public interface IFlying {
void fly();
}
public class Cat extends Animal implements IRunning{
public Cat(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name + " 正在奔跑");
}
}
public 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 + " 正在水里游");
}
}
public class Duck extends Animal implements IRunning,IFlying,ISwimming{
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 + "正在水上游");
}
}
猫是一种动物 , 具有会跑的特性 .青蛙也是一种动物 , 既能跑 , 也能游泳鸭子也是一种动物 , 既能跑 , 也能游 , 还能飞
2.6 多个接口的继承
在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到 多继承的目的。接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字.
示例: 两栖的动物, 既能跑, 也能游,把这两特性合并
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);
}
@Override
public void run() {
System.out.println(this.name + " 正在往前跳");
}
@Override
public 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.比较对象大小:
首先,我们来创建一个学生类,并实例化多个对象
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 方法来进行比较:
public class Student implements Comparable<Student>{
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//用年龄进行比较
@Override
public 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 抽象类和接口的区别
class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
具体如下图:
本文是作者学习后的总结,如果有什么不恰当的地方,欢迎大佬指正!!!