访问权限修饰符,关键字,用来修饰类、属性、方法,不同的访问权限修饰符表示不同的作用域
修饰符 | 同一个类 | 同一个包 | 不同包 | 子类 |
---|---|---|---|---|
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 是 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;
}
}