JAVA_SE_Day13

多态

  • 可以理解为 一个事物的多中形态
  • 父类的引用指向子类的对象
  • 多态只能通过父类调用子类重写的方法,执行的是子类中的方法 即虚拟方法
  • 多态的前提 : 类的继承关系 方法的重写
  • 多态格式: 父类名 变量名 = 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
上一篇:java自学笔记(day13)归纳总结自:B站狂神说java


下一篇:LeetCode打卡Day13