零基础Java第十五期:抽象类接口(一)

server/2024/11/13 3:32:28/

目录

一、抽象类

1.1. 抽象的概念

1.2. 抽象类语法 

1.3. 抽象类的特性 

1.4. 图形类例子 

二、 接口

2.1. 接口的概念

2.2. 语法规则 

2.3.  接口的特性

 2.4. 接口的使用

2.5. 实现多个接口

2.6. 工作当中常用的接口 


一、抽象类

1.1. 抽象的概念

       如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstract method), 包含抽象方法的类我们称为 抽象类(abstract class)。 

       就比如,Cat与Dog都属于Animal类,并且前两者与Animal都属于继承关系,但Animal不是一个具体的动物,也就无法实现.Bark()方法。

1.2. 抽象类语法 

        在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。 

1.3. 抽象类的特性 

java">public abstract class Animal {public int age;public String name;public Animal(int age, String name) {this.age = age;this.name = name;}public void eat(){System.out.println(this.name+"正在吃饭");}
}public class Dog extends Animal{public Dog(int age, String name) {super(age, name);}@Overridepublic void eat() {System.out.println(this.name+"正在吃狗粮");}
}public class Main {public static void main(String[] args) {Dog dog = new Dog(5,"泰克");Animal animal = new Animal()}
}

       就比如上面的代码中,Animal不是一个具体的动物,无法用成员变量对其进行赋值。那我们就可以在Animal这个类加上一个abstract,就把Animal变成抽象类,并且不能再new一个新对象。在抽象类中,如果一个方法没有具体的实现,前面就用abstract修饰。但如果一个类没有被抽象,那么这个类中就不能有抽象方法。

      如果一个类继承了一个抽象类,那么抽象类里的方法必须进行重写,否则就会报错(如下面的代码所示)。

java">public abstract class Animal {public int age;public String name;public abstract void eat(){//产生报错System.out.println(this.name+"be eating");}public Animal(int age, String name) {this.age = age;this.name = name;}
}public class Dog extends Animal{//产生报错public Dog(int age, String name) {super(age, name);}}

      如果一个类继承了这个抽象类,然后不想重写抽象类当中的方法,只能把这个类也设置为抽象类。但最终还是得让一个普通类来继承这个抽象类,所以这些抽象方法最终都得被重写。

java">public abstract class Animal {public int age;public String name;public abstract void eat();public Animal(int age, String name) {this.age = age;this.name = name;}
}
java">public abstract class Dog extends Animal{//将Dog类也进行抽象化public Dog(int age, String name) {super(age, name);}
/*    @Overridepublic void eat() {System.out.println(this.name+"吃狗粮");}*/不用再重写Animal类里的方法了public abstract void bark();
}class Labrador extends Dog{//再用一个普通类继承Dog类public Labrador(int age, String name) {super(age, name);}@Overridepublic void eat() {}@Overridepublic void bark() {}
}

     而Labrador里面的这些方法怎么快速重写呢?将鼠标光标放在普通类后面,alt+回车,然后点击implement。但还是会出现报错,再次alt+回车,点击“Creat constructor……”,就能将成员变量重写,最后才能生成如上图所示的代码。

 

 

 

1.4. 图形类例子 

抽象类已经不能被实例化,但是还可以进行向上转型与多态。 

java">public abstract class Shape {public abstract void Draw();
}public class Rect extends Shape{@Overridepublic void Draw() {System.out.println("画一个矩形");}
}public class Circle extends Shape{@Overridepublic void Draw() {System.out.println("画一个圆");}
}public class Flower extends Shape{@Overridepublic void Draw() {System.out.println("花一朵花");}
}
java">public class Main {public static void DrawOut(Shape picture){picture.Draw();}public static void main(String[] args) {Flower flower = new Flower();DrawOut(flower);DrawOut(flower);DrawOut(flower);System.out.println("==========");DrawOut(new Flower());DrawOut(new Flower());DrawOut(new Flower());}
}

     运行结果如下: 虽然说打印结果一致,但其中的原理不同。

 

二、 接口

2.1. 接口的概念

     在现实生活中,接口的例子比比皆是,比如:笔记本上的USB口,电源插座等。电脑的USB口上,可以插:U盘、鼠标、键盘;所有符合USB协议的设备 电源插座插孔上,可以插:电脑、电视机、电饭煲...所有符合规范的设备。

      综上所述,接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。 

