在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理Java知识点的第十三篇博客。
本篇博客介绍了Java的抽象类和接口。
本系列博客所有Java代码都使用IntelliJ IDEA编译运行,版本为2022.1。所用JDK版本为JDK11。
目录
在Java中,一个没有方法体的方法是抽象方法,类中如果有抽象方法,就必须定义为抽象类。
抽象类和抽象方法必须用关键字abstract修饰。修饰类时插在public和class中间。修饰方法时插在权限修饰符和返回值类型中间。
抽象类不一定有抽象方法,但是有抽象方法的类一定是抽象类。
抽象类不能实例化,必须通过多态用子类实例化。抽象类的子类必须重写抽象类的所有抽象方法,否则就是抽象类。
- public abstract class animalabstract {
- public abstract void show();
- }
父类animalabstract的show方法是抽象方法,没有方法体。
- public class catanimal extends animalabstract{
- public void show(){
- System.out.println("Cat is animal");
- }
- }
catanimal是子类,重写了show方法。
- public class abstracttest {
- public static void main(String[] args){
- animalabstract cat = new catanimal();
- cat.show();
- }
- }
abstracttest类通过多态实例化了一个对象。
程序的输出是:
Cat is animal
抽象类的成员变量可以是变量,也可以是常量。抽象类有构造方法,但是不能实例化。
抽象类可以有抽象方法,也可以有非抽象方法。
用抽象类实现猫和狗。
- public abstract class animalabstracttest {
- String name;
- int age;
- animalabstracttest(){}
- animalabstracttest(String name,int age){
- this.name = name;
- this.age = age;
- }
-
- public String getname(){
- return name;
- }
- public void setname(String name){
- this.name = name;
- }
- public int getage(){
- return age;
- }
- public void setage(int age){
- this.age = age;
- }
- public abstract void eat();
-
- public void show(){
- System.out.println("The name is " + name);
- System.out.println("The age is " + age);
- }
- }
这是父类animalabstracttest,是一个抽象类,其中eat方法是抽象方法。
- public class catabstracttest extends animalabstracttest{
- catabstracttest(){}
- catabstracttest(String name,int age){
- super(name,age);
- }
-
- public void eat(){
- System.out.println("Cat can eat something");
- }
- }
- public class dogabstracttest extends animalabstracttest{
- dogabstracttest(){}
- dogabstracttest(String name,int age){
- super(name,age);
- }
-
- public void eat(){
- System.out.println("Dog can eat something");
- }
- }
子类catabstracttest和dogabstracttest都重写了eat方法。
- public class catdoganimalabstract {
- public static void main(String[] args){
- animalabstracttest cat = new catabstracttest();
- cat.setname("Gaston");
- cat.setage(6);
- cat.show();
- cat.eat();
-
- animalabstracttest dog = new dogabstracttest("Paula",6);
- dog.show();
- dog.eat();
- }
- }
catdoganimalabstract类是测试类。程序的输出是:
The name is Gaston
The age is 6
Cat can eat something
The name is Paula
The age is 6
Dog can eat something
接口是一种公共的规范标准。Java的接口体现在对行为的抽象。
接口用关键字interface修饰,创建接口的格式是:
public interface 接口名{...}
类实现接口名用implements表示,格式是:
public class 类名 implements 接口名
接口也通过多态用子类进行实例化,多态分为具体类多态,抽象类多态和接口多态。
接口的实现类必须重写接口的所有抽象方法,否则就是抽象类。
- public interface firsttest {
- public void show();
- }
这是一个接口,内含show方法。
- public class catcat implements firsttest{
- public void show(){
- System.out.println("This is a cat");
- }
- }
这是catcat类,实现了firsttest接口,具体实现show方法。
- public class interfactimplementtest {
- public static void main(String[] args){
- firsttest cat = new catcat();
- cat.show();
- }
- }
这是测试代码。程序输出:
This is a cat
接口的成员变量只能是常量,默认修饰符是public static final。
接口没有构造方法。接口的成员方法只能是抽象方法,默认修饰符是public abstract。JDK8和JDK9出现了一些新特性,在后面。
用接口实现猫和狗。
- public interface catdogtestinterface {
- public abstract void jump();
- }
catdogtestinterface接口的jump方法是抽象方法。
- public class animalinterfacetest {
- String name;
- int age;
- animalinterfacetest(){}
- animalinterfacetest(String name,int age){
- this.name = name;
- this.age = age;
- }
-
- public void setname(String name){
- this.name = name;
- }
- public String getname(){
- return name;
- }
- public void setage(int age){
- this.age = age;
- }
- public int getage(){
- return age;
- }
- public void show(){
- System.out.println("The name is " + name);
- System.out.println("The age is " + age);
- }
- }
这是animalinterfacetest类。
- public class cattestinterface extends animalinterfacetest implements catdogtestinterface{
- public cattestinterface(){}
- public cattestinterface(String name,int age){
- super(name,age);
- }
-
- public void jump(){
- System.out.println("Cat can jump");
- }
- }
- public class dogtestinterface extends animalinterfacetest implements catdogtestinterface{
- public dogtestinterface(){}
- public dogtestinterface(String name,int age){
- super(name,age);
- }
-
- public void jump(){
- System.out.println("Dog can jump");
- }
- }
cattestinferface和dogtestinterface类都继承animalinterfacetest类,并实现catdogtestinterface接口,都重写了jump方法。
- public class interfacetest {
- public static void main(String[] args){
- animalinterfacetest cat = new cattestinterface();
- cat.setname("Gafilo");
- cat.setage(6);
- cat.show();
- cattestinterface cattemp = (cattestinterface)cat;
- cattemp.jump();
-
-
- animalinterfacetest dog = new dogtestinterface("Paula",6);
- dog.show();
- dogtestinterface dogtemp = (dogtestinterface)dog;
- dogtemp.jump();
- }
- }
这是interfacetest类,是测试代码。
程序的输出是:
The name is Gafilo
The age is 6
Cat can jump
The name is Paula
The age is 6
Dog can jump
类和类只能单继承,不能同时继承多个类。但是类可以实现单个接口,也可以实现多个接口。
接口可以实现单个接口,也可以实现多个接口。
抽象类可以有变量和常量,可以有构造方法,抽象方法和非抽象方法。接口只能有常量和抽象方法(后面介绍接口还可以有其他内容)。
抽象类对类抽象,包括属性和行为。接口主要对行为抽象。
有乒乓球教练,乒乓球运动员,篮球教练和篮球运动员。乒乓球相关人员要学习英语。运动员要进行训练,教练要进行教授,所有人都要吃饭。要用代码表示。
- public interface studyenglish {
- public void studyenglish();
- }
studyenglish接口的studyenglish是抽象方法。
- public abstract class person {
- String name;
- int age;
- person(){}
- person(String name,int age){
- this.name = name;
- this.age = age;
- }
-
- public void setname(String name){
- this.name = name;
- }
- public String getname(){
- return name;
- }
- public void setage(int age){
- this.age = age;
- }
-
- public int getage(){
- return age;
- }
- public void show(){
- System.out.println("The name is " + name);
- System.out.println("The age is " + age);
- }
-
- public abstract void eat();
- }
person类有成员变量name和age,对应的get和set方法,show方法,以及抽象方法eat。是对人的抽象。
- public abstract class player extends person {
- public player(){}
- public player(String name,int age){
- super(name ,age);
- }
-
- public abstract void eat();
- public abstract void study();
- }
player类有抽象方法eat和study,是对运动员的抽象,继承了person类。
- public abstract class coach extends person{
- public coach(){}
- public coach(String name,int age){
- super(name ,age);
- }
-
- public abstract void eat();
- public abstract void teach();
- }
coach类有抽象方法eat和teach,是对教练的抽象,继承了person类。
- public class pingpangcoach extends coach implements studyenglish{
- public pingpangcoach(){}
- public pingpangcoach(String name,int age){
- super(name,age);
- }
-
- public void eat(){
- System.out.println("Pingpang coach eat meal A");
- }
- public void teach(){
- System.out.println("Pingpang coach teach pingpang");
- }
- public void studyenglish(){
- System.out.println("Pinngpang coach should study english");
- }
- }
pingpangcoach类实现了eat,teach和studyenglish方法,继承coach类,实现studyenglish接口,是对乒乓球教练的抽象。
- public class pingpangplayer extends player implements studyenglish{
- public pingpangplayer(){}
- public pingpangplayer(String name,int age){
- super(name,age);
- }
-
- public void eat(){
- System.out.println("Pingpang player eat meal B");
- }
- public void study(){
- System.out.println("Pingpang player study pingpang");
- }
- public void studyenglish(){
- System.out.println("Pinngpang player should study english");
- }
- }
pingpangplayer类实现了eat,study和studyenglish方法,继承player类,实现studyenglish接口,是对乒乓球教练的抽象。
- public class basketballcoach extends coach{
- public basketballcoach(){}
- public basketballcoach(String name,int age){
- super(name,age);
- }
-
- public void eat(){
- System.out.println("basketball coach eat meal C");
- }
- public void teach(){
- System.out.println("basketball coach teach basketball");
- }
- }
basketballcoach类实现了eat和teach方法,继承coach类,是对篮球教练的抽象。
- public class basketballplayer extends player{
- public basketballplayer(){}
- public basketballplayer(String name,int age){
- super(name,age);
- }
-
- public void eat(){
- System.out.println("basketball player eat meal D");
- }
- public void study(){
- System.out.println("basketball player study basketball");
- }
- }
basketballplayer类实现了eat和study方法,继承player类,是对篮球运动员的抽象。
- public class playercoachtest {
- public static void main(String[] args){
- pingpangcoach A = new pingpangcoach();
- A.setname("David");
- A.setage(36);
- A.show();
- A.eat();
- A.teach();
- A.studyenglish();
- pingpangplayer B = new pingpangplayer("Simon",25);
- B.show();
- B.eat();
- B.study();
- B.studyenglish();
-
- basketballcoach C = new basketballcoach();
- C.setname("Steve");
- C.setage(56);
- C.show();
- C.eat();
- C.teach();
- basketballplayer D =new basketballplayer("Kevin",31);
- D.show();
- D.eat();
- D.study();
- }
- }
playercoachtest类实现了具体功能,实例化了这四个对象。
程序的输出是:
The name is David
The age is 36
Pingpang coach eat meal A
Pingpang coach teach pingpang
Pinngpang coach should study english
The name is Simon
The age is 25
Pingpang player eat meal B
Pingpang player study pingpang
Pinngpang player should study english
The name is Steve
The age is 56
basketball coach eat meal C
basketball coach teach basketball
The name is Kevin
The age is 31
basketball player eat meal D
basketball player study basketball