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
解释:
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:
new创建一个对象的几种方式
其他知识点:
方法的重载与方法的修饰符与返回值类型没有关系