栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2022-07-26 第八组 韩文清

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022-07-26 第八组 韩文清

                                                              抽象

   一 面向对象的四大特征之一 抽象(abstract)

1.其中abstract 表示该类或该方法是抽象的,抽象方法只有声明没有实现。需要注意的是 abstract 关键字只能用于普通方法,不能用于 static 方法或者构造方法中。

2.抽象方法的 三个特征如下:

   *抽象方法没有方法体

   *抽象方法必须存在于抽象类中

   *子类重写父类时,必须重写父类所有的抽象方法

3.注意

   在使用 abstract 关键字修饰抽象方法时不能使用 private 修饰,因为抽象方法必须被子类重写,而如果使用了 private 声明,则子类是无法重写的。抽象方法也不能用final修饰(不能被重写),而抽象方法必须被重写。抽象类也不能用final修饰,用final修饰的类是不允许被继承的。

4.抽象类的定义和使用规则如下:

   *抽象类和抽象方法都要使用 abstract 关键字声明。例:public abstract void eat();

  *如果一个方法被声明为抽象的,那么这个类也必须声明为抽象的。

   *抽象类不能实例化,也就是不能使用 new 关键字创建对象。

5.抽象方法存在的意义是什么?

   根本意义:约定,自定义的规则。

   约定:约定了返回值,访问权限,参数列表,需要在重写的时候去定义方法体。

6.抽象类可以有那些结构?

   结构:属性,成员方法,构造器,抽象方法,常量。

7.抽象类里能不能没有抽象方法?

   抽象类可以没抽象方法。但是不能被实例化,不能创建对象。

8.抽象类的构造器存在的意义:

   为了约定子类的构造器必须和父类匹配。

*抽象方法的总结:

  • 1.抽象方法必须是public或者是protected因为如果是private,不饿能被子类继承

  • 子类便无法实现方法,默认情况下是可以的。默认情况是public

  • 2.抽象类是不能被直接实例化,需要靠子类采用向上转型的方法处理。

  • 3.抽象类必须有子类,使用extends继承,一个类只能继承一个抽象类。

  • 4.子类(如果不是抽象类)则必须重写抽象类中的所有方法。

  • (如果子类没有实现父类的抽象方法)必须将子类也定义为abstract类。

例一:不同几何图形的面积计算公式是不同的,但是它们具有的特性是相同的,都具有长和宽这两个属性,也都具有面积计算的方法。那么可以定义一个抽象类,在该抽象类中含有两个属性(width 和 height)和一个抽象方法 area( ),具体步骤如下。

1.首先创建一个表示图形的抽象类 Shape,代码如下所示。

    public abstract class Shape {
    public int width; // 几何图形的长
    public int height; // 几何图形的宽

    public Shape(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public abstract double area();  // 定义抽象方法,计算面积
}

2.定义一个正方形类,该类继承自形状类 Shape,并重写了 area( ) 抽象方法。正方形类的代码如下

    public class Square extends Shape {     //正方形继承图形
    public Square(int width, int height) {
        super(width, height);     
    }
    // 重写父类中的抽象方法,实现计算正方形面积的功能
    @Override
    public double area() {
        return width * height;
    }
}

3.定义一个三角形类,该类与正方形类一样,需要继承形状类 Shape,并重写父类中的抽象方法 area()。三角形类的代码实现如下:

    public class Triangle extends Shape {
    public Triangle(int width, int height) {
        super(width, height);
    }

    // 重写父类中的抽象方法,实现计算三角形面积的功能
    @Override
    public double area() {
        return 0.5 * width * height;
    }
}

4.最后创建一个测试类,分别创建正方形类和三角形类的对象,并调用各类中的 area() 方法,打印出不同形状的几何图形的面积。测试类的代码如下:

         public class ShapeTest {
         public static void main(String[] args) {
        Square square = new Square(5, 4);            // 创建正方形类对象
        System.out.println("正方形的面积为:" + square.area());
        Triangle triangle = new Triangle(2, 5);     // 创建三角形类对象
        System.out.println("三角形的面积为:" + triangle.area());
    }
}

   在该程序中,创建了 4 个类,分别为图形类 Shape、正方形类 Square、三角形类 Triangle 和测试类 ShapeTest。其中图形类 Shape 是一个抽象类,创建了两个属性,分别为图形的长度和宽度,并通过构造方法 Shape( ) 给这两个属性赋值。

   在 Shape 类的最后定义了一个抽象方法 area( ),用来计算图形的面积。在这里,Shape 类只是定义了计算图形面积的方法,而对于如何计算并没有任何限制。也可以这样理解,抽象类 Shape 仅定义了子类的一般形式。

正方形类 Square 继承抽象类 Shape,并实现了抽象方法 area( )。三角形类 Triangle 的实现和正方形类相同,这里不再介绍。

在测试类 ShapeTest 的 main( ) 方法中,首先创建了正方形类和三角形类的实例化对象 square 和 triangle,然后分别调用 area( ) 方法实现了面积的计算功能。

二.接口(更高级的抽象)

1.接口的声明:使用interface关键字,直接代替class。例:public interface ch00();

2.Jdk1.7之前,接口中只能定义抽象方法,不能有属性,不能有方法,可以放静态常量,静态方法

3.jdk8以后,接口中也只能定义抽象方法,不能有属性,可以有默认的方法和静态方法。

*静态常量:public static final String NAME=" ...";

  静态方法:public static void show();

  抽象方法:public abstract void eat();

  默认方法:public default void info();

4.接口中结构的特点:

  • 接口中的方法默认为public abstract我们推荐就省略了,

  • 接口中的常量默认是 public static final ,我们推荐就省略了。

5.接口存在的意义:约定,(比抽象类更加严格)

总结:

       接口中的结构必须是public

       接口可以被实现,实现类

       例: 比如说A类 implements 接口,那么我们就说A是这个接口的实现类。

       如果一个类实现了一个接口,他就需要重写接口中的所用方法。 

       实现接口时可以多实现的,继承只能是单继承的

       开发中,如果一件事情可以通过继承和实现接口来解决,优先使用接口解决。

       例:public class cat extends Animal implements Biology{

          cat类同时继承了Animal并实现了Biology接口,

         cat类可以叫Animal的子类 也可以叫Biology的实现类。

        

三.面试题

1. 继承抽象类和实现接口的异同?

异:继承只能单继承,但是接口可以多实现

同:都要重写

2.Java中只有单继承吗?
   Java与类之间只有单继承,与接口之间有多继承。

四.匿名实现类

Abstr01 a01 = new Abstr01() {
    @Override
    public void show() {
        System.out.println("重写过后的show方法");
    }
};
a01.show();

学习情况:不太掌握

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1028684.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号