1. 오버라이딩(**)
- 부모클래스의 메소드를 자식클래스에서 수정하고자 할때 오버라이딩을 한다.
- 만드는 방법 : 부모클래스의 메소드명,파라미터갯수,타입 모두 일치해야 한다.
예)
class AA{
public void show(){...}
}
class BB extends AA{
//오버라이딩
public void show(){
//수정할 내용;
}
//오버로딩
public void show(int a){
..
}
}
- 오버라이딩할때 접근지정자는 부모의 접근지정자보다 범위가 좁으면 안된다. 최소한 같거나 넓어야 한다.
[ 접근지정자 ]
private : 자신의 클래스내에서만 접근(자식클래스접근x)
default : (접근지정자를 쓰지 않은 경우)같은 패키지내에서만 접근 가능
protected : 같은 패키지내에서, 패키지가 달라도 자식클래스는 접근 가능
public : 어디서든 접근 가능
- 범위의 크기
private < default < protected < public
private : 자신의 클래스내에서만 접근(자식클래스접근x)
default : (접근지정자를 쓰지 않은 경우)같은 패키지내에서만 접근 가능
protected : 같은 패키지내에서, 패키지가 달라도 자식클래스는 접근 가능
public : 어디서든 접근 가능
- 범위의 크기
private < default < protected < public
ex>
class MyShape
{
protected int x,y;
public MyShape(int x,int y){
this.x=x;this.y=y;
}
public void draw(){
System.out.println("x좌표:"+x+",y좌표:"+y);
}
}
class MyRect extends MyShape
{
public MyRect(int x,int y){
super(x,y);
}
//오버라이딩
public void draw()
{
//부모에 있는 draw() 호출!
super.draw();
System.out.println(x+","+y+"의 좌표에 사각형을 그려요!");
}
{
protected int x,y;
public MyShape(int x,int y){
this.x=x;this.y=y;
}
public void draw(){
System.out.println("x좌표:"+x+",y좌표:"+y);
}
}
class MyRect extends MyShape
{
public MyRect(int x,int y){
super(x,y);
}
//오버라이딩
public void draw()
{
//부모에 있는 draw() 호출!
super.draw();
System.out.println(x+","+y+"의 좌표에 사각형을 그려요!");
}
//오버로딩!
public void draw(String color)
{
System.out.println(color+"색상으로 " +x+","+y+
"의 좌표에 사각형을 그려요!");
}
// 이미 존재한다고 오류 메시지 나옴.
//public String draw(){//오류==>오버로딩도 오버라이딩도 아님!
// return x+","+y+"의 좌표에 사각형을 그려요!";
//}
}
class Test06_Overriding
{
public static void main(String[] args)
{
MyRect mr=new MyRect(100,200);
mr.draw();//
}
}
ex>
class MyShape
{
private double x,y;
public MyShape(double x,double y){
this.x=x;this.y=y;
}
public double getX(){
return x;
}
public double getY(){
return y;
}
}
class MyRect extends MyShape
{
//부모가 파라미터를 갖는 생성자를 갖고 있다면
// 자식생성자에서 부모생성자를 호출해
// 파라미터를 넘겨 주어야 한다.!
public MyRect(double x,double y){
//부모생성자 호출!
super(x,y);
}
public double getArea(){
return getX()*getY();
}
}
class Test07_inheritance
{
public static void main(String[] args) {
//MyShape sh=new MyShape(); ==> 오류
MyRect mr=new MyRect(1,2);
System.out.println("사각형넓이:"+mr.getArea());
}
}
{
private double x,y;
public MyShape(double x,double y){
this.x=x;this.y=y;
}
public double getX(){
return x;
}
public double getY(){
return y;
}
}
class MyRect extends MyShape
{
//부모가 파라미터를 갖는 생성자를 갖고 있다면
// 자식생성자에서 부모생성자를 호출해
// 파라미터를 넘겨 주어야 한다.!
public MyRect(double x,double y){
//부모생성자 호출!
super(x,y);
}
public double getArea(){
return getX()*getY();
}
}
class Test07_inheritance
{
public static void main(String[] args) {
//MyShape sh=new MyShape(); ==> 오류
MyRect mr=new MyRect(1,2);
System.out.println("사각형넓이:"+mr.getArea());
}
}
2. final 의 용도
1. 변수앞에 final을 붙여서 상수로 만든다.
final double PI=3.14;
final double PI=3.14;
2. 메소드앞에 final이 붙으면 ==> 오버라이딩 할 수 없다.
3. 클래스앞에 final이 붙으면 ==> 상속받을 수 없다.
ex>
final class AA{
//오버라이딩 불가!
public final void show(){
System.out.println("AA");
}
}
class BB extends AA{
//public void show(){ //오류 발생!
// System.out.println("BB");
//}
}
class Test08_final{
public static void main(String[] args){
}
}
//오버라이딩 불가!
public final void show(){
System.out.println("AA");
}
}
class BB extends AA{
//public void show(){ //오류 발생!
// System.out.println("BB");
//}
}
class Test08_final{
public static void main(String[] args){
}
}
'JAVA' 카테고리의 다른 글
추상 클래스 - 메소드 / 인터페이스 / Object (0) | 2014.09.12 |
---|---|
클래스간 형변환 / 다형성 (0) | 2014.09.12 |
상속 (0) | 2014.09.12 |
this (0) | 2014.09.12 |
객체배열 (0) | 2014.09.12 |