69期-Java SE-009_面向对象-3-001-002

### 多态

一个事物有多种表现形态。

- 定义方法时形参为父类,调用方法时传入的参数为子类对象。
- 定义方法时返回值数据类型为父类,调用方法时返回子类对象。

具有继承关系的两个对象可以相互转换,子类转父类即父类引用指向子类对象,可以自动完成,无需强制转换,也叫做向上转型。

父类转子类即子类引用指向父类对象,不能自动完成转换,需要强制转换,也叫做向下转型。

### 抽象方法和抽象类型

如果一个方法只有方法声明而没有具体的方法实现,那么该方法就是抽象方法,在方法定义处使用 abstract 关键字对其进行修饰。

一旦类中定义了一个抽象方法,则该类也必须声明为抽象类,在类定义处添加 abstract 关键字。

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

抽象类和普通类的区别在于抽象类不能被实例化。

抽象方法和普通方法的区别在于抽象方法没有方法体。

抽象类中可以没有抽象方法。

但是包含了抽象方法的类必须被定义为抽象类。

可以在抽象类中定义非抽象方法,但是在普通类中不能定义抽象方法。

继承了抽象类的子类必须重写父类的抽象方法,以完成具体的方法实现。

如果子类也是抽象类,则不用重写父类的抽象方法。

### Object

Object 类经常被子类重写的方法:

public String toString()			以字符串的形式返回该类的实例化对象信息

public boolean equals(Object obj)	判断两个对象是否相等

public native int hashCode()		返回对象的散列码

### 包装类

Java 中的数据类型从本质上看可以分为两类:8种基本数据类型和引用类型。

包装类是 Java 提供的一组类,专门用来创建8种基本数据类型对应的对象。

包装类一共有8个,保存在java.lang包中。

byte			Byte

short			Short

int				Integer

long			Long

float 			Float

double			Double

char 			Character

boolean		Boolean

Object:Character、Number、Boolean

Number:Byte、Short、Integer、Long、Float、Double

包装类的拆箱和装箱,拆箱和装箱是包装类的特有名词,装箱是指将基本数据类型转为对应的包装类对象,拆箱是指将包装类对象转为对应的基本数据类型。

Cashier.java

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 void settlement(Member member) {
        member.buyBook();
    }

    public Member getMember(String name) {
        if(name.equals("ordinaryMember")) {
            return new OrdinaryMember();
        }else {
            return new SuperMember();
        }
    }
}

Member.java

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

    public void test() throws Exception {
        hashCode();
        getClass();
        equals(null);
        clone();
        toString();
        notify();
        notifyAll();
        wait();
        wait(1000L);
    }
}

OrdinaryMember.java

public class OrdinaryMember extends Member{
    @Override
    public void buyBook() {
        System.out.println("普通会员买书打6折");
    }
}

People.java

public class People {
    private int id;
    private String name;
    private int age;
    private char gender;
    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;
    }
    public char getGender() {
        return gender;
    }
    public void setGender(char gender) {
        this.gender = gender;
    }
    @Override
    public String toString() {
        return "People [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + "]";
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        People people = (People)obj;
        if(this.id == people.getId() && this.name.equals(people.getName()) && this.age == people.getAge() && this.gender == people.getGender()) {
            return true;
        }
        return false;
    }

    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return id*name.hashCode()*age*gender;
    }
}

SuperMember.java

public class SuperMember extends Member{

    @Override
    public void buyBook() {
        // TODO Auto-generated method stub

    }

}

Test.java

public class Test {
    public static void main(String[] args) {
        OrdinaryMember ordinaryMember = new OrdinaryMember();
        String str = ordinaryMember.toString();
        System.out.println(str);
        SuperMember superMember = new SuperMember();
        System.out.println(superMember);
        Cashier cashier = new Cashier();
        cashier.settlement(superMember);
//        cashier.setMember(superMember);
//        cashier.settlement();

        OrdinaryMember member = (OrdinaryMember)cashier.getMember("ordinaryMember");
        SuperMember member2 = (SuperMember)cashier.getMember("superMember");

        Member mem = new OrdinaryMember();
        mem = new SuperMember();

//        Member mber = new Member();
    }
}

Test2.java

public class Test2 {
    public static void main(String[] args) {
        People people = new People();
        People people2 = new People();
//        people.equals(people2);
//        System.out.println(people2.equals(people));
//        people.setId(1);
//        people.setName("张三");
//        people.setAge(22);
//        people.setGender(‘男‘);
//        System.out.println(people);
        String str = "Hello";
        String str2 = "Hello";
        System.out.println(str == str2);
        System.out.println(str.equals(str2));
        String str3 = new String("World");
        String str4 = new String("World");
        System.out.println(str3 == str4);
        System.out.println(str3.equals(str4));
//        System.out.println();
    }
}

