多态
- 可以理解为 一个事物的多中形态
- 父类的引用指向子类的对象
- 多态只能通过父类调用子类重写的方法,执行的是子类中的方法 即虚拟方法
- 多态的前提 : 类的继承关系 方法的重写
- 多态格式: 父类名 变量名 = new 子类名();
- 只适应方法,不适用于属性
- 举例 : 来连接数据时conn = new mysqlconnect();是用来连接mysql的语句,我们要使sql可以连接多种数据库,就需要使new的对象都继承于前边的父类,这样就实现了动态的多态,也能根据new的对象调用相应子类中重写的方法。
instanceof
- 用于向下转型 避免出现ClassCastExpection ,因此在向下转型之前需要先用instanceof判断
- a instanceof A : 判断a是否是类A的实例,如果是返回true,不是则返回false
关于 ==(运算符) 和 equals(方法)
==(运算符)
- == 对于基本数据类性来将(boolean除外) 比较两个变量保存的数值是否相等(不一定两者的类型要相等)
- == 对于引用数据类型来讲,比较的是两个引用数据类型变量的地址值是否相等
equals(方法)
-
equals是Object的方法,必须使用类来调用,所以和基本数据类型没关系, 只适用于引用数据类型(类,接口,数组)
-
OBject的equals方法:
public boolean equals(Object obj) {
return (this == obj);- 像String,Date,File等,这些类都重写了Object类中的equals方法,重写以后比较是两个对象的实体内容(属性)是否相同,不再比较地址值
- equals原则 ;对称性 自反性 传递性 一致性 (null.equals(a)和a.equals(null)永远都是false)
Object 类
- Object类是所有Java类的根父类
- 如果在类的声明中未使用extends关键字指明其父类,则默认的父类为java.lang.Object
- Object的属性和方法具有通用性
- Object声明了一个空参构造器,所有类都可以继承到
- Object.finalize()方法,用于销毁对象.垃圾回收器通知对象调用finalize()方法
Object类中的toString()方法
- 当我们输出一个对象时,实际是调用的Object的toString()方法
- 格式 :
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
-
像String,Date,File等,这些类都重写了Object类中的toString方法
Java中的JUnit单元测试
- 选中当前工程 -> 右键选择 build path - add libraries - JUit 4 - 下一步
- 创建Java类,进行单元测试
1.类是public
2.此类提供公共的无参构造器 - 在类中声明单元测试方法
1.方法的权限是public
2.没有返回值
3.没有形参列表 - 在单元测试方法上需要声明@Test,并在类中导入org.junit.Test
- Run as -> Junit test,运行绿色表示正常,红色表示异常
包装类
- 针对八种基本数据类型定义的引用类型,也叫封装类
byte -> Byte
short -> Short
int -> Integer
long -> Long
float -> Float
double -> Double
上边的六中的父类都是Number
boolean -> Boolean
char -> Character - 基本数据类型 转 包装类(引用数据类型,必有父类Object) : Integer in2 = new Integer(“123”);// 也可以用string,但是必须是纯数字
- 包装类 转 基本数据类型 (调用包装类的方法xxxValue,xxx主要包装类是那个基本数据类型对应的包装类)
- 自动装箱和自动拆箱
// 自动装箱 :基本数据型 转 包装类
int num1 = 10;
Integer in1 = num1; // 可以直接赋值给Integer,不用在new Integer了
// 自动拆箱 : 包装类 转 基本数据型
Integer in2 = new Integer(20);
int num2 = in2; - 基本数据类型和包装类 --> String
1.连接运算 如 String Str1 = 1 + “你好”;
2.使用String.valueof()方法
String Str2 = String.valueof(234); OR String Str2 = String.valueof(new Integer("234)); - String类型 -> 包装类或基本数据类型
1.使用包装类的parseXXX(String s) ,XXX是就是包装类对应的基本数据类型。Integer.parseInt(“12367”)
public class Man extends Person{
String name = "Man";
public void eat() {
// TODO Auto-generated method stub
System.out.println("男生吃饭!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Person {
private String name = "Person";
public void eat() {
// TODO Auto-generated method stub
System.out.println("人吃饭");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
blic class Test {
public static void main(String[] args) {
Person p = new Man();
p.eat();
p.equals(p);
System.out.println(p.getName());
// instanceof
String str = new String();
if(str instanceof String) {
System.out.println("str 为 String类型的");
}
if(str instanceof Object) {
System.out.println("所有类都是Object的子类");
}
str.equals(str);
System.out.println(str.hashCode());
System.out.println("------------------------------");
Base b1 = new Base();
b1.setOrderId(1);
b1.setOrderame("txt");
Base b2 = new Base();
b2.setOrderId(1);
b2.setOrderame("txt");
System.out.println(b1 == b2 );
System.out.println(b1.equals(b2));
System.out.println(b1.toString());
// 基本数据类型 转 包装类(引用数据类型,必有父类Object)
int num1 = 10;
Integer in1 = new Integer(num1);
System.out.println(in1);
Integer in2 = new Integer("123");// 也可以用string,但是必须是纯数字
System.out.println(in2);
Boolean boo1 = new Boolean("TrUe");
System.out.println(boo1);
Boolean boo2 = new Boolean("true123");// 忽略true大小写可以看看源码 s.equalsIgnoreCase("true")
System.out.println(boo2);
// 包装类 转 基本数据类型 (调用包装类的方法xxxValue,xxx主要包装类是那个基本数据类型对应的包装类)
Integer in3 = new Integer("456");
int i8 = in3.intValue();
}
@org.junit.Test
public void test1() {
// 自动装箱 :基本数据型 转 包装类
int num1 = 10;
Integer in1 = num1; // 可以直接赋值给Integer,不用在new Integer了
// 自动拆箱 : 包装类 转 基本数据型
Integer in2 = new Integer(20);
int num2 = in2;
Integer.parseInt("12367");
System.out.println(Boolean.parseBoolean("123"));//false
}
}
class Base{
private String orderame;
private int orderId;
@Override
public String toString() {
// TODO Auto-generated method stub
return getClass().getSimpleName()+"@"+Integer.toHexString(hashCode());
}
public String getOrderame() {
return orderame;
}
public void setOrderame(String orderame) {
this.orderame = orderame;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Base other = (Base) obj;
if (orderId != other.orderId)
return false;
if (orderame == null) {
if (other.orderame != null)
return false;
} else if (!orderame.equals(other.orderame))
return false;
return true;
}
}
练习
Object o1 = true ? new Integer(3) : new Double(2.0);// 三元运算符规定返回的元素必须类型一致,所以Integer自动提升为Double
System.out.println(o1);// 1.0
Integer i = 1; // Integer 内部定义了IntegerCaChe,IntegerCaChe内部定义了-128~127的数组,如果我们不通过new的方式,使用自动装箱的方式定义变量值,会优先在数组中寻找,此时如果数值相同地址值就是一样的,如果超出这个返回就会去new一个新的对象,地址值就不同了。
Integer j = 1;
System.out.println(i == j);//true
Integer m = 128;
Integer n = 128;
System.out.println(m == n);//false