티스토리 뷰
// 상속 : sub클래스가 super클래스의 필드와 메소드를 물려받는 것 // 상속의 대상이 되는 클래스 : 부모클래스, 기반클래스, super클래스 class A { int a=3; void print(){ System.out.println("super"); } } // extends classA : 클래스 A를 상속 // 상속 받는 클래스 : 자식클래스, 파생클래스, sub클래스 class A1 extends A{ } public class 상속2 { public static void main(String[] args) { A1 a1 = new A1(); System.out.println(a1.a); } }
3
class B {
int a = 1;
}
class B1 extends B{
int a = 2; // 똑같은 이름의 변수가 있다면 그것이 먼저 실행됨
void print(){
int a = 3;
System.out.println(super.a); // super. : super클래스의 멤버를 지시하는 지시어
System.out.println(this.a); // this. : 자신 클래스의 멤버를 지시하는 지시어
System.out.println(a);
}
}
public class 상속3 {
public static void main(String[] args) {
B1 b1 = new B1();
b1.print();
}
}
1
2
3
class C {
}
class C1 extends C {
}
class C2 extends C {
}
public class 상속4 {
public static void main(String[] args) {
C a = new C();
C1 b = new C1();
C2 c = new C2();
// 인스턴스a instanceof 클래스B : 인스턴스 a가 클래스B를 상속 받았는지 true/false 반환
boolean e = b instanceof C;
System.out.println(e);
System.out.println( a instanceof C1 );
// instanceof 연산자는 상속관계가 있는 피연산자들만 대상으로 함
// 부모인스턴스 instanceof 자식클래스 / 자식인스턴스 instanceof 부모클래스
// 만 가능함
//System.out.println( b instanceof C2 );
}
}
true
false
class D {
void print(){
System.out.println("super");
}
}
class D1 extends D {
// 오버라이딩 : super클래스의 메소드를 재정의함
void print(){
System.out.println("sub");
}
// 오버로딩 : 똑같은 이름을 가지나 매개변수가 다른 메소드를 정의
void print(String s){
System.out.println(s);
}
// java의 모든 클래스는 Object 클래스를 상속받음
// Object의 toString클래스를 재정의한것임(오버라이딩)
public String toString() {
return "D1";
}
}
public class 상속5 {
public static void main(String[] args) {
D1 a = new D1();
a.print();
System.out.println(a);
}
}
sub
D1
class E {
void print(){
System.out.println("super");
}
}
class E1 extends E {
// @ : annotation(주석) 표시
// @Override : 이 표시 바로 밑에 오는 메소드가 새로 작성된 메소드일 경우 컴파일에러!
@ Override
// void print222(){
// System.out.println("새로작성한 메소드");
// }
void print(){
System.out.println("sub");
}
}
public class 상속6 {
public static void main(String[] args) {
// TODO 자동 생성된 메소드 스텁
}
}
super
sub
// JRE 시스템 라이브러리 > rt.jar (런타임) > java.lang 패키지 > 클래스들
// java.lang 패키지 안에 있는 클래스들은 import 하지 않고, 객체생성 안해도 바로 사용할 수 있음
class F{
// 정의된 생성자가 없는 경우, 컴파일러가 기본생성자를 자동으로 생성함.
public F(){
System.out.println("super의 생성자");
}
}
class F1 extends F {
// sub클래스의 생성자에서는 제일 처음에 super클래스의 생성자가 먼저 호출됨
// 컴파일러가 자동으로 생성해주지만 명시적으로 표시해주려면 super()를 씀
public F1(){
super();
System.out.println("sub의 생성자");
}
}
public class 상속7 {
public static void main(String[] args) {
F1 a = new F1();
}
}
super의 생성자
sub의 생성자
class G{
public G(int n){
System.out.println(n);
}
}
// 부모에 기본생성자가 아닌, 새로 정의된 생성자가 자식에게 없는 경우 오류
class G1 extends G{
// 자식클래스의 생성자에 부모클래스를 생성하기 위한 생성자들을 호출해주어야함
// 기본생성자가 아니기 때문에 매개변수 주의!
public G1(){
super(1);
}
}
public class 상속8 {
public static void main(String[] args) {
G1 a = new G1();
}
}
1
예시
class Employee{
int pay;
public Employee(int a){
this.pay = a;
}
void print(){
if( this instanceof Regular )
System.out.println("정규직 "+pay+"만원");
if( this instanceof PartTime )
System.out.println("시간제 "+pay+"만원");
}
}
class Regular extends Employee{
public Regular(int pay_r){
super(pay_r);
}
}
class PartTime extends Employee{
static int pay_time = 50_000;
public PartTime(int work_time){
super(work_time * pay_time);
}
}
public class 상속예제2 {
public static void main(String[] args) {
Regular a = new Regular(300_0000);
PartTime b = new PartTime(200);
a.print();
b.print();
}
}
정규직 3000000만원
시간제 10000000만원
'JAVA > PRIMER' 카테고리의 다른 글
[JAVA] 익명클래스 (0) | 2018.04.19 |
---|---|
[JAVA] 추상클래스 (0) | 2018.04.19 |
[JAVA] Random (0) | 2018.04.19 |
[JAVA] Math (0) | 2018.04.19 |
자바 Calendar (0) | 2018.04.19 |