面向对象的特征三: 多态性
Object类
包装类

一.多态性

  1. 多态性的表现: ①方法的重载与重写 ②子类对象的多态性
  2. 使用的前提: ①要有继承关系 ②要有方法的重写
  3. 格式:
One More Thing 👇
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Person{
public void eat(){
System.out.println("人吃饭");
}
public void walk(){
System.out.println("人走路");
}
}
class Man extends Person{
public void entertainment(){
System.out.println("男人娱乐");
}
}
class Woman extends Person{
public void shopping(){
System.out.println("女人购物");
}
}
1
2
3
4
5
Person p = new Man();//向上转型
//虚拟方法调用:通过父类的引用指向子类的对象实体,当调用方法时,实际执行的是子类重写父类的方法
p1.eat();
p1.walk();
//p1.entertainment();//不能调用, Man类里没有这个函数
  1. 编译时, 认为p是Person类型的, 故只能执行Person里才有的结构, 即Man里特有的结构不能够调用
    子类对象的多态性, 并不使用于属性.
  2. 关于向下转型:
    ①向下转型,使用强转符: ()
    ②为了保证不报ClassCastException, 最好在向下转型前, 进行判断: instanceof
1
2
3
4
5
6
7
8
9
10
// 若a是A类的实例, 那么a也一定是A类的父类的实例。
if (p1 instanceof Woman) {
System.out.println("hello!");
Woman w1 = (Woman) p1;
w1.shopping();
}
if (p1 instanceof Man) {
Man m1 = (Man) p1;
m1.entertainment();
}

二.Object类

  1. java.lang.Object 类, 是所有类的根父类!

  2. Object类仅有一个空参的构造器 public Object(){ }

    关于方法:

① equals(Object obj)

1
2
3
public boolean equals(Object obj) {
return (this == obj);
}

A.基本数据类型: 根据基本数据类型的值判断是否相等. 相等返回true, 反之返回false
  注意: 两端数据类型可以不同, 在不同的情况下, 也可以返回true.
B.引用数据类型: 比较引用类型变量的地址值是否相等.
  而我们希望比较的两个对象的属性值都相同的情况下返回true的话, 要重写Object类的equals(Object obj)方法
  像String类 File类 Date类…重写了Object类的equals()方法, 比较是两个对象的"实体内容"是否完全相同

② toString()

  1. 当我们输出一个对象的引用时, 会默认调用toString()方法.
  2. 当我们没有重写Object类的toString()方法时, 打印的就是对象所在的类, 以及对象实体在堆空间的位置
  3. 而我们一般需要重写Object类的toString()方法, 将此对象的各个属性值返回.
  4. 像String类、Date、File类、包装类都重写了toString()方法.
1
2
3
4
//Object类的toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

String的内存结构:

String

三.包装类

Wrapper Class, 包装类均位于java.lang包下

基本数据类型由于不是类, 不能够使用Java类库里提供的大量的方法. 所以在设计上, 我们让每一个基本数据类型都对应一个类, 同时数据存储的范围还不变. 此时, 相当于基本数据类型就具有了类的特点. 这些类即为包装(wrapper 或封装类)

  • boolean ==> Boolean
  • byte  ==> Byte
  • short   ==> Short
  • int     ==> Integer
  • long  ==> Long
  • char  ==> Character
  • float  ==> Float
  • double ==> Double

需要掌握的:
基本数据类型、包装类、String类之间的转换!

包装类转换

简易理解:

  1. 基本数据类型与对应的包装类有自动装箱、自动拆箱 (JDK5.0之后)
1
2
3
4
//如下:
int i = 10;
Integer i1 = i;//自动装箱
int j = i1;//自动拆箱
  1. 基本数据类型、包装类---->String类: 调用String类的重载的valueOf(Xxx xx);
  2. String类---->基本数据类型、包装类: 调用相应的包装的parseXxx(String str);
1
2
3
//注意:
String str = "123";
int i = (int)str;//是错误的转换法.
  1. 特别的: Boolean的默认初始化值为null, 而boolean的默认初始化值为false;
1
2
Boolean b = new Boolean("true");//除了这样传参之外, 其他传参均为false
//不会报java.lang.NumberFormatException

评论