Java基础(七)——final,抽象类,模板,接口

28 篇文章 5 订阅
  1. 类的修饰符有三个: final, public, 什么都不写
    (内部类可以被private所修饰)

  2. final:最终,最为一个修饰符

    1. 可以修饰类,函数,变量
    2. 被final修饰的类不可以被继承,是为了避免被继承,被子类复写功能
    3. 被final修饰的方法不可以被复写。
    4. 被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量买也可以修饰局部变量。
      在这里插入图片描述
      当在描述事物是,一些数据的出现值是固定的,那么这是为了增强阅读性,都给这些值起一个名字,方便与阅读。
      而这个值不需要改变,所以加上final修饰,作为常量没常量的书写规范:所有有的字母都大写,如果由多个单词组成,单词间可以通过_链接。
      public final static double double MY_PI = 3.141592653
    5. 内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。
  3. 抽象类:
    当多个类中出现相同功能,但是功能主题不同。
    这也是进行向上抽取,这时只抽取功能定义,而不抽取功能的主体。
    在这里插入图片描述

    抽象类的特点:(抽取所有子类的公共特点)

    1. 抽象方法一定定义在抽象类中
    2. 抽象方法和抽象类都必须要被abstract关键字修饰
    3. 抽象类不可以用new创建对象,因为调用抽象方法没有意义。(抽象类不能被实例化)
    4. 抽象类中的抽象方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象调用。
      如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
      在这里插入图片描述
      在这里插入图片描述
      抽象类和一般类没有太大的不同。该如何描述事物,就如何描述事物,只不过,该事物出现了一些不确定的东西。
      这些不确定的部分,也就是该事物的功能,需要明确出现,但是无法定义主体。通过抽象方法来表示。
      抽象类比一般类多个抽象函数。就是在类中可以定义抽象方法。
      抽象类不可以实例化。
      抽象类可以不定义抽象方法,这样做仅仅是不让该类建立对象。

示例:假如我们在开发一个系统时需要对员工进行建模,员工包含3个属性:姓名、工号以及工资。经理也是员工迈出了含有工资的属性外,另外还有一个奖金属性。请使用继承的思想设计出员工类和经理类。要求类中必须提供必要的方法进行属性访问。

员工类:name, id, pay

经理类:继承员工,并有自己特有的bonus.
public abstract class Employee {
    private String name;
    private String id;
    private double pay;

    Employee(String name,String id, double pay)
    {
        this.name = name;
        this.id = id;
        this.pay = pay;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public double getPay() {
        return pay;
    }

    public void setPay(double pay) {
        this.pay = pay;
    }

    public abstract void work();
}

class Manager extends Employee
{
    private int bonus;
    Manager(String name, String id,double pay,int bonus)
    {
        super(name,id,pay);
        this.bonus = bonus;
    }

    public int getBonus() {
        return bonus;
    }

    public void setBonus(int bonus) {
        this.bonus = bonus;
    }

    public void work()
    {
        System.out.println("manager work!!!");
    }
}

class Pro extends Employee
{
    Pro(String name, String id,double pay)
    {
        super(name,id,pay);
    }
    public void work()
    {
        System.out.println("manager work!!!");
    }
}
抽象关键字abstract不可以和哪些关键字共存?
final,private
抽象类是否有构造函数?
可以有,不能实例化,一般是无参构造函数,让子类调用
抽象类中可不可以没有抽象方法?
可以
  1. 模板方法设计模式
    定义:在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,那么这时候就将不确定的部分暴露出去,由该类的子类去完成。

获取一段程序的运行时间。(但是程序不确定就可以用模板设计模式)

public abstract class GetTime {              
    public final void getTime()   //不可以被子类复写
        {
            long start = System.currentTimeMillis();
            runcode();
            long end = System.currentTimeMillis();
            System.out.println();
            System.out.println("毫秒:" + (end - start));
        }
        public abstract void runcode();  //不一定要抽象,但是是可以被覆盖的代码。
}

class SubTime extends GetTime
{
    public void runcode()
    {
        for(int i = 0; i < 4000; i++)
            System.out.print(i);
    }
}

class GettTimeDemo
{
    public static void main(String[] args) {
        SubTime st = new SubTime();
        st.getTime();
    }
}
  1. 接口
    接口:初期理解,可以认为是一个特殊的抽象类
    当抽象类中的方法都是抽象的,那么该类可以同构接口的形式来表示。
    class用于定义类。
    interface 用于定义接口。
    在这里插入图片描述
    在这里插入图片描述
    接口定义时,格式特定:

    1. 接口中常见定义:常量,抽象方法。
    2. 接口中的成员都有固定修饰符。
      常量:public static final
      方法:public abstract
      void show();该方法要么是接口类的方法(自动补充上public abstract),要么是抽象类。

    记住:接口中的成员都是public的。
    接口:是不可以创建对象的,因为有抽象方法。需要被子类实现,子类对接口中的抽象方法全部都被覆盖后,子类才可以实例化,否则子类也是一个抽象类。

interface Inter    //interface是特殊的class
{
    public static final int NUM = 3;
    public abstract void show();
}

class Test implements Inter
{
    public void show()
    {

    }
}

class InterfaceDemo {
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t.NUM);         //三种调用方法都可以。
        System.out.println(Test.NUM);
        System.out.println(Inter.NUM);
    }
}

接口可以被类多实现,也是对多继承不支持的转换形式,java支持多实现。

interface A
{
}

interface B
{
}

class c implements A,B    //具体的抽象方法只实现一个
{
}

类与类之间是(单)继承关系,类与接口之间是实现关系,接口与接口之间是(多)继承关系。
接口是对外暴露的规则,程序的功能扩展,用来多实现的。

继承是体系(基类是子类所共有的特点,接口是子类扩展时特有的特点。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值