private 접근을 갖는 필드와 메소드는 제외됨default 접근을 갖는 필드와 메소드는 제한됨public class A {
int field1;
void method(){...}
}
public class B extends A {
String field2;
void method2(){...}
}
자바는 다중 상속 허용 x
public class DmbCellPhone extends CellPhone {}
DmbCellPhone dmbCellPhone = new DmbCellPhone();


자식 클래스( 매개변수 선언,...) {
super(매개값,...); // 매개변수가 있는 부모 생성자 호출 가능
}
public을 default나 private로 수정 불가능default는 public으로 수정 가능public class Computer extends Calculator {
@Override
double areaCircle(double r) { // 선언부가 정확한지 확인
System.out.println("Computer 객체의 areaCircle() 실행");
return Math.PI * r * r;
}
}
super를 사용super는 부모 객체를 참조(this는 자신 객체를 참조)
final 필드 : 수정할 수 없는 필드final 클래스 : 부모로 사용할 수 없는 클래스 (상속 불가능)final 메소드 : 자식이 재정의할 수 없는 메소드final 클래스로 만듦public final class A {}
public class B extends A {} // final 클래스는 상속 불가능
final로 만듦public final int Add(num1, num2){}
default와 동일
package1
public class A {
protected int num;
}
class B {
A a1 = new A();
a1.num = 1; // 같은 패키지이므로 가능
}
package2
class C {
A a2 = new A();
a2.num = 2; // 다른 패키지이므로 불가능
}
class D extends A {
A a3 = new A();
a3.num = 3; // 다른 패키지이지만 자식 클래스이므로 가능
}

public class Tire {}
class Tire1 extends Tire {}
class Tire2 extends Tire {}
Tire a = new Tire1();
Tire a = new Tire2();


cat == animal // true

class Parent {
void method1(){}
void method2(){}
}
class Child extends Parent {
void method2() {...} // Overriding
void method3() {}
}
class ChileEx {
public static void main(String[] args) {
Child child = new Child();
Parent parent = child; // 가능
parent.method1(); // Parent 클래스의 method1() 호출
parent.method2(); // Child 클래스의 재정의된 method2() 호출 [중요]
parent.method3(); // 호출 불가
}
}
Car.class
public class Car {
Tire frontLeftTire = new Tire();
Tire frontRightTire = new Tire();
Tire backLeftTire = new Tire();
Tire backRightTire = new Tire();
void run() {
frontLeftTire.roll();
frontRightTire.roll();
backLeftTire.roll();
backRightTire.roll();
}
}
HankookTire.class
public class HankookTire extends Tire {
void roll(){...} // 재정의된 메소드
}
KumhoTire.class
public class KumhoTire extends Tire {
void roll(){...} // 재정의된 메소드
}
Exe.class
Car myCar = new Car();
myCar.frontRightTire = new HankookTire(); // HankookTire 객체
myCar.backLeftTire = new KumhoTire();
myCar.run();
//HankookTire 클래스에서 재정의된 roll() 메소드 호출
//KumhoTire 클래스에서 재정의된 roll() 메소드 호출
public class Car {
Tire[] tires = {
new Tire("앞 왼쪽", 6),
new Tire("앞 오른쪽", 2),
new Tire("뒤 왼쪽", 3),
new Tire("뒤 오른쪽", 4)
};
}
tires[1] = new KumhoTire("앞 오른쪽", 13); // 자동 타입 변환
public class Vehicle {
public void run() {
system.out.println("차량");
}
}
public class Driver {
void drive(Vehicle vehicle){
vehicle.run();
}
}
public class Bus extends Vehicle{
public void run() {
System.out.println("버스"); // Vehicle 클래스의 run() 메소드 재정의
}
}
Driver driver = new Driver();
Bus bus = new Bus();
driver.drive(bus); // Bus 클래스에서 재정의한 run 메소드 실행
자식클래스 변수 = (자식클래스) 부모클래스 타입;
A a = new B(); // 부모클래스 타입으로 자동 변환
B b = a; // 불가능
B b = (B) a; // 자식 타입이 부모 타입으로 변환된 이후 다시 강제 변환 가능Parent parent = new Parent();
Child child = (Child) parent; // 강제 타입 변환 불가능
boolean result = (객체) instanceof (타입) // (객체)가 (타입)이면 true
Animal animal = new Animal(); // 객체 생성이 불가능
class Ant extends Animal {} // 상속 가능
public abstract class A {
//필드
//생성자
//메소드
}
public abstract class Animal {
public abstract void sound();
}
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("야옹");
}
}