目录
一、Object类
1.1. 获取对象信息
1.2. 对象比较equals方法
1.3. hashCode方法
编辑
二、内部类
一、Object类
1.1. 获取对象信息
Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父 类。即所有类的对象都可以使用Object的引用进行接收。
class Student{}
class Person{}
public class Main {
public static void Func(Object obj){
System.out.println(obj);
}
public static void main(String[] args) {
Func(new Student());
Func(new Person());
}
}
Object既然可以接收任何变量,那如果我们把Object设置成参数类型。 看下面的代码,如果我们的Object实现了子类的方法,就去执行自己的方法,没有就去执行父类的。
public class Person {
public String name;
public Person(String name) {
this.name = name;
}
}
public class Main {
public static String Func(Object obj){
return obj.toString();
}
public static void main(String[] args) {
Object one = new String("Batman");
Object two = new Person("Bruce");
Func(two);
}
}
以下是Object类里面的方法: 下面我们将重点说一下equals和hashCode方法。
1.2. 对象比较equals方法
equals进行比较引用类型变量,比较的是成员地址,返回值是布尔类型;等同于“==”比较。
public class Animal {
public String type;
public Animal(String type) {
this.type = type;
}
@Override
public String toString() {
return "Animal{" +
"type='" + type + '\'' +
'}';
}
}
public class Main {
public static void main(String[] args) {
Animal animal1 = new Animal("cat");
Animal animal2 = new Animal("dog");
boolean flag = animal1.equals(animal2);
System.out.println(flag);
System.out.println(animal1 == animal2);
}
}
我们也可以对重写equals方法里面的代码返回值进行修改,来让代码达到我们想要的结果。比如说我们想要对两个对象的值进行比较。我们把Main类里面的Object里的源码复制粘贴到Animal类里面,对返回值进行修改。我们点开String的源码里面,可以看到也使用了equals方法。
//Object类里的源码
public boolean equals(Object obj) {
return (this == obj);
}
public boolean equals(Object obj) {
Animal temp = (Animal) obj;
return temp.type.equals(this.type);
}
//String当中也使用了equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
return (anObject instanceof String aString)
&& (!COMPACT_STRINGS || this.coder == aString.coder)
&& StringLatin1.equals(value, aString.value);
}
1.3. hashCode方法
public class Dog {
public String color;
public Dog(String color) {
this.color = color;
}
@Override
public int hashCode() {
return super.hashCode();
}
}
public class Main {
public static void main(String[] args) {
Dog dog1 = new Dog("brown");
Dog dog2 = new Dog("brown");
System.out.println(dog1.hashCode());
System.out.println(dog2.hashCode());
}
}
上面两个dog对象的哈希值不一样。我们也可以像修改equals方法一样来修改hashcode()方法,此时我们再来看看。所以说,hashcode方法用来确定对象在内存中存储的位置是否相同。
二、内部类
public class OuterClass {
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
public void test() {
System.out.println("out::test方法");
}
//静态内部类
static class InnerClass {
public int data4 = 4;
public static int data5 = 5;
public void func() {
System.out.println("InnerClass::func()");
}
}
}
我们可以通过上述代码来实现一个静态内部类,那我们如何通过静态内部类来对成员变量进行实例化?
OuterClass.InnerClass inn = new OuterClass.InnerClass();
(1)我们知道每一个类都会生成一个字节码文件,而静态内部类的字节码文件名形式“外部类$外部类”。
(2)我们可以看到,在内部类里面。我们无法访问外部类的成员变量。那我们如何通过一些手段进行访问呢?
OuterClass outerClass = new OuterClass();
System.out.println(outerClass.data1);
System.out.println(outerClass.data2);