Test3.java

public class Test3 {
    public static void main(String[] args) {
        People people = new People();
        People people2 = new People();
        people.setId(1);
        people.setName("张三");
        people.setAge(22);
        people.setGender(‘男‘);
        people2.setId(1);
        people2.setName("张三");
        people2.setAge(22);
        people2.setGender(‘男‘);
        System.out.println(people.equals(people2));
        System.out.println(people.hashCode());
        System.out.println(people2.hashCode());
    }
}

原文地址:https://www.cnblogs.com/HiJackykun/p/11172174.html

时间: 2024-08-30 11:16:18

69期-Java SE-009_面向对象-3-001-002的相关文章

69期-Java SE-007_面向对象-1-001-002

Student.java public class Student { //定义属性 int id; String name; int age; int userFirstName; double myScore; //定义方法 public static int add(int num1,int num2) { return num1+num2; } public static void add2(int num1,int num2) { System.out.println(num1+num

69期-Java SE-008_面向对象-2-001-002

User.java public class User { public static String name; public static int num; static { num++; System.out.println("执行了静态代码块"); } static { System.out.println("static2"); } } Cashier.java package entity; public class Cashier { private M

69期-Java SE-035_MySQL-6 存储过程、SQL练习 -doing

### 存储过程 存储过程是一组为了完成特定功能的 SQL 语句集合,经过编译后存储在数据库中,用户通过指定存储过程的名称以及参数来执行相应的存储过程. 一次编写,多次调用,避免开发人员重复编写相同的 SQL 语句,存储过程是在数据库中存储和执行的,可以减少客户端和服务端之间的数据传输,从而提高效率. ### 优点 - 模块化的程序设计,只需要创建一次存储过程,以后就可以在程序中调用该存储过程任意次. - 执行速度更快,如果某个操作需要执行大量的 SQL 语句或者需要重复执行 SQL 语句,存储

69期-Java SE-026-网络编程

### Java网络编程 Web 编程在整个 Java 开发中占据了很大一部分内容,所谓 Web 编程就是编写程序运行在同一网络下的两个终端上,使得它们之间可以进行数据传输. 计算机网络就是通过硬件设施.传输媒介把分散在不同地区的计算机进行连接,形成一个资源共享和数据传输的网络系统. 两台终端通过网络进行连接时,需要遵守一定的规则,这个规则就是网络协议(network rotocol),网络协议主要由3个特征组成: - 语法:数据信息的结构. - 语义:描述请求.动作和响应. - 同步:动作的实

69期-Java SE-031_MySQL-001-002 创建表、MySQL数据类型、数据的管理(数据库结构、数据表、数据)、SQL 函数

### 创建表 1.创建数据库 ```sql create database mstest default character set utf8 collate utf8_general_ci ``` 2.创建数据表 ```sql create table user( id int, name varchar(11) ) ``` Java 数据类型:基本数据类型 byte short int long double float boolean char ? 引用类型 MySQL 数据类型 - 整

69期-Java SE-002_变量、运算符-001-002

- 声明变量的数据类型和变量名. - 给内存空间赋值,该值就是变量值. - 通过变量名使用变量. ```java public class Hello { public static void main(String[] args) { //1.开辟内存空间,定义变量名 int num1; //2.赋值 num1 = 10; //3.使用变量 System.out.println(num1); } } ``` ```java public class Hello { public static

69期-Java SE-003_流程控制、循环-001-002

### 位运算符 十进制和二进制的转换. - 十进制转二进制:目标数除以二,如果能除尽,则该位计作零,如果除不尽,则该位计作一,再对商继续除以二,以此类推,直到商为零,然后将每一位的结果进行反序组合就是对应的二进制结果,10 转为二进制 1010,17 转为二进制 10001 - 二进制转十进制:从目标数最右侧算起,本位的数值乘以本位的权重,权重就是2的第几位的位数减一次方,如果第1位就是2的(1-1)次方,第2位就是2的(2-1)次方,第3位就是2的(3-1)次方…,将每一位的数值和本位权重相

69期-Java SE-004_循环、数组-001-002

Hello.java import java.util.Scanner; public class Hello { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str = "yes"; int num; while(str.equals("yes")) { System.out.print("请输入学生编号:")

69期-Java SE-036_MySQL-7 SQL练习 -doing

第一道: 现有图书管理数据库的三个关系模式,他们的字段分别如下: 图书表:总编号, 分类号, 书名, 作者, 出版单位, 单价 读者表:借书证号, 单位, 姓名, 性别, 职称, 地址 借阅表:借书证号, 总编号, 借书日期 以上表对应的字段明细如下: book : b_no ,b_type ,b_name , b_author ,b_publish ,b_price reader : r_no , r_unit , r_name ,r_sex ,r_pro ,r_address borrow