首页 > 编程语言 >零基础Java第十五期:抽象类接口(一)

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

时间:2024-11-17 18:19:00浏览次数:3  
标签:Java name int age void 第十五 抽象类 public String

目录

一、抽象类

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. 抽象类的特性 

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);
    }

    @Override
    public 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修饰。但如果一个类没有被抽象,那么这个类中就不能有抽象方法。

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

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);
    }
    
}

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

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;
    }
}
public abstract class Dog extends Animal{//将Dog类也进行抽象化
    public Dog(int age, String name) {
        super(age, name);
    }
/*    @Override
    public 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);
    }

    @Override
    public void eat() {

    }

    @Override
    public void bark() {

    }
}

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

 

 

 

1.4. 图形类例子 

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

public abstract class Shape {
    public abstract void Draw();
}

public class Rect extends Shape{
    @Override
    public void Draw() {
        System.out.println("画一个矩形");
    }
}

public class Circle extends Shape{
    @Override
    public void Draw() {
        System.out.println("画一个圆");
    }
}

public class Flower extends Shape{
    @Override
    public void Draw() {
        System.out.println("花一朵花");
    }
}
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. 语法规则 

public interface 接口名称 {

}

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

2.3.  接口的特性

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

public interface IShape {
}

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

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

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 修饰的

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

default public void Hello(){
    System.out.println("========");
}

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

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

 2.4. 接口的使用

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

public interface IShape {
    public abstract void World();
    void DrawOut();
}

public class Flower implements IShape{

    @Override
    public 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这种能力的,我都能接受,不必关心什么类型的。

//父类对象
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);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"正在吃狗粮");
    }

    @Override
    public void run() {
        System.out.println(this.name+"正在跑");
    }

    @Override
    public void swim() {
        System.out.println(this.name+"正在游泳");
    }
}

public class Bird extends Animal implements ICanFly{
    public Bird(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {

    }

    @Override
    public void fly() {
        System.out.println(this.name+"正在飞");
    }
}
//接口
public interface ICanFly {
    void fly();
}

public interface ICanRun {
    void run();
}

public interface ICanSwim {
    void swim();
}
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)引用类型的比较 

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;
    }

    @Override
    public 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,也需要重写方法。

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

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

//定义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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", score=" + score +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        return 0;
    }
}
//比较的工具
import java.util.Comparator;

public class AgeCompare implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        return o1.age - o2.age;
    }
}
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");
        }
    }
}

运行结果如下:

 

标签:Java,name,int,age,void,第十五,抽象类,public,String
From: https://blog.csdn.net/2401_85198927/article/details/143649728

相关文章

  • 基于Java+SSM+Vue数字乡村管理系统的设计与实现
    博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、小程序、安卓app、大数据等设计与开发。感兴趣的可......
  • 零基础java学习-预科准备-博客的重要性
    零基础java学习-预科准备-博客的重要性学习准备:博客(英文名blog,正式名称为网络日记)为什么要写博客?(简要:加深印象、总结经验、吸取教训、养成良好习惯收益无穷)1.需要总结和思考,能帮助我们更有效的记忆。2.提升文笔组织能力,进公司可能每周都要写周报,可能会写一些详细的帮助文档,要......
  • 抽象类 & 接口比较
    抽象类概述:1.该类的概念是抽象的,如形状,生物这些概念,无法实例化一个对象,所以抽象类是不允许创建对象的;2.对于这种类,这里面的大多数方法如果不通过继承的方式对类里面的方法进行重写的话,是无法执行的,比如一个形状类,既然有形状,就因该有显示名字方法,计算面积方法,在一些特定的坐标系上......
  • 韩顺平Java坦克大战项目分析与实现
    JAVA坦克大战项目文章目录界面技术栈项目结构Tank坦克父类EnemyTank敌人坦克类Hero己方坦克类Bomb爆炸类Shot子弹类MyPanel面板类AePlayWave坦克大战音乐类Node类Recorder记录类程序入口类功能子弹移动(线程)坦克移动(线程)每隔100毫秒,重绘区域,刷新绘图区(......
  • java初步与IDEA的安装
    为什么选择JavaJava用途广泛:Java是目前使用最为广泛的网络编程语言之一,在服务器端占比90%以上.Java可以用来做什么:1.企业级应用,特别是金融服务与电子商务领域.2.Android应用开发,是Android移动应用的主要开发语言之一.3.Web开发.4.桌面应用.5.大数据技术,hadoop及......
  • Java集合框架高频面试问题精粹(下篇)
    书接上回,上一篇文章介绍了Java集合常见面试题全解(上),反响不错,也有很多同学发表了自己的观点,这次又来了,这次是Java集合常见面试题总结(下)了,主要讲解了Map集合原理,它的使用频率也是很高。那么它的存储结构和实现原理是怎么样的呢一、Collections工具类(不重要)Collections 工......
  • 基于java+springboot的社区心理健康服务平台系统
    前言基于java+springboot的社区心理健康服务平台系统是守护社区居民心理健康的重要依托。系统为居民提供心理测评功能,涵盖情绪、压力、人际关系等多方面的专业量表,居民可自行测试,系统会即时给出结果和相应建议。同时,设有心理咨询预约模块,居民能查看心理咨询师的资料,......
  • 【华为OD技术面试手撕真题】84、前 K 个高频元素 | 手撕真题+思路参考+代码解析(C & C+
    文章目录一、题目......
  • Java面试之多线程&并发篇(5)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!常用的线程池有哪些?简述一下你对线程池的理解?Java程序是如何执行的?锁的优化机制了解吗?说说进程和线程的区别?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理******java核心面试知......
  • 【Java】继承和多态
    继承1继承1.1为什么需要继承1.2继承概念1.3继承的语法1.4父类成员访问1.4.1子类中访问父类的成员变量1.4.2子类中访问父类的成员方法1.5super关键字1.6子类构造方法1.7super和this1.8再谈初始化1.9protected关键字1.10继承方式1.11final关键字1.12继承......