프로젝트명 Inheritance2
public class Super {
public void hello() {
System.out.println("Hello~");
}
}
class Sub extends Super{
//[매소드 오버라이딩](매소드 재정의,덮어쓰기)
//주의
//매소드명 + 매개변수 정보 + 생성자명 모두 똑같아야한다.
public void hello() { //super클래스 메소드와 똑같이 만듦.
//super클래스 상속이기때문에 눈에 안보이지만 사실 2개 중복으로 존재하는 것임.
//메소드명 + 매개변수정보 모두 일치한 똑같은 메소드를 말함.
System.out.println("Hi~");
// 같은 메소드명 내 내용이 달라져도 가능하다.
// Hello >> Hi 변경.
@Override
[어노테이션] anotation
실수 방지를 위해 오류가 맞는지 알려줌
cf)
[오버로딩]
메소자명은 같으나 매개변수정보가 불일치해서 중복하여 여러개 만들 수 있음.
public void Hello(int a) { //@override 어노테이션을 통해서 오버라이딩이 아닌지 알 수 있음.
System.out.println("ddd");
}
}
[오버라이딩]
public class Overriding {
public static void main(String[] args) {
Sub sub1 = new Sub(); // 객체생성
sub1.hello();
//매소드오버라이딩을 사용해서 부모클래스가 아닌 본인클래스 내용 덮어쓰기됨.
//본인이 재정의한 내용만 호출됨.
// Hello >> Hi 로 출력됨.
// 부모 클래스 내용 호출하는 방법
Super s = new Super();
s.hello();
}
}
public class PhoneTest {
public static void main(String[] args) {
MobilePhone mp1 = new MobilePhone();
SmartPhone sp1 = new SmartPhone();
[다형성]
부모클래스로는 자식클래스를 다 받을 수 있습니다.
부모클래스로 자식클래스를 받는 경우 -> 가능
MobilePhone mp2 = new SmartPhone();
>>!!mp2의 실체는 사실 스마트폰이다.!!
자식클래스로 부모클래스를 받는 경우 -> 불가능
SmartPhone sp2 = new MobilePhone();
mp2.sendMsg();
>>본인 클래스 기능은 바로 사용가능
<오류 발생>
mp2.playApp();
>>실체는 스마트폰이지만 본인이 스마트폰인지몰라서 기능을 사용하지 못한다.
<해결방법>
((SmartPhone)mp2).playApp();
>> 아래 예시처럼 자료형 변환해주어야한다!!!
>>주의할점) 괄호를 앞 클래스명 모두를 감싸야한다.
cf)정수형 변수 변환 예시
double a = 10.5;
int b = (int) a;
}
}
//동물관리시스템을 만들자.
//강아지,고양이,송아지.....
//우리의 크기는 동물 10마리.
class Animal{
public void bark() {
System.out.println("짖어요");
}
}
public class Dog extends Animal{
@override
public void bark() {
System.out.println("멍멍");
}
}
class Cat extends Animal{
@override
public void bark() {
System.out.println("냐옹");
}
}
class Cow extends Animal {
@override
public void bark() {
System.out.println("음메");
}
}
[오버라이딩]
부모클래스에서 선언된 매소드를 자식 클래스에서 재정의
이렇게 하면 자식클래스에서 재정의한 메소드만 사용가능
부모클래승서 상속한 메소드의 기능은 사용불가
public class AnimalManager {
public static void main(String[] args) {
>>다형성 사용:부모클래스로 자식클래스를 받을 수 있다.
Animal a = new Dog();
Animal b = new Cat();
Animal c = new Cow();
Animal[] house = new Animal[5];
//동물이 5마리 임의로 들어갈 수 있는 공간을 만듦.
>>다형성 사용
//자식클래스에서 만든 메소드는 사용 불가.
house[0] = new Dog();
house[1] = new Cat();
house[2] = new Cat();
house[3] = new Cow();
house[4] = new Cat();
house[0].bark();//멍멍 o(짖어요 x)
//house에 실제로 들어온 것은 animal이나, dog에 있는 bark가 실행된다.
//원래는 자식클래스 메소드기능을 사용할수는 없으나 오버라이딩을 했기때문에 자식클래스 메소드를 사용가능
for (int i = 0 ; i< house.length; i++) {
house[i].bark();
}
}
}
<콘솔창>
멍멍
냐옹
냐옹
음메
냐옹
public class Member extends Object {
String name;
int age;
public void aaa() {
//Object 클래스의 대표 메소드
///equals(),toString()
//equals(): 두 객체가 같니? >> T/F
Member m1 = new Member();
Member m2 = new Member();
m1.equals(m2);//상속받은 Object클래스 내 포함된 메소드이기때문
//>>오버라이딩해서 사용해라.
//toString(): 객체를 표현하는 문자열
}
// 마우스오른쪽클릭 > source > generate toStirng 클릭하면 자동완성됨.
@Override
public String toString() {
return "Member [name=" + name + ", age=" + age + "]";
}
//오버라이딩 사용
@Override
public boolean equals(Object obj)
//매개변수 (Object obj)의 뜻은 뭐든지 받을 수 있다.(다형성)
// obj.name = "ddd";
// >>오류발생:obj(부모) -> member(자식) 타입으로 받으면 자식의 메소드기능을 사용하지 못함.
// >> 오류해결:형변환
// ((Member)obj).name="ddd";
String name = ((Member)obj).name;
int age = ((Member) obj).age;
if (this.name.equals(name) && this.age == age) {
return true;
}
else {
return false;
}
}
}
public class MemberTest {
public static void main(String[] args) {
Member m = new Member();
// 이 둘은 서로 같다.
System.out.println(m.toString());//리턴타입 문자열이기때문에 출력문에 넣어주면 출력가능
// name = null / age = 0
System.out.println(m);//객체명을 출력하면 자동으로 toString() 메소드를 호출한다.
// name = null / age = 0
}
}