抽象类和抽象方法

  抽象类和抽象方法必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法

抽象类和抽象方法的规则如下

  1.抽象类和抽象方法必须要用abstract来修饰,抽象方法里可以没有方法体.

  2.抽象类不能实例化,无法使用new关键字来调用构造器创建抽象类的实例.

  3.抽象类可以包含成员变量,方法(普通方法和抽象方法都可以),构造器,初始化块,内部类(接口,枚举)5种成分,抽象类的构造器不能用与创建实例,主要用于被其子类调用.

  4.含有抽象方法的类(包括直接定义了一个抽象方法;或者是继承了一个抽象父类,但是没有完全实现父类包含的抽象方法;或者是实现了一个接口,但是没有完全实现接口包含的抽象方法三种情况)只能被定义成抽象类.

定义抽象类只需要在类上面加关键字abstract,定义抽象方法只需要在普通方法上增加abstract修饰符,并把普通方法的方法体(也就是方法后面的花括号括起来的部分)全部去掉,并在方法后面增加分号即可.

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

  普通方法:public void test(){}

示例代码:

package com.j1803.abstractTest;

public abstract class Shape {
    
    {
        System.out.println("执行Shape的初始化块");
    }
    
   private String color;
   
   //定义计算周长的抽象方法
   public abstract double calPerimeter();
   //定义一个返回形状的抽象方法
   public abstract String getType();
   
   //构造函数,用于被子类调用.
   public Shape() {}
   public Shape(String color) {
       System.out.println("执行Shape的构造器");
       this.color=color;
   }
}
package com.j1803.abstractTest;

public class Triangle extends Shape{
    //定义三角形的三边
    private double a;
    private double b;
    private double c;
    
    //构造方法
    public Triangle(String color, double a, double b, double c) {
        super(color);
        System.out.println("执行Triangle构造器");
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public static void main(String[] args) {
        Shape s1=new Triangle("黑色",3,4,5);
        System.out.println(s1.getType());
        System.out.println(s1.calPerimeter());
    }
    
    //重写Shape类的计算周长公式
    @Override
    public double calPerimeter(){
        return a+b+c;
    }
    //重写Shape类的返回形状的抽象方法
    @Override
    public String getType() {
        return "三角形";
    }

}
  当使用abstract修饰时表明这个类只能被继承;当使用abstract修饰方法时,表明这个类必须由子类提供实现(即重写).final修饰的类和方法不能被继承和重写,因此final和abstract永远不能同时使用  

  abstract不能用于修饰成员变量,不能用于修饰局部变量,即没有抽象变量,没有抽象成员变量说法.

  abstract不能用于修饰构造器,没有抽象构造器,抽象类里定义构造器只能是普通构造器

  ,static修饰一个方法时,表明这个方法属于这个类,通过类就可以调用这个方法,但如果该方法被定义成抽象方法,则将导致通过该类来调用该方法时出现错误(调用了一个没有方法体的方法肯定会引起错误),因此,static和abstract不能同时修饰某个方法,即没有所谓的类抽象方法..注:static和abstract并不是绝对互斥的,static和abstract虽然不能同时修饰某个方法,但它们可以同时修饰内部类

  abstract关键字修饰的方法必须被其子类重写才有意义,否则这个方法将永远不会有方法体,因此abstract方法不能定义为private访问权限,即private和abstract不能同时修饰方法

======================================================

抽象类的作用:

  抽象类作为子类的模板,避免了子类设计的随意性,抽象类体现的就是一种模板模式的设计.

模板模式范例2:抽象父类中,父类的普通方法依赖于一个抽象方法,而抽象方法则推迟到子类中提供实现

package com.j1803.abstractTest;

public abstract class SpeedMeter {
    //转速
    private double turnRate;
    //无参构造方法
    public SpeedMeter() {}
    //把计算车轮周长的方法定义成抽象方法
    public abstract double calGirth();
    
    public double getTurnRate() {
        return turnRate;
    }
    public void setTurnRate(double turnRate) {
        this.turnRate = turnRate;
    }
    //定义计算速度的通用算法
    public double getSpeed() {
        //速度等于 周长*转速=============calGirth()为抽象方法
        return calGirth()*turnRate;
    }
}
package com.j1803.abstractTest;

public class CarSpeedMeter extends SpeedMeter{
    private double radius;
    

    public CarSpeedMeter(double radius) {
        super();
        this.radius = radius;
    }

    public static void main(String[] args) {
        CarSpeedMeter csm=new CarSpeedMeter(0.34);
        csm.setTurnRate(15);
        System.out.println(csm.getSpeed());

    }

    @Override
    public double calGirth() {
        return radius*2*Math.PI;
    }

}
  SpeedMeter类提供了速度表的通用算法,但一些具体的实现细节则推迟到其子类CarSpeedMeter类中实现.这也是一种典型的模板模式

  模板模式在面向对象的软件中很常见,其原理简单,实现也很简单,下面是两条简单规则.

