• 抽象类和接口


    文章目录

    前言

    一、今日回顾

    1.《高等数学》

    2.阅读:

    3.英语:

    二、编程的那些事

    1.引入库

    2.读入数据

    总结


    前言


    一、今日回顾

    1.《高等数学》

    2.阅读:

    3.英语:

    二、编程的那些事

    1.抽象类的描述

    在java中,一个没有方法体的方法应该被定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。

    1. public abstract class Animal {
    2. public abstract void eat();
    3. }

    2.

    1. //抽象类
    2. public abstract class Animal {
    3. public abstract void eat();
    4. //抽象类里面可以有具体的方法体。//抽象类可以有具体的方法体,没有抽象方法,不过一般不那么做
    5. public void sleep(){
    6. System.out.println("睡觉");
    7. }
    8. }
    1. //Cat类继承Animal类,重写抽象方法
    2. public class Cat extends Animal{
    3. @Override
    4. public void eat() {
    5. System.out.println("猫吃鱼");
    6. }
    7. }

    1. //测试类
    2. public class AnimalDemo {
    3. public static void main(String[] args) {
    4. Animal a =new Cat();
    5. a.eat();//eat方法再Animal里是抽象的,但在Cat类中被重写了
    6. //编译看左边Animal,执行看右边Cat
    7. a.sleep();
    8. }
    9. }

    总结

    抽象类的特点

    • 抽象类和抽象方法必需使用abstract关键字修饰

       public abstract class类名{}

       public abstract void eat();

    • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
    • 抽象类不能被实例化,那抽象类如何被实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态。
    • 抽象类的子类

       要么重写抽象类中的所有抽象方法

       要么是抽象类


     案例2:

    1. public abstract class Animal {
    2. private int age=20;
    3. private final String city="北京";//city被final修饰,变为一常量
    4. public Animal(){
    5. }
    6. public Animal(int age){
    7. this.age=age;
    8. }
    9. public abstract void eat();
    10. public void show(){
    11. age=40;
    12. System.out.println(age);
    13. System.out.println(city);
    14. }
    15. }
    1. public class Cat extends Animal{
    2. @Override
    3. public void eat() {
    4. System.out.println("猫吃鱼");
    5. }
    6. }
    1. public class AnimalDemo {
    2. public static void main(String[] args) {
    3. Animal a =new Cat();
    4. a.eat();//eat方法再Animal里是抽象的,但在Cat类中被重写了
    5. //编译看左边Animal,执行看右边Cat
    6. a.show();
    7. }
    8. }

     

     小结:抽象类的成员特点

    • 成员变量

    可以是变量,也可以是常量

    • 构造方法

    有构造方法,但不能被实例化,那么,构造方法的作用是什么呢?用于子类访问父类数据的初始化

    • 成员方法

    可以有抽象方法:限定子类必须完成某些动作

    也可以有非抽象方法;提高代码的复用性

    1. public abstract class Animal {
    2. private String name;
    3. private int age;
    4. public Animal(){
    5. }
    6. public Animal(String name, int age) {
    7. this.name = name;
    8. this.age = age;
    9. }
    10. public String getName() {
    11. return name;
    12. }
    13. public void setName(String name) {
    14. this.name = name;
    15. }
    16. public int getAge() {
    17. return age;
    18. }
    19. public void setAge(int age) {
    20. this.age = age;
    21. }
    22. public abstract void eat();//不写方法体,用abstract
    23. }
    1. public class Cat extends Animal {
    2. public Cat() {
    3. }
    4. public Cat(String name, int age) {
    5. super(name, age);
    6. }
    7. @Override
    8. public void eat() {
    9. System.out.println("猫吃鱼");
    10. }
    11. }
    1. public class Dog extends Animal{
    2. public Dog() {
    3. }
    4. public Dog(String name, int age) {
    5. super(name, age);
    6. }
    7. @Override
    8. public void eat() {
    9. System.out.println("狗吃骨头");
    10. }
    11. }
    1. public class AnimalDemo {
    2. public static void main(String[] args) {
    3. //创建对象,按照多态的形式
    4. Animal a=new Cat();
    5. a.setName("卡菲猫");
    6. a.setAge(5);
    7. System.out.println(a.getName()+","+a.getAge());
    8. a.eat();
    9. System.out.println("……");
    10. a=new Cat("加菲猫",5);
    11. System.out.println(a.getName()+","+a.getAge());
    12. a.eat();
    13. System.out.println("……");
    14. Animal dog=new Dog();
    15. dog.setAge(10);
    16. dog.setName("小防鼠");
    17. System.out.println(dog.getName()+","+dog.getAge());
    18. dog.eat();
    19. System.out.println("……");
    20. dog=new Dog("小防鼠",10);
    21. System.out.println(dog.getName()+","+dog.getAge());
    22. dog.eat();
    23. }
    24. }

     接口

    1. public interface Jumpping {
    2. void jump();
    3. }
    1. public class Cat implements Jumpping{
    2. public void jump(){
    3. System.out.println("猫可以调高了");
    4. }
    5. }
    1. public class JumpingDemo {
    2. public static void main(String[] args) {
    3. Jumpping j=new Cat();
    4. j.jump();
    5. }
    6. }
    1. public interface Inter {
    2. public int num=10;
    3. public final int num2=20;
    4. }

     

    1. public class InterImpl implements Inter{
    2. public int num=11;
    3. }
    1. public class InterfaceDemo {
    2. public static void main(String[] args) {
    3. Inter i=new InterImpl();
    4. System.out.println(i.num);
    5. System.out.println(Inter.num2);
    6. }
    7. }

     

     

    接口的成员特点

    • 成员变量

    只能是常量

    默认修饰符:public static final

    • 构造方法

    接口没有构造方法,因为接口主要对行为进行抽象,是没有具体存在的。一个类如果没有父类,默认继承自Object类。

    成员方法

    只能是抽象方法

    默认修饰符:public abstract

    猫狗案例(接口版)

    1. public interface Jumpping {
    2. void jump();
    3. }
    1. public abstract class Animal {
    2. private String name;
    3. private int age;
    4. public Animal() {
    5. }
    6. public Animal(String name, int age) {
    7. this.name = name;
    8. this.age = age;
    9. }
    10. public String getName() {
    11. return name;
    12. }
    13. public void setName(String name) {
    14. this.name = name;
    15. }
    16. public int getAge() {
    17. return age;
    18. }
    19. public void setAge(int age) {
    20. this.age = age;
    21. }
    22. public abstract void eat();
    23. }
    1. public class Cat extends Animal implements Jumpping {
    2. public Cat() {
    3. }
    4. public Cat(String name, int age) {
    5. super(name, age);
    6. }
    7. public void jump(){
    8. System.out.println("猫可以调高了");
    9. }
    10. @Override
    11. public void eat() {
    12. System.out.println("猫吃鱼");
    13. }
    14. }
    1. public class AnimalDemo {
    2. public static void main(String[] args) {
    3. Jumpping j=new Cat();
    4. j.jump();
    5. Animal a=new Cat();
    6. a.setName("加菲猫");
    7. a.setAge(8);
    8. System.out.println( a.getAge()+a.getName());
    9. a.eat();
    10. System.out.println("-----");
    11. a=new Cat("加菲",8);
    12. System.out.println( a.getAge()+a.getName());
    13. a.eat();
    14. System.out.println("-----");
    15. Cat c=new Cat();
    16. c.setName("加菲猫");
    17. c.setAge(8);
    18. System.out.println( c.getAge()+c.getName());
    19. c.eat();
    20. c.jump();
    21. }
    22. }

  • 相关阅读:
    rust开发wasm 01
    Dataworks实现接口调用
    洛谷 P8313 [COCI2021-2022#4] Izbori
    时间轮原理及其在框架中的应用
    【vue3源码】十三、认识Block
    vue基础难点总结
    【异构知识蒸馏:IVIF】
    第1次 更多的bash shell命令
    【附源码】Python计算机毕业设计企业物资管理系统
    把a文件里面的内容全部给b文件里面去
  • 原文地址:https://blog.csdn.net/qq_58259539/article/details/127590910