zoukankan      html  css  js  c++  java
  • linkin大话面向对象--抽象类


    abstract [非private访问修饰符] 返回值类型 方法名称(参数列表);


    当编写一个类时,我们往往会为该类定义一些方法,这些方法时用来描述该类的行为方式,那么这些方法都有具体的方法体。

    但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。


    比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢?
    所有的图形都有求面积的方法,不管你是正方形,矩形,圆形无所谓,他们都是图形,所以我们应该抽象一个图形这个父类。第一种做法,我们把求面积的方法作为每一个子类的自己的方法,但是这样,我们就不能利用多态来统一的屏蔽子类的实现细节,那有同学就想,那我们就给父类添加一个求面积的方法,但是对于图形来说,这个方法其实是没有任何实际意义的,那么有同学就想,我们这个方法就随便返回一个0吧,然后要子类都来重写这个方法。问题就来了,如果我有一个图形的子类忘记覆盖这个方法了,java是不知道的,但是应用在逻辑上是有错误的,那么有没有一个方式,来让我们能在父类里面加一个方法,但是这个方法在父类里面是没有实际含义的,并且要求子类必须重写这个方法,如果不重写,java在编译的时候就给我们报错,是不是就能解决这个问题了?那么这个机制就是抽象类。


    通过abstract关键字来修饰的类称为抽象类;可以定义被abstract修饰的抽象方法。抽象方法只有返回类型和方法签名,没有方法体。抽象类可以含有普通方法。抽象类不能创建实例对象(不能new)。需要子类覆盖掉所有的抽象方法后才可以创建子类对象,否则子类也必须作为抽象类


    分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是功能声明相同,但功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。抽象方法要存放在抽象类中。抽象方法也可以存在于接口中。方法签名由方法名称和一个参数列表组成。
    代码规范问题,abstract一般写在方法修饰符最前面,醒目,一看就知道是抽象方法;



    列举常见的几个抽象类:
    流的四个基本父类
    InputStream,OutputStream,Reader,Writer



    抽象类能使用final修饰吗?//NO

    抽象类可以定义构造方法吗?//YES

    final和abstract可以同时使用吗?//永远不可以

    final和private可以同时使用吗?//永远不可以


    public class GraphDemo {
        public static void main(String[] args) {
            Circle c = new Circle(1.0);
            double d1 = c.getZhouchang();
            Graph c2 = new Circle(2.0);
            double d2 = c2.getZhouchang();
            Graph s = new Sanjiaoxing(3,4,5);
            double d3 = s.getZhouchang();
            System.out.println(d1 +"," +d2 +"," + d3);
        }
    }
    
    abstract class Graph{
        abstract double getZhouchang();
    }
    
    class Circle extends  Graph{
        private double r;
        public Circle(double r){
            this.r=r;
        }
        @Override
        double getZhouchang() {
            return Math.PI*r*2;
        }
    }
    class Sanjiaoxing extends  Graph{
        private double a;
        private double b;
        private double c;
        
        public Sanjiaoxing(double a,double b, double c){
            isSanjiaoxing(a, b, c);
        }
        
        private void isSanjiaoxing(double a,double b, double c){
            if(a+b<=c||a+c<=b||b+c<=a){
                System.out.println("不是一个三角形。。。");
            }else{
                this.a = a;
                this.b = b;
                this.c = c;
            }
        }
        
        @Override
        double getZhouchang() {
            return a + b +c;
        }
        
    }
    



  • 相关阅读:
    转载-python生成sjf
    111111111111
    【MySQL】使用硬链接的方式删除大表
    【Python】公共类-获取MySQL数据
    【Python】公共类-logger
    文件IO --- sync、fsync、fdatesync
    【Mongo】安装Mongo并配置副本集
    【MySQL】InnoDB 内存管理机制 --- Buffer Pool
    【MySQL】redo log --- 刷入磁盘过程
    Linux 系统的安装
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5233159.html
Copyright © 2011-2022 走看看