java004学习记录

子类访问权限

访问权限修饰符,关键字,用来修饰类、属性、方法,不同的访问权限修饰符表示不同的作用域

修饰符同一个类同一个包不同包子类
public可以访问可以访问可以访问可以访问
protected可以访问可以访问不可以访问可以访问
默认修饰符可以访问可以访问不可以访问不可以访问
private可以访问不可以访问不可以访问不可以访问

多态

一个元素具有多种不同的形态,在不同的应用场景中可以以不同的形态呈现,来满足当下的业务需求

如何具体实现,使用继承来实现

方法重写:子类在继承父类方法的基础上对该方法进行重写定义

public class Member {
    public void buyBook(){

    }
}
public class Cashier {
    private Member member;

    public Member getMember() {
        return member;
    }

    public void setMember(Member member) {
        this.member = member;
    }

    public void settlement(){
        this.member.buyBook();
    }
}
public class OrdinaryMember extends Member {
    public void buyBook(){
        System.out.println("普通会员买书打9折");
    }
}
public class SuperMember extends Member {
    public void buyBook(){
        System.out.println("超级会员买书打6折");
    }
}
public class VIPMember extends Member {
    public void buyBook(){
        System.out.println("VIP会员买书打5折");
    }
}
public class VVIPMember extends Member {
    public void buyBook(){
        System.out.println("VVIP会员买书免费");
    }
}
public class Test {
    public static void main(String[] args) {
        OrdinaryMember ordinaryMember = new OrdinaryMember();
        SuperMember superMember = new SuperMember();
        VIPMember vipMember = new VIPMember();
        VVIPMember vvipMember = new VVIPMember();
        Cashier cashier = new Cashier();
        cashier.setMember(vvipMember);
        cashier.settlement();
    }
}

抽象

封装、继承、多态、抽象

抽象类和抽象方法

抽象方法:没有方法体的方法

一个类中一旦包含任意一个抽象方法,则该类就需要定义为抽象类

public abstract class Member {
    public abstract void buyBook();
}

抽象类不能被实例化,抽象类不能通过 new 的方式来创建对象

一旦一个类继承了一个抽象类

1、重写父类中的抽象方法,把抽象的东西具体化

2、如果不去重写父类中的抽象方法,则该类也必须定义为抽象类

public abstract class Member {
    public abstract void buyBook();
}
public class MyMember extends Member {

    @Override
    public void buyBook() {

    }
}

Object 类

Object 是 Java 提供的一个类,位于 java.lang 包中,该类是所有类的直接父类或间接父类。

Object 是所有类的祖先,一个类在定义时如果不通过 extends 指定其直接父类,系统就会自动为该类继承 Object 类。

Object 类中有三个方法一般需要进行重写

方法描述
public String toString()以字符串的形式返回该类中的实例化对象信息
public boolean equals(Object obj)判断两个对象是否相等
public native int hashCode()返回对象的散列码

toString

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public class Account {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

equals

public boolean equals(Object obj) {
    return (this == obj);
}
import java.util.Objects;

public class Account {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || this.getClass() != o.getClass()) return false;
        Account account = (Account) o;
        return this.id == account.id &&
                this.age == account.age &&
                this.name.equals(account.name);
    }
}

hashCode

public native int hashCode();

用 native 修饰的方法叫做本地方法,由 Java 定义方法,由其他语言 (C++) 进行方法的实现

Java 语言的特性是面向应用层的语言,不能操作底层操作系统层面的数据,所以很多方法就受限,无法完成一些偏向底层的操作,如何解决?

通过本地方法的形式来解决,由 Java 定义,由 C++ 实现(C++ 可以操作操作系统底层数据的)

获取对象在内存中的散列码:内存地址 + 对象信息(属性信息)混合成一个 int 类型的数据,可以映射到内存地址

hashCode 用来判断两个对象是否相等的,不就会和equals 方法冲突了吗?

一般情况下,这个两个方法 hashCode 和 equals 是结合起来使用的,共同判断两个对象是否相等?

因为 hashCode 和 equals 方法的效率不一样,hashCode > equals

hashCode 虽然效率高,但是它存在一些问题

如果两个对象的 hashCode 不相等,则这两个对象一定不相等

如果两个对象的 hashCode 相等,不代表这两个对象一定相等

1、先用 hashCode 进行判断,如果不相等,则直接返回结果两个对象不相等,如果相等,则 hashCode 此时无法断定两个对象是否相等

2、再使用 equals 方法进行进一步的判断

import java.util.Objects;

public class Account {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || this.getClass() != o.getClass()) return false;
        Account account = (Account) o;
        return this.id == account.id &&
                this.age == account.age &&
                this.name.equals(account.name);
    }

    @Override
    public int hashCode() {
        return id*age;
    }
}
  • 48
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值