final(最终的) 、abstract(抽象)、interface(接口)、访问修饰符、equals方法重写

140 阅读5分钟

final(最终的) 、abstract(抽象)、interface(接口)、访问修饰符、equals方法重写

final

概念:final最终的,用来修饰方法、属性、类

  • 修饰类:

语法:public final class Animal{}

作用:final修饰的类无法被继承

使用场景:不希望被继承,不希望代码被复制

  • 修饰方法:

语法:public final void eat(){}

作用:final修饰的方法不能被重写

场景:不希望类有差异化

  • 修饰变量:

语法:final 标识符

作用:

  1. final修饰的局部变量只能被赋值一次
  1. final修饰的成员变量必须手动初始化,不能自动初始化
  2. final修饰引用变量,引用绑定的地址不能改变,到那时引用指向内部的数据可以改变

复习一些概念:

常量:经赋值不能改变的量

常量一般标识符全大写

常量一般用public static final 定义

重要结论:final修饰的变量只能赋值一次

访问修饰符

访问修饰符的类型:public (公开)、protect(受保护)、 默认、private(私有)

看一张表就能清楚的区分

访问级别访问修饰符同类同包子类不同包
公开public
受保护protect×
默认没有修饰符××
私有private×××
  • 包命名
  1. 最好是小写
  1. 公司网址反写,www.alibaba.com com.alibaba.项目名.模块.功能名
  2. 行业后缀:.com 商业类 .gov政府类
  • package 使用规则
  1. 同一个包相互调用,不需要写报名,直接调用
  2. 不同的包相互调用需要些包名,才能找到对应的类
  3. package必须出现在第一行
  • import 导入包
  1. import关键字,写在package下面
  2. import 包名,自动导包
  3. import* 导入全部包,不推荐
  4. eclipse alt+/ 自动导包

abstract(抽象)

概念:abstract 挂剪子就是抽象,修饰类、方法

  • 修饰类

语法:abstract class Animal{ }

  1. 抽象类,不能被实例化,能被其他类继承
  2. 抽象类也有构造函数,但是给继承类调用的
  3. abstract final 不同同时修饰一个方法或者一个类

使用场景:

类型太多、类与类之间有相同的属性和行为

为了降低代码的耦合度,提高代码的拓展性(多态)

  • 修饰方法

语法:public abstract void eat();

特点:

  1. 抽象方法没有方法体,以;结尾
  2. 抽象方法必须被非抽象子类重写,抽象子类可以不重写
  3. 抽象方法最终一定会被非抽类继承,如果没有被非抽象类继承,抽象类无意义
  4. 抽象方法只能出现在抽象类中,抽象类中既可以有抽象方法,也可以有非抽象方法

什么时候使用抽象类:

规范子类的行为,不同子类的行为有差别

接口

概念:接口是一种标准、规范

java接口是一种引用数据类型

语法:public interface USB(){}

场景、什么时候使用

希望封装者、调用者遵守一个共同的规则

特点:

  1. 接口是一种引用数据类型,也是特殊的抽象类class
  2. 编译之后还是生成class文件,所有也是引用数据类型
  3. 接口里面可以有属性
  4. 接口里面的方法都是abstract方法,修饰符列表public abstract,所以sun公司允许省略不写,但方法还是抽象方法
  5. 接口里面的属性都是常量,修饰符列表public static final,也可省略
  6. 接口可以类被实现implements
  • 引用数据类型描述方法

[修饰符列表] interface 接口名 {}

[修饰符列表] abstract class 抽象名 {}

[修饰符列表] class 类名 {}

都可以使用多态

  • 接口和类的区别
  1. 接口是特殊的抽象类
  2. 接口用interface修饰,类用class修饰
  3. 类可以继承另一个类extands;接口与接口之间可以用多个extands继承;类与接口之间有实现关系;用implements
  4. 一个类只能继承另一个父类,接口是多继承,接口的多继承是为了弥补类单继承缺陷
  5. 一个类在继承另一个类的同时,也可以实现那多个接口,但是接口不能实现那个另一个接口(接口不能implements 接口)

复习一下equals方法重写

  • equals重写:判断两个对象属性是否相等

题目描述:传入一个Person,姓名:李强,年龄:21,性别:男,判断与另一个Person对象属性是否相等,通过重写equals实现

package oneday;
public class equalsChongZai {
    public static void main(String[] args) {
        Person p1 = new Person("李强",21,false);
        Person p2 = new Person("李强",21,false);
        System.out.println(p1.equals(p2));
    }
}
class Person {
    private String namel;
    private int age;
    private boolean sex;
    
//  重写equals方法,判断两个Person属性是否相同
    public boolean equals(Object obj) {
        if(this == obj) { //this表示当前
            return true;
        }
        if(obj instanceof Person){  //判断obj 引用指向Person对象
            Person p = (Person)obj;  //向下转型,基本数据类型可以直接==判断,引用数据类型用equals判断
            return p.namel.equals(this.namel)&&p.age==this.age&&p.sex==this.sex;
        }
        return false;
    }
    
//  构造函数
    public Person(){}
    public Person(String namel, int age, boolean sex) {
        super();
        this.namel = namel;
        this.age = age;
        this.sex = sex;
    }
//  get/set 方法
    public String getNamel() {
        return namel;
    }
    public void setNamel(String namel) {
        this.namel = namel;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public boolean isSex() {
        return sex;
    }
    public void setSex(boolean sex) {
        this.sex = sex;
    }
}

运行结果为true

后感:感觉对重写、继承、多态还是不太理解

        if(obj instanceof Person){  //判断obj 引用指向Person对象
            Person p = (Person)obj;  //向下转型
            return p.namel.equals(this.namel)&&p.age==this.age&&p.sex==this.sex;
            //基本数据类型可以直接==判断,引用数据类型用equals判断
        }

这段代码纠结挺久的,好在最终是实现了需求

\