2.2. 语法规则 

java">public interface 接口名称 {}

       我们如果点开out.目录底下的文件,可以找到接口对应的字节码文件,并且一个接口只对应一个字节码文件。接口名称一般以大写字母I开头,后面再跟一个形容词词性的单词。

2.3.  接口的特性

 (1)接口不能直接实例化

java">public interface IShape {
}public class Main {public static void main(String[] args) {IShape iShape = new IShape();//产生报错}
}

(2)接口中的成员变量,默认是public static final修饰的

java">int a = 10;//默认为public static final
public int b = 20;
private int c = 30;//报错:Modifier 'private' not allowed here
public static final int d = 40;

(3)接口当中的方法,要是有具体的实现,就只能被static或default修饰,这些方法默认都是public 修饰的

java">public void test(){System.out.println("========");//Interface abstract methods cannot have body
}default public void Hello(){System.out.println("========");
}

 (4)接口当中的方法,要是没有具体的实现,就要写成public static修饰的抽象方法,默认也为public static。

java">public abstract void World();//warning:Modifier 'public''abstract' is redundant for interface members
void DrawOut();

 2.4. 接口的使用

     一个类要想与与接口建立联系,要使用implements实现。实现之后,还要进行方法的重写。

java">public interface IShape {public abstract void World();void DrawOut();
}public class Flower implements IShape{@Overridepublic void DrawOut() {System.out.println("画一朵花");}
}public class Main {public static void main(String[] args) {IShape iShape = new Flower();//通过向上转型来实例化iShape.DrawOut();}
}

2.5. 实现多个接口

       我们在上一期当中讲到了多态,多态能够降低代码的 "圈复杂度"。再有了接口之后, 类的使用者就不必关注具体类型, 而只关注某个类是否具备某种能力。这样我们在Main类里面再写一个Walk、Fly、Swim方法,无论有多少个参数,我们都能通过接口来进行传递。只要具备Walk、Fly、Swim这种能力的,我都能接受,不必关心什么类型的。

java">//父类对象
public abstract class Animal {public String name;public int age;public Animal(String name, int age) {this.name = name;this.age = age;}public abstract void eat();
}//子类对象
public class Dog extends Animal implements ICanRun, ICanSwim {public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name+"正在吃狗粮");}@Overridepublic void run() {System.out.println(this.name+"正在跑");}@Overridepublic void swim() {System.out.println(this.name+"正在游泳");}
}public class Bird extends Animal implements ICanFly{public Bird(String name, int age) {super(name, age);}@Overridepublic void eat() {}@Overridepublic void fly() {System.out.println(this.name+"正在飞");}
}
java">//接口
public interface ICanFly {void fly();
}public interface ICanRun {void run();
}public interface ICanSwim {void swim();
}
java">public class Main {public static void Fly(ICanFly canFly){canFly.fly();}public static void Walk(ICanRun canRun){canRun.run();}public static void Swim(ICanSwim canSwim){canSwim.swim();}public static void main(String[] args) {Dog dog = new Dog("斯派克",4);Bird bird = new Bird("金丝雀",1);Duck duck = new Duck("小黄鸭",1);Walk(duck);Walk(dog);System.out.println("===========");Swim(duck);Swim(dog);System.out.println("============");Fly(bird);Fly(duck);}
}

执行结果:

 

2.6. 工作当中常用的接口 

(1)引用类型的比较 

