부모클래스에 디폴트생성자/명시적 생성자 둘 중 하나만 있다면
자식클래스에는 부모클래스에서 만든 것만 쓸 수 있다
-> 둘 중 하나의 생성자를 생성하면 다른 하나가 없어지기 때문
부모클래스에 디폴트생성자/명시적생성자 둘 다 없다면
자식클래스에서 자체 생성가능
부모클래스(상위클래스)
//부모클래스
class Point{
int x;
int y;
//디폴트생성자
public Point() {
System.out.println("super_디폴트 생성자");
}
//명시적 생성자
public Point(int x,int y) {
System.out.println("super_인자있는 생성자");
this.x=x;
this.y=y;
}
//메서드
public void write()
{
System.out.println("x좌표="+x+"y좌표="+y);
}
}
자식클래스(하위클래스)
//자식클래스
class SubPoint extends Point{
String msg;
public SubPoint(int x, int y,String msg) {
super(x, y);
this.msg=msg;
}
//부모클래스에 디폴트생성자 만들어줘서 에러가 안남
public SubPoint() {
super(); //생략되있음
System.out.println("sub_디폴트 생성자");
}
//오버라이딩...부모의 메서드 재구현할 목적
@Override
public void write() {
super.write();
System.out.println("메세지: "+msg);
}
}
메인클래스
public class ExobTest_05 {
public static void main(String[] args) {
SubPoint sp=new SubPoint(); //디폴트 생성자가 있어서 받아짐
sp.write();//디폴트 생성자에 값을 안넣어줘서 null값 출력
SubPoint sp1=new SubPoint(100, 200, "오늘 비많이 온다!!!");
sp1.write();
}
}
부모클래스
class Shop{
String sangpum;
int su;
public Shop(String sang,int su) {
this.sangpum=sang;
this.su=su;
}
public void writeShop() {
System.out.println("상품: "+sangpum+"\n개수: "+su);
}
}
자식클래스
class MyCart extends Shop{
int price;
public MyCart(String sang, int su```
코드를 입력하세요
```, int p) {
super(sang, su);
this.price=p;
}
//오버라이딩은 super 위치 상관없이 사용가능
@Override
public void writeShop() {
super.writeShop();
System.out.println("가격: "+price);
}
}
메인클래스
public class Inheri_06 {
public static void main(String[] args) {
MyCart in=new MyCart("아이폰", 5, 1100000);
in.writeShop();
}
}
상속 받아 왔기 때문에 자식클래스 변수로서 this. 사용 가능
부모클래스
class Person{
String name;
String buseo;
public void getPerson()
{
System.out.println("**부모변수출력**");
System.out.println("이름: "+this.name);
System.out.println("부서: "+this.buseo);
}
}
자식클래스
class My extends Person{
int age;
//extends로 받았기 때문에 부모클래스의 변수도 this.로 사용가능
public My(String name, String buseo, int age) {
this.name=name;
this.buseo=buseo;
this.age=age;
}
public void write() {
System.out.println("사원명: "+this.name);
System.out.println("부서: "+buseo);
System.out.println("나이: "+age);
}
//오버라이드
@Override
public void getPerson() {
super.getPerson();
System.out.println("나이: "+this.age);
}
}
메인클래스
public class Inheri_07 {
public static void main(String[] args) {
My my1=new My("이미나", "교육부", 30);
my1.write();
System.out.println();
System.out.println("**오버라이드 통한 메서드 출력**");
my1.getPerson();
}
}
추상클래스는 new로 생성못함
추상메서드가 하나라도 존재하는 클래스를 추상 클래스라고 한다
추상클래스-일반메서드,추상메서드, 둘 다 존재 가능
클래스 안에 추상메서드가 1개라도 있다면 클래스 앞에 abstract를 붙여서 추상클래스로 만들어야함
추상메서드(미완의 메서드...선언문만 있고 구현부인 몸통이 없다)
추상메서드 목적 - 오버라이딩
부모클래스(추상클래스)
abstract class Fruit{
static final String MESSAGE="오늘은 비 많이 오는 날";
//일반메서드
public void getTitle()
{
System.out.println("우리는 추상클래스 공부중!!!");
}
//추상메서드(미완의 메서드)만 담은 곳이 인터페이스 -> 거기에는 abstract를 붙일 필요가 없다
//추상메서드(미완의 메서드...선언문만 있고 구현부인 몸통이 없다)
//abstract -> 추상메서드라는 표시 -> 클래스에도 abstract 붙어야함
abstract public void showMassage(); //오버라이딩 목적
}
자식클래스
부모클래스가 추상클래스라도 무조건 extends로 상속받음
//추상이지만 클래스는 무조건 extends로 상속받음
class Apple extends Fruit{
@Override
public void showMassage() {
System.out.println("Apple_Message");
System.out.println(Fruit.MESSAGE);
}
}
/////////////////////////////////////////////////////////////////////////////////////////
class Banana extends Fruit{
@Override
public void showMassage() {
System.out.println("Banana_Message");
}
}
////////////////////////////////////////////////////////////////////////////////////
class Orange extends Fruit{
@Override
public void showMassage() {
System.out.println("Orange_Message");
}
}
다형성 처리
하나의 변수로 여러가지 일을 처리할 때 이용
부모(상위)클래스명 변수명; 선언
변수명=new 자식(하위)클래스명();
변수명.메소드명();
생성해준 클래스 밑에 그 클래스에서 있는 메소드명만 사용가능
메인클래스
public class EXAbstract_08 {
public static void main(String[] args) {
//일반생성_메서드호출
Apple a=new Apple();
Banana b=new Banana();
Orange o=new Orange();
a.showMassage();
b.showMassage();
o.showMassage();
//다형성 처리
//하나의 변수로 여러가지 일을 처리할 때 이용
//부모클래스명 변수명; 선언
//변수명=new 자식클래스명();
//변수명.메소드명();
//생성해준 클래스 밑에 그 클래스에서 있는 메소드명만 사용가능
Fruit fruit;
fruit=new Apple();
fruit.showMassage();
fruit=new Banana();
fruit.showMassage();
fruit=new Orange();
fruit.showMassage();
fruit.getTitle();
}
}
부모클래스
class Work{
public void process()
{
System.out.println("작업중!!!!!!!");
}
}
자식클래스
추상 메서드가 아니라서 extends 해도 클래스 밑에 오버라이딩 밑줄이 안뜸
-> 오버라이딩 할 메소드명으로 오버라이딩
//추상 메서드가 아니라서 extends 해도 클래스 밑에 밑줄이 안뜸
class Food extends Work{
@Override
public void process() {
super.process();
System.out.println("*****음식을 합니다******");
}
}
///////////////////////////////////////////////////////////
class Clean extends Work{
@Override
public void process() {
super.process();
System.out.println("********청소를 합니다******");
}
}
//////////////////////////////////////////////////////////
class Study extends Work{
@Override
public void process() {
super.process();
System.out.println("**********공부를 합니다*********");
}
}
메인클래스
다형성..하나의 변수로 호출시 누가 생성되었느냐에 따라 그 기능이 달라짐
상위클래스명 변수명=null;
클래스 기본값 중복되는 것을 없애기 위해 null사용
사용안해도 상관 없다 -> 상위클래스명 변수명=new 하위클래스명(); 사용 가능
-> 상위클래스명 변수명=new 하위클래스();에서 상위클래스명을 지우기 위해
public class Inher_09 {
public static void main(String[] args) {
//일반적인 생성...메서드호출
Study s=new Study();
Clean c=new Clean();
Food f=new Food();
c.process();
s.process();
f.process();
//다형성..하나의 변수로 호출시 누가 생성되었느냐에 따라 그 기능이 달라짐
System.out.println("***다형성 출력중***");
Work work=null; //클래스 기본값 중복되는 것을 없애기 위해 null사용
//ex) work=new 하위클래스();
//Work work=new 하위클래스();에서 Work(상위클래스명)을 지우기 위해
work=new Study();
work.process();
work=new Clean();
work.process();
work=new Food();
work.process();
}
}