  1.抽象父类可以只定义需要使用的某些方法,吧不能实现的部分抽象成抽象方法,留给其子类去实现

2.父类中可能包含需要调用其他系列的方法,这些被调用方法既可以有父类实现,也可以由其子类实现,父类里提供的方法只是定义了一个通用算法,其实现也许并不完全由自身实现,而必须依赖于其子类的辅助

java面向对象(下)-抽象类的更多相关文章

  1. Java面向对象之抽象类,接口

    抽象类: 含有抽象方法的类被声明为抽象类 抽象方法由子类去实现 含有抽象方法的类必须被声明为抽象类 抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中的所有抽象方法 抽象方法: 声明而未被实现的 ...

  2. Java面向对象之抽象类

    内容: 1.抽象类的产生 2.抽象类和抽象方法的定义与使用 3.抽象类和抽象方法的注意事项 4.实例分析 1.抽象类的产生 当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具 ...

  3. Java面向对象_抽象类、接口

    一.抽象类 概   念:很多具有相同特征和行为的对象可以抽象为一个类:很多具有相同特征和行为的类可以抽象为一个抽象类 关键字:abstract 规   则:1.抽象类可以没有抽象方法,有抽象方法的类必 ...

  4. Java 面向对象编程 抽象类 抽象方法 abstract

    抽象类 通过abstract定义的方法是抽象方法,它只有定义,没有实现.抽象方法定义了子类必须实现的接口规范: 定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法: 如果 ...

  5. Java面向对象13——抽象类

    抽象类  package oop.demon01.demon08; ​ //abstract 抽象类: 类 extends: 类---单继承   (接口可以多继承) public abstract c ...

  6. 浅谈Java面向对象之抽象类(abstract)

    java语言,声明类时格式为: abstract class Db{} 说明Db类为抽象类.抽象方法是说没有方法的实现(方法体)此方法为抽象方法,只有抽象类和接口中才可以有抽象方法.简而言之,含有抽象 ...

  7. java面向对象_抽象类和接口

    一.抽象类 1.抽象方法:由abstract修饰.只有定义没有方法体.用一个分号结尾. 2.抽象类: 1)包含抽象方法的类必须是抽象类 2)由abstract修饰 3)不能被实例化 4)抽象类如果不被 ...

  8. java面向对象下:Java数据库编程

    19.Java数据库编程: JDBC概述:        JDBC(Java Database Connection)是java中提供的一套数据库编程API,它定义了一套用来访问数据库的标准Java类 ...

  9. java面向对象下:JavaXML解析技术

    20.JavaXML解析技术: XML概述:        XML可扩展标记性语言,用于数据表达和数据传递. XML语法规则:        合法DTDXML:1.内部DTD(和XML一起):2.外部 ...

随机推荐

  1. modelMapper使用,将数据库查询对象直接转成DTO对象

    1.pom引入 <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmap ...

  2. Java中List和Map的区别

    一.List和Map 1.特点 (1).List 1.可以允许重复的对象. 2.可以插入多个null元素. 3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序. 4.常用的实现类有 ...

  3. 菜鸟刷题路:剑指 Offer 09. 用两个栈实现队列

    剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的 ...

  4. 微软发布了Visual Studio 2022 Preview 1 以及.NET 6 Preview 5

    Microsoft 今天宣布了Visual Studio 2022 的第一个预览版,并且同时也发布了.NET 6 Preview 5. https://devblogs.microsoft.com/v ...

  5. 【NX二次开发】三点画圆,三角形外心,已知三点求圆心

    已知P1.P2.P3,求点O 算法:三点不在一条直线上时,通过连接任意两点,作中垂线.任意两条中垂线的交点是圆心.

  6. 基于TensorFlow的服装分类

    1.导包 #导入TensorFlow和tf.keras import tensorflow as tf from tensorflow import keras # Helper libraries ...

  7. linux下的对拍程序

    在比赛中我们通常会先打暴力 正解的正确与否,如果数据过大,我们就要用到对拍程序 1 #include<bits/stdc++.h> 2 using namespace std; 3 int ...

  8. leetcode5697. 检查二进制字符串字段

    5697. 检查二进制字符串字段给你一个二进制字符串 s ,该字符串 不含前导零 . 如果 s 最多包含 一个由连续的 '1' 组成的字段 ,返回 true​​​ .否则,返回 false . 示例 ...

  9. 可扩展的 Web 架构与分布式系统

    作者:Kate Matsudaira 译者:尹星 本文介绍了分布式架构是如何解决系统扩展性问题的粗略方法,适合刚刚入门分布式系统的同学,我把整篇文章翻译如下,希望给你一些启发. 备注:[idea]标注 ...

  10. VisualEffectGraph概述

    Visual Effect Graph 由来: Visual Effect Graph 是2018.3 以后版本,出的新的粒子特效技术.它是用显卡渲染特效,区别于传统的Patical system 的 ...