모든 class의 최상위 클래스 명시적으로 extends 하지 않아도 자동 상속 명시적으로 다른 class를 상속 받았더라도 Object 클래스는 상속함(다중 상속x 계층상속o)
Object클래스 메소드가 명시적으로 extends 받지않아도 노출되는 모습
//Object Class를 사용하는 대표적인 상황
//업캐스팅 : 부모참조변수로 자식객체 참조하는 것
Object obj2 = null;
//Object는 모든 클래스의 최상위 부모 클래스 이므로
//어떤 클래스의 객체든 모두 참조하는 것이 가능하다
obj2 = new Test();
obj2 = new First();
obj2 = new String();
obj2 = new Random();
obj2 = new int[3];
obj2 = new ArrayList<String>();
//일종의 만능 참조변수 같은 느낌
객체의 대한 소개 문자열을 리턴해주는 메소드
[default : "패키지명.클래스명@해시코드"]
해시코드 = 메모리 물리주소를 상대적인 주소로 표현한 숫자(자바에서의 주소)
Test@75a1cd57
메소드이름@메모리주소값 -> 뒤에 숫자가 같으면 같은 객체
System.out.println(t.toString());
Test t2 = new Test();
System.out.println(t2);//t 와 t2는 다른 해시코드값 가짐 = 다른객체
Test t3 = t2; //주소 넣어줌
System.out.println(t3); //t2 t3는 같은 객체 공유 = 같은 객체
//당연히 Tava System API 2000여개도 toStrig()을 보유
Random rnd = new Random();
System.out.println(rnd.toString());
//.toString() 특이 결과
String name = "sam";
System.out.println(name.toString()); //객체소개들이 아니라 문자열 데이터가 출력 - 오버라이드
//오버라이드하여 기능을 개선한 것을 알수 있다
//Objct클래스의 메소드도 오버라이드 가능함
같은 객체인지를 확인하는 메소드, 같은지 여부를 true/false를 리턴해줌
First f1 = new First();
First f2 = new First();
f1.num = 100;
f2.num = 100;
System.out.println(f1.equals(f2)); //멤버값 비교
f1.num = 300;
f2.num = 100;
System.out.println(f1.equals(f2)); //멤버값 비교
System.out.println();
//이렇게 오버라이드 된 대표적인 클래스 : String
//근데 , String을 new로 객체생성하여 비교할 때와
//"" 로 생성하여 비교할 때 결과값은 다르다
String s7 = new String("Hello");
String s8 = new String("Hello");
System.out.println(s7 == s8); //주소비교
System.out.println(s7.equals(s8)); // 값 비교
System.out.println();
String s10 = "Hello";
String s11 = "Hello";
System.out.println(s10 == s11); //주소비교
System.out.println(s10.equals(s11)); // 값 비교
☝ 아하 모먼트! [ String 의 값 비교 ]
String은 new로 객체 생성했을 때와 ""로 객체 생성할 때 힙 메모리에 저장되는 위치가 다르다!
new로 생성된 String은 힙메모리에 각각 생성된다.""(큰 따음표)로 생성된 String 객체는 힙 메모리에 String Pool이라는 영역에 만들어진다 이 String Pool은 새로 생성한 객체가 기존에 이미 똑같은 문자열이 생성되어 있다면 새로 자리를 내어주지 않고 기존 주솟값을 반환한다!! 그래서 ""로 생성한 객체의 값을 비교하면 같은 객체를 참조한다는 결과값이 나온다
자바에서의 주소값 [객체마다 고유한 번호 부여]-해시 알고리즘 : 중복되지않는 값을 만들때 사용
Test tt = new Test();
int hashcode=tt.hashCode();
System.out.println(hashcode); //10진수
System.out.println(tt.toString()); //16진수
//위 두 결과는 같은 결과이나 10진수와 16진수로 각각 다르게 표시되어 다른 객체를 참조하는 것으로 보임
System.out.println(Integer.toHexString(hashcode)); //16진수로 변환 -> 같은 객체 참조하는 것이 맞음
클래스의 정보를 가진 Class객체 리턴해줌 - Class인 이름인 class
클래스의 정보 알려줌
Test t7 = new Test();
Class obj = t7.getClass();
System.out.println(obj.getName()); //클래스 명
System.out.println(obj.getPackageName()); //패키지 명
System.out.println(obj.getSuperclass()); //부모클래스
System.out.println();
현재 패키지 이름이 없어서 콘솔에 찍히지않은것...
이건 쓰레드에서 다시 보자