- 메소드 재정의
부모로부터 받은 메서드를 재정의 : 메소드 오버라이딩
메소드를 재정의 하게되면 부모 메소드를 사용할 수 없다.
package package1;
public class Ex01 {
int num1;
int num2;
public Ex01() {
num1 = 20;
num2 = 10;
}
public Ex01(int num1) {
this.num1 = num1;
}
public Ex01(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
public int mul() {
return num1 * num2;
}
public int div() {
return num1 / num2;
}
}
package package1;
public class Ex02 extends Ex01 {
public Ex02() {
super(); // 부모 클래스의 default 생성자를 실행시킴
}
public Ex02(int num1) {
super(num1);
num2 = 20;
}
public Ex02(int num1, int num2) {
super(num1, num2);
}
public int add() {
return num1 + num2;
}
public int sub() {
return num1 - num2;
}
public int div() { // 부모로부터 받은 메소드를 재정의 : 메소드 오버라이딩
if(num2 == 0) {
return 0;
} else {
return num1 / num2;
}
}
}
package package1;
public class Ex02Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Ex02 ex = new Ex02(); // 자식 클래스의 default 생성자 실행
int result = ex.add();
System.out.println(result);
Ex02 ex1 = new Ex02(30); // 매개변수가 하나인 생성자 실행
result = ex1.mul();
System.out.println(result);
Ex02 ex2 = new Ex02(20, 10);
result = ex2.div();
System.out.println(result);
Ex02 ex3 = new Ex02(0, 20);
result = ex3.div();
System.out.println(result);
Ex02 ex4 = new Ex02(20, 0);
result = ex4.div();
System.out.println(result); // 불능
}
}
package package4;
public class Airplane {
public void land() {
System.out.println("착륙합니다.");
}
public void fly() {
System.out.println("일반 비행합니다.");
}
public void takeOff() {
System.out.println("이륙합니다.");
}
}
package package4;
public class KoreaAirplane extends Airplane {
static final int NORMAL = 1; // 일반 비행
static final int SUPERSONIC = 2; // 초음속 비행
int flyMode = NORMAL;
public void fly() { // 메소드 오버라이딩
if(flyMode == SUPERSONIC) {
System.out.println("초음속 비행입니다.");
}else {
super.fly(); // 부모 클래스에 있는 메소드 실행
}
}
}
package package4;
public class KoreaAirplaneTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
KoreaAirplane ka = new KoreaAirplane();
ka.fly();
ka.flyMode = KoreaAirplane.SUPERSONIC;
ka.fly();
ka.flyMode = KoreaAirplane.NORMAL;
ka.fly();
}
}
- 부모 클래스에 있는 메소드에 final이라고 주면 재정의를 할 수 없다.
package package5;
public class Ex05 {
int num1;
int num2;
Ex05(int num1, int num2){
this.num1 = num1;
this.num2 = num2;
}
public int add() {
return num1 + num2;
}
// 자식 클래스에서 재정의 할 수 없는 메소드
public final int sub() {
return num1 - num2;
}
}
package package5;
public class Ex06 extends Ex05 {
Ex06(int num1, int num2) {
super(num1, num2);
}
public int mul() {
return num1 * num2;
}
public double div() {
return num1 / num2;
}
/*
* 부모 클래스에 있는 매소드에 final이라고 주면 재정의를 할 수 없다. public int sub() { // 부모로부터 상속 받은
* 메소드를 재정의
*
* return num2 - num1;
*/
}
package package5;
public class Ex06Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Ex06 ex = new Ex06(20, 10);
int result = ex.add();
System.out.println(result);
result = ex.sub();
System.out.println(result);
double d = ex.div();
System.out.println(d);
}
}
- class에 final이 있으면 상속할 수 없는 class라는 것을 의미한다.
but 상속 받을 수는 있다.
package package5;
// class에 final이 있으면 상속할 수 없는 class라는 것을 의미함
public final class Ex07 {
int num1;
int num2;
public int add() {
return num1 + num2;
}
}
package package5;
// class에 final이 있으면 상속할 수 없는 class라는 것을 의미함
// 상속 받을 수는 있다.
public final class Ex07 extends Ex05 {
Ex07(int num1, int num2){
super(num1, num2);
}
public int mul() {
return num1 * num2;
}
}
package package5;
public class Ex07Test {
public static void main(String [] args) {
Ex07 ex = new Ex07(20, 10);
int result = ex.add();
System.out.println(result);
}
}