多态、Object常用类以及包装类
1:多态的理解
public static void main(String[] args) {
Person p1 = new Man();
System.out.println(p1.id);
p1.eat();
PersonTest test = new PersonTest();
test.method(new Man());
}
public void method(Person p) {
p.eat();
p.walk();
System.out.println(p.id);
}
Person p2 = new Person();
Man m2 = (Man) p2;
Object obj = new Man();
Person p3 = (Person) obj;
p3.eat();
2:Object类
1. 详解
* 1. java.lang.Object是所有其他java类的根父类
* 内部声明的方法具有通用性。
*
* 2. clone():可以看做是创建Java中对象的第二种方式
* 3. finalize():当垃圾回收器在回收对象前,对象会调用此方法。
4. wait() / notify() / notifyAll() :线程通信时所介绍的方法
2. equals()的使用
java.lang.Object类的equals()的使用
*
* 1. java.lang.Object类中equals()的声明:
* public boolean equals(Object obj) {
* return (this == obj);
* }
* 说明:Object类中的equals()是比较两个对象的地址值是否相同。(或比较两个引用是否指向堆空间中的同一个对象)
*
* 2. 像String\File\Date类等都重写了Object类中的equals()。重写的规则:
* 比较两个对象的属性值是否都相等。
*
* 3. 自定义类在没有重写Object类的equals()前,比较的都是两个引用的地址值是否相等。
* 但是一般开发中,凡是调用了equals(),都是想比较两个对象的实体内容是否相等。则意味着我们
* 要重写equals().
public class Order {
private String orderName;
private int orderId;
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public Order(String orderName, int orderId) {
this.orderName = orderName;
this.orderId = orderId;
}
public Order() {
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Order order = (Order) o;
if (orderId != order.orderId) return false;
return orderName != null ? orderName.equals(order.orderName) : order.orderName == null;
}
}
== 和 equals() 的区别?
1. == : 运算符,适用于基本数据类型(比较两个数据的值是否相等)、引用数据类型(比较两个引用是否指向堆空间中的同一个对象)
2. equals(): 适用于引用数据类型。在重写之前比较地址值,再重写之后一般我们希望比较其内容。
3. toString()的使用
1. Object类中toString()的定义:
* public String toString() {
* return getClass().getName() + "@" + Integer.toHexString(hashCode());
* }
* 2. 当我们没有重写Object类中的toString()方法时,当输出对象的引用时,默认调用Object类
* 中的toString()方法,输出对象的地址值。
*
* 3. 像String\日期Date\File类等类型都重写了Object类中的toString()方法,返回其内部的
* 实体内容。
*
* 4. 如果我们希望调用自定义类的toString()时,希望返回其内部实体内容。则需要进行重写。
*
public class Order {
private String orderName;
private int orderId;
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public Order(String orderName, int orderId) {
this.orderName = orderName;
this.orderId = orderId;
}
public Order() {
}
@Override
public String toString() {
return "Order{" +
"orderName='" + orderName + '\'' +
", orderId=" + orderId +
'}';
}
}
3:包装类的使用
1. 我们为8种基本数据类型提供了对应的8种包装类。目的是为了让基本数据数据类型的变量
* 具备类的特征 ---> 便于一些方法调用时使用。
2. 掌握8种基本数据类型以及对应的包装类。
3. 掌握:基本数据类型、包装类、String类三者之间的转换操作
@Test
public void test1(){
int m = 10;
Integer integer1 = new Integer(m);
System.out.println(integer1.toString());
float f1 = 10.2F;
Float float1 = new Float(f1);
String s1 = "10.3";
Float float2 = new Float(s1);
System.out.println(float2.toString());
int j = integer1.intValue();
System.out.println(j + 0);
float f2 = float2.floatValue();
}
@Test
public void test2(){
int m = 10;
Integer int1 = m;
Integer int2 = 10;
System.out.println(int1.toString());
method(10);
int n = int1;
int sum = int1 * 20;
test1(int2);
}
public void method(Object obj){
System.out.println(obj);
}
public void test1(int i){
}
@Test
public void test3(){
int num = 10;
Float f1 = new Float(10.1);
String s1 = String.valueOf(num);
String s2 = String.valueOf(f1);
System.out.println(s1);
System.out.println(s2);
String s3 = num + "";
}
@Test
public void test4(){
String s1 = "123";
Integer int1 = new Integer(s1);
int i = Integer.parseInt(s1);
String s2 = "true123";
s2 = "TruE";
boolean b = Boolean.parseBoolean(s2);
System.out.println(i);
System.out.println(b);
}
}
JDK5.0引入的新特性:自动的装箱和拆箱.可以实现基本数据类型和包装类之间的转换
基本数据类型、包装类 --> String类型: ① 调用String重载的valueOf(Xxx xx) ② 连接符:+
String类型 ---> 基本数据类型、包装类:调用包装类Xxx的parseXxx()
class Order{
boolean isMale;
Boolean isMarried;
}
class Account{
double balance;
Double balance1;
}
@Test
public void test5(){
Order order = new Order();
System.out.println(order.isMale);
System.out.println(order.isMarried);
}
4:单元测试方法
public class JUnitTest {
@Test
public void test1(){
System.out.println("hello");
int m = 10;
int n = 20;
System.out.println( m + n);
}
@Test
public void test2(){
int m1 = 10;
int n1 = 10;
System.out.println(m1 == n1);
int m2 = 65;
char c1 = 'A';
System.out.println(m2 == c1);
float f1 = 65.0F;
System.out.println(m2 == f1);
}
@Test
public void testGet(){
int sum = get(10,20);
System.out.println(sum);
}
public int get(int m,int n){
return m + n;
}
}
补充:关于String字符串常量池的使用
public class StringTest {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1 == s4);
System.out.println(s3 == s4);
}
}