多态、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) ;
}
}