day7(对象,对象转型和多态,抽象类和接口),String类的相等问题,多态,instanceof

一Object类

所有的类都直接或间接继承Object类

1.Object类的equals()方法,它比较是否引用相同对象(或者说地址是否相同)。

Object类中的equals方法:

 

 

 

 

 

当它被重写时会进行自定义的比较。

String类重写了这个方法,它比较的是字符串是否相同。

package day7;

public class Test {

	public static void main(String[] args) {
		String s1="123";//s1是字符串常量,存储在栈的常量池中
		String s2="123";//s2是字符串常量,存储在栈的常量池中
		String s3=new String("123");//在堆中创建字符串对象,用s3指向这个对象
		String s4=new String("123");//在堆中创建字符串对象,用s4指向这个对象
		System.out.println(s3.equals(s4));//equals()判断值是否相等
		System.out.println(s3.equals(s1));//equals()判断值是否相等
		System.out.println(s3==s4);//==比较地址,地址不同
		System.out.println(s1==s3);//==比较地址,地址不同
		System.out.println(s1==s2);//==比较地址,地址相同
	}

}

输出:
true
true
false
false
true

解释:
day7(对象,对象转型和多态,抽象类和接口),String类的相等问题,多态,instanceof

 

public class Test {

	public static void main(String[] args) {
		String s1="123";//s1是字符串常量
		String s2="123";//s2是字符串常量
//上行代码是是这样处理的:当给s2赋值"123"的时候,先到字符串常量池(内存)查找是否已有"123",有救直接赋值给s2不再创建
		System.out.println(s1==s2); 
		s1="456";
////上行代码是是这样处理的:当给s2赋值"456"的时候,先到字符串常量池(内存)查找是否已有"123",这时候没有,所以在字符串常量池中创建字符串"456"
		System.out.println(s1==2);
	}
}

输出:

true
false
 

2Object类的hashCode()

注:hashCode即哈希码。这是一种算法就类似将'a'转化为97的ascii码。

 

 

返回该对象的哈希码值,每一个对象的哈希码值唯一 (类似于地址)。准确的说是大部分情况是唯一的,有时候不同对象的哈希码相同,要重写该hashCode()方法。例如:

public class Test {

	public static void main(String[] args) {
		String s1="123";
		String s2="123";
		String s3=new String("123");
		String s4=new String("123");
		System.out.println(s1.hashCode());
		System.out.println(s2.hashCode());
		System.out.println(s3.hashCode());
		System.out.println(s4.hashCode());
	}
}

输出://全是一样的,这时候就要重写这个hashCode()方法
48690
48690
48690
48690

public class Test {

	public static void main(String[] args) {
		Object obj1=new Object();
		Object obj2=new Object();
		Object obj3=obj2;//obj3和obj2指向相同的对象
		System.out.println(obj1.hashCode());
		System.out.println(obj2.hashCode());
		System.out.println(obj3.hashCode());
	}
}

输出:
2018699554
1311053135
1311053135

问题:哈希码和地址值是否相等?

public class Test {

	public static void main(String[] args) {
		Test t=new Test();
		System.out.println(t);//[email protected]
		System.out.println(t.hashCode());//2018699554
	}

}

答案是否定的

 

3Object的getClass()方法: 1基础知识:

Java的每个类都带有一个运行时类对象,该Class对象中保存了创建对象所需的所有信息。

可以用.class返回此 Object 的运行时类Class对象,也可以用getClass()获得。

getClass()方法简介:https://blog.****.net/expect521/article/details/79139829

获得此对象后可以利用此Class对象的一些反射特性进行操作, 例如:

this.getClass().newInstance(); //用默认构造函数创建一个该类的对象

this.getClass().getInterfaces(); //获得此类实现的接口信息

this.getClass().getMethods();//获得此类实现的所有公有方法

 

          2      Object obj=new Object();//称为硬编码(显示写上去的编码),当类名改变,程序涉及到该类名的地方都要改写,
        //反射机制:给A就创建A类的对象,给B就创建B类的对象,改配置文件即可,源代码不变

          3.

		Object obj=new Object();
		Class cla=obj.getClass();//通过反射获取到了Object类

4toString()

在打印对象名时,会自动调用对象.toString()方法(当然也可以用对象显示调用),当对象所属类没有重写这个方法时,调用的是

Object类的toString,该方法返回哈希码。如果重写,会按照重写的字符串格式进行打印。

class A{
	
}
class B{

	int a;;
	double b;
	B()
	{
		a=1;
		b=2;
	}
	public String toString()
	{
		String s="a="+a+" "+"b="+b;
		return s;
	}
}
public class Test {

	public static void main(String[] args) {
		A a=new A();
		System.out.println(a);//[email protected]
		System.out.println(a.toString());//[email protected]
		
		B b=new B();
		System.out.println(b);//a=1 b=2.0
		System.out.println(b.toString());//a=1 b=2.0
	}

}

二多态

1什么是多态:一个事物有多种表现形态。对象的多种形态,方法的多样性。

2向上转型,向下转型

向上转型:将子类的对象赋值给父类引用,自动转换

		Object obj=new String("123");
		System.out.println(obj.toString());

输出:123 (调用的是子类的方法,该toString()方法是非静态方法)

package day10;

class Father{
	public void f()
	{
		System.out.println("父类f");
	}
}
class Son extends  Father{
	public void f()
	{
		System.out.println("子类f");
	}
	
}
public class Test {

	public static void main(String[] args) {
		//1向上转型,子类对象给父类引用赋值
		Father bb=new Son();//bb看起来是Father类型的,但本质上是Sun类型的。
		bb.f();//输出:子类f
		
		//2向下转型:前提是多态,多态就是子类对象给父类对象赋值,所以要先给父类对象赋值,再向下转型,向下转型要强制类型转换
		//dad本质上是Son类型的
		Father dad=new Son();//1多态
		Son son=(Son)dad;//2向上转型
		son.f();//输出:子类f
		
		//3直接将父类对象赋值给子类的引用
		Son s=(Son)new Father();//不会报错
		s.f();//调用是报错

	}

}

 

3instanceof:


day7(对象,对象转型和多态,抽象类和接口),String类的相等问题,多态,instanceof

 

 

 

new创建一个对象的几种方式

其他知识点:
方法的重载与方法的修饰符与返回值类型没有关系