java">public class Student {public int age;public int score;public String name;public Student(int age, int score, String name) {this.age = age;this.score = score;this.name = name;}@Overridepublic String toString() {return "Student{" +"age=" + age +", score=" + score +", name='" + name + '\'' +'}';}}public class Main {public static void main(String[] args) {Student student1 = new Student(10,74,"张三");Student student2 = new Student(8,84,"李四");if(student1 > student2)//报错:Operator '>' cannot be applied to 'Student', 'Student'  Statement expected}
}

        <、>、=等关系运算符只能用于基本数据类型,在Java语法不支持地址的比较。要想实现引用类型的比较,就可以引入一个Comparable接口。我们看一下Comparable的源码,里面只有一个参数。同样需要重写一个方法。而我们要想进行比较,可以使用工具,比如我们新建一个AgeCompare类,需要接口Comparator,也需要重写方法。

java">public int compareTo(T o);
java">@Override
public int compareTo(Student o) {return 0;
}

如果我们想进行年龄的比较,就可以通过改返回值来进行比较。以下是完整代码:

java">//定义Student类
public class Student implements Comparable<Student>{public int age;public int score;public String name;public Student(int age, int score, String name) {this.age = age;this.score = score;this.name = name;}@Overridepublic String toString() {return "Student{" +"age=" + age +", score=" + score +", name='" + name + '\'' +'}';}@Overridepublic int compareTo(Student o) {return 0;}
}
java">//比较的工具
import java.util.Comparator;public class AgeCompare implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return o1.age - o2.age;}
}
java">public class Main {public static void main(String[] args) {Student student1 = new Student(10,74,"张三");Student student2 = new Student(8,84,"李四");System.out.println("进行年龄的比较");AgeCompare ageCompare = new AgeCompare();if(ageCompare.compare(student1,student2) > 0) {System.out.println("student1 > student2");}else {System.out.println("student1 < student2");}}
}

运行结果如下:

 


http://www.ppmy.cn/server/141216.html

相关文章

推荐一款功能强大的视频修复软件:Apeaksoft Video Fixer

Apeaksoft Video Fixer是一款功能强大的视频修复软件&#xff0c;专门用于修复损坏、不可播放、卡顿、画面失真、黑屏等视频问题。只需提供一个准确且有效的样本视频作为参考&#xff0c;该软件就能将受损视频修复到与样本视频相同的质量。该软件目前支持MP4、MOV、3GP等格式的…

选择适合你的报表工具,山海鲸报表与Tableau深度对比

在数据分析和报表制作的领域&#xff0c;企业往往面临着选择合适工具的难题。尤其是当市场上有很多功能强大的工具时&#xff0c;如何从中挑选出最适合自己需求的报表软件成为了一个关键问题。今天&#xff0c;我们将对比两款报表工具——山海鲸报表和Tableau&#xff0c;看看它…

《现代网络技术》读书笔记:SDN数据平面和OpenFlow

本文部分内容来源于《现代网络技术&#xff1a;SDN,NFV,QoE、物联网和云计算&#xff1a;SDN,NFV,QoE,IoT,andcloud》 SDN数据平面 SDN 数据平面也称为基础设施层&#xff0c;而在ITU-T的Y3300标准中则称为资源层&#xff0c;它是网络转发设备根据 SDN控制平面的决策来执行数据…

智能家居的未来:AI让生活更智能还是更复杂?

内容概要 智能家居的概念源于将各种家居设备连接到互联网&#xff0c;并通过智能技术进行控制和管理。随着人工智能的迅速发展&#xff0c;这一领域也迎来了前所未有的机遇。从早期简单的遥控器到如今可以通过手机应用、语音助手甚至是环境感应进行操作的设备&#xff0c;智能…

【人工智能训练师】3 集群搭建

开启集群环境 本次环境为单节点伪集群环境&#xff0c;环境中已经安装JDK1.8、Hadoop2.7.7、Mysql5.7、hive2.3.4。— 1.环境中已经安装/root/software/hadoop-2.7.7&#xff0c;格式化HDFS&#xff0c;开启集群&#xff0c;查看集群状态。&#xff08;HDFS端口为9000&#x…

【微服务】Docker 容器化

一、初识Docker 1. 为什么需要 Docker 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会遇到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性的问题开发、测试、生产环境有差异 Docker 如何解决依赖的兼容问题 将应用的Libs&#xff08;…

template和span标签的使用

一&#xff1a;template template是模板占位符&#xff0c;可帮助我们包裹元素&#xff0c;而且循环过程当中&#xff0c;template不会被渲染到页面。 <div>ABC</div> <template v-for"(item, index) in 5"><div>{{ index }}</div>&…

《深入浅出Apache Spark》系列③:Spark SQL解析层优化策略与案例解析

导读&#xff1a;本系列是Spark系列分享的第三期。第一期分享了Spark Core的一些基本原理和一些基本概念&#xff0c;包括一些核心组件。Spark的所有组件都围绕Spark Core来运转&#xff0c;其中最活跃的一个上层组件是Spark SQL。第二期分享则专门介绍了Spark SQL的基本架构和…