***
class Shape {
public double getArea(double h,double w) {
return h*w;
}
}
class Triangle extends Shape {
public double getArea(double h,double w) {
return h*w*0.5;
}
}//얘가 shape를 오버라이딩함
public class OverridingTest {
public static void main(String[] args) {
//Triangle t= new Triangle();
Shape t= new Triangle(); // 업캐스팅
//Triangle t= new Shape(); //오류
System.out.println(t.getArea(3.0, 4.0)); // 3.0*4.0*0.5 =
//6.0 객체의 유형에 맞게 메소드 실행 됨
}
}
오버로딩 : 꼭 상속만 해당되는건 아님
오버라이딩 : 새로 만드는거
ㄴ다형성 - 하나의 코드를 여러곳에서 재사용
class AA {
public void func() { System.out.println("aa");
}
}
class BB extends AA {
public void func() { System.out.println("bb");
}
}
class CC extends BB {
public void func() { System.out.println("cc");
}
}
public class MainAA {
public static void main(String[] args) {
AA aa =new BB();
//BBaa=new BB();
aa.func();
aa=new CC();
aa.func();
}
}
메소드를 오버라이딩 하는경우 상위클래스의 메소드 한정자보다 허용범위가 넓은 경우에만 허용되고,
그 반대의 경우는 허용되지 않는다.
“public” → “protected” → “한정자 사용 안 함”
class D1 {
int x = 1000;
void display() {
System.out.println("상위 클래스 D1의 display() 메소드입니다"); }
}
class D2 extends D1 {
int x = 2000;
void display() {
System.out.println("하위 클래스 D2의 display() 메소드입니다"); }
void write() { display();
super.display();
System.out.println("D2 클래스 객체의 x 값은 : " + x);
System.out.println("D1 클래스 객체의 x 값은 : " + super.x); }
}
public class SuperTest2 {
public static void main(String[] args) {
D2 d = new D2();
d.write(); }
}
class SD1 {
public int i1;
public double d1;
public SD1(int i1) {
System.out.println("SD1(int i1) 생성자수행");
this.i1 = i1 * i1 ;
System.out.println(i1 +"의2제곱은: "+this.i1);
}
public SD1(double d1) {
System.out.println("SD1(double d1) 생성자수행");
this.d1 = d1 * d1 ;
System.out.println(d1 +"의2제곱은: "+this.d1);
}
}
class Sub1 extends SD1 {
public Sub1(int i1) {
super(i1);
System.out.println("Sub1(int i1) 생성자수행");
this.i1 = this.i1 * i1 ;
System.out.println(i1 +"의3제곱은: "+this.i1); }
public Sub1(double d1) {
super(d1);
System.out.println("Sub1(double d1) 생성자수행");
this.d1 = this.d1 * d1 ;
System.out.println(d1 +"의3제곱은: "+this.d1); }
}
public class SuperTest3 {
public static void main(String[] args) {
Sub1 sub1= new Sub1(10);
Sub1 sub2 = new Sub1(10.5);
}
}
자식이 상속받으면 부모의(super class) 생성자까지도 다 가져와서 실행
객체를 생성할 수 없는
//추상 클래스의 상속과 구현
abstract class DD {abstract public int add(int a, int b);}
class C extends DD{
public int add(int x, int y) {return x+y;}
public void show() {
System.out.println("");
}
}
public class Ex1 {
public static void main(String[] args) {
C c=new C();
c.show();
System.out.println(c.add(5,10));
}
}
abstract class Calculator {
public abstract int add(int a, int b);
public abstract int subtract(int a, int b);
public abstract double average(int[] a);
}
class GoodCalc extends Calculator {
public int add(int a, int b) {return a + b;}
public int subtract(int a, int b) {return a * b; }
public double average(int[] a) {
int sum = 0;
for (int i : a) {
sum += i;
}
return (double) sum / a.length;
}
}
public class Task {
public static void main(String[] args) {
GoodCalc c = new GoodCalc();
System.out.println("add: " + c.add(2, 2));
System.out.println("subtract: " + c.subtract(2, 2));
System.out.println("average: " + c.average(new int[]{5, 4}));
}
}
'computing' 카테고리의 다른 글
java 코드정리 - default (0) | 2025.06.12 |
---|---|
20250519_DB8 트랜잭션, 동시성 제어 (0) | 2025.05.19 |
20250515java10 (0) | 2025.05.15 |
20250508_java10 (0) | 2025.05.08 |
나는 언제쯤 행복해질까? (0) | 2025.05.08 |