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

时间: 07-11

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

java基础教程-面向对象(一)

一.面向对象 1.1 java键盘输入 1.1.1这种方法我认为是最简单,最强大的,就是用Scanner类 import java.util.Scanner; public static void main(String [] args) { Scanner sc = new Scanner(System.in); System.out.println(“请输入你的姓名:”); String name = sc.nextLine();//字符串输入 System.out.println(“请输入

java书籍推荐:《Java SE 6 技術手册》

Java SE 6 技術手册 或  Java SE 6 技術手册 Java SE 6 技術手册 為什麼選擇用 Markdown?仅仅是單純把文件又一次排版太無聊了,不如趁這個機會學些新東西.所以我就藉這個機會來學著用 Markdown,並看看它有什麼好處與壞處 ... 假设你须要 PDF 與 epub 格式.而又有點懶自己轉換,那麼能够考慮在 Google Play 或 Pubu 上向便當價致敬,假设你须要 mobi 格式,能够使用 calibre 把 epub 轉為 mobi ... :) 我

Java SE 简介 & 环境变量的配置

Java SE 简介 & 环境变量的配置 一.Java 技术的三个方向 Java 技术分为三个方向 javaSE( Java Platform Standard Edition 标准版)用来开发桌面应用程序,例如客户端.它是Java EE的基础,是java技术体系的核心: javaEE( Java Platform, Enterprise Edition,企业版)用来进行企业级应用开发.通常java EE包括JSP.Servlet.JDBC.XML等13种技术: javaME(Java Plat

黑马程序员 Java SE回顾

----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Java SE基础回顾 1.循环语句中的break是终止全部循环,跳出循环体:而continue是终止本次循环,跳执行下一循环 2.return语句有两个作用:返回值:结束方法的运行 3.对于java中面向对象的理解:以类的方式组织代码,以对

Java SE 6 新特性: HTTP 增强--转

概述 Java 语言从诞生的那天起,就非常注重网络编程方面的应用.随着互联网应用的飞速发展,Java 的基础类库也不断地对网络相关的 API 进行加强和扩展.在 Java SE 6 当中,围绕着 HTTP 协议出现了很多实用的新特性:NTLM 认证提供了一种 Window 平台下较为安全的认证机制:JDK 当中提供了一个轻量级的 HTTP 服务器:提供了较为完善的 HTTP Cookie 管理功能:更为实用的 NetworkInterface:DNS 域名的国际化支持等等. NTLM 认证 不可

java se的那些细节

局部变量:方法体内或语句块内,不能有修饰符 成员变量:与类的对象共存,可以有修饰符 类属性:与类共存,可以有修饰符 一.局部变量:必须先赋值,才能使用,如果不赋初值,则会报错,即没有默认的始使值,而基本数据类型的类属性或成员变量则不会,他们通过编译以后被赋与默认值. 程序1: public class Test{    public static void main(String[] args){        float f;        System.out.println(f);   

安卓里面JSON处理和JAVA SE里面的JSON包

今天编译安卓项目遇到这个问题 com.android.dex.DexException: Multiple dex files define的解决办法 大致意思就是引用了 相同的包 在JAVA SE里面我使用的是 import net.sf.json.JSONObject; 这个就不多说了,网上大家都可以下载到,但是当吧这个jar放到安卓里就出现引用相同的包的问题了 看了下android.jar 里面有个org.json 一样可以处理 问题解决

Java基础和面向对象

Java基础和面向对象 一.数据类型和运算符 标识符 组成:字母.数字.下划线.$ 首字母:不能是数字 见名知义 不能是关键字(48个) 正确的:name.name123.age._name.$name 错误的:1name.public.123.na%me 标识符主要给一个元素起名字,需要符合起名字的以上4种规则.比如说,类的名字:首字母大写:变量名称:小写:方法名称:驼峰命名:数组名称.接口名称.集合名称. //你定义为汉字也可以,不过不推荐,因为国际语言以English为主.为了面向世界,使

【Java SE】如何用Java实现直接选择排序

摘要:直接选择排序属于选择排序的一种,但是它的排序算法比冒泡排序的速度要快一些,由于它的算法比较简单,所以也比较适合初学者学习掌握. 适宜人群:有一定Java SE基础,明白Java的数据类型,数组的定义.初始化以及常用数组的方法,还有Java的循环操作. 前期准备:最好有一个开发工具比如说:eclipse或者myeclipse都可以,当然你使用DOS系统进行编译运行都可以,只不过改bug会麻烦一点. 排序原理:直接选择排序的原理是将指定排序位置与其他数组元分别对比,如果满足条件就交换位置的值,

Java SE 基础:标识(zh&#236;)符

Java SE 基础:标识(zhì)符 一.标识符定义 标识符,就是给类.接口.方法.变量等起名字时的字符序列 二.组成规则与注意事项 1.组成规则 英文大小写字母 数组 $ 和 _ 2.注意事项 不能以数组开头 不能是 Java 关键字(见关键字表:) 书写时区分大小写(大写和小写表示两个不同的标识符,如 public 和 Public 是不同的) 三.Java 中标识符的命名规则要做到:见名知意 包(package):包其实就是文件夹,用于区分项目中文件的结构,包名应当使用小写 单级包:to