Latest web development tutorials

자바 다시 쓰기 (재정) 및 오버로드 (과부하)

다시 쓰기 (재정)

재기록 다시 쓸 상위 클래스의 메소드에 대한 액세스를 허용하도록 구현 프로세스의 하위 클래스이다! 반환 값과 매개 변수가 변경되지 않습니다. 즉,이 같은 경우와, 상기 코어는 재기록!

필요에 따라 서브 클래스의 장점을 다시 쓰기, 자신의 행동에 특정 정의합니다.

즉, 필요에 따라 실현 될 수있는 부모 클래스에있어서의 서브 클래스이다.

객체 지향 원칙에서 재 작성은 기존의 방법을 대체 할 수 있다는 것을 의미한다. 다음 예는 다음과 같다 :

class Animal{

   public void move(){
      System.out.println("动物可以移动");
   }
}

class Dog extends Animal{

   public void move(){
      System.out.println("狗可以跑和走");
   }
}

public class TestDog{

   public static void main(String args[]){
      Animal a = new Animal(); // Animal 对象
      Animal b = new Dog(); // Dog 对象

      a.move();// 执行 Animal 类的方法

      b.move();//执行 Dog 类的方法
   }
}

다음과 같은 결과를 컴파일 위의 예는 다음과 같습니다

动物可以移动
狗可以跑和走

상기 예에서 이는 B는 동물의 종류에 속한다하더라도, 본하지만 이동 조작 방법 개 클래스 수있다.

컴파일 시간에 있지만 기준 유형 파라미터를 확인하기 때문이다.

그러나, 실행시에, 지정된 객체와 객체의 동작 방법의 자바 가상 머신 (JVM)의 유형입니다.

위의 예에서 그래서, 컴파일러는 이동 방법은 동물 클래스를 존재하기 때문에 성공할 수있었습니다 만, 실행, 실행하는 특정 객체에 대한 방법입니다했다.

다음 예를 고려하십시오

class Animal{

   public void move(){
      System.out.println("动物可以移动");
   }
}

class Dog extends Animal{

   public void move(){
      System.out.println("狗可以跑和走");
   }
   public void bark(){
      System.out.println("狗可以吠叫");
   }
}

public class TestDog{

   public static void main(String args[]){
      Animal a = new Animal(); // Animal 对象
      Animal b = new Dog(); // Dog 对象

      a.move();// 执行 Animal 类的方法
      b.move();//执行 Dog 类的方法
      b.bark();
   }
}

다음과 같은 결과를 컴파일 위의 예는 다음과 같습니다

TestDog.java:30: cannot find symbol
symbol  : method bark()
location: class Animal
                b.bark();
                 ^

더 나 참조 형 동물 껍질 방법이 없기 때문에이 프로그램은 컴파일 오류가 발생합니다.


룰을 재 기입에있어서

  • 이 방법은 다시 작성하도록 매개 변수 목록이 동일해야합니다;
  • 완전히 메소드의 반환 타입 재기록해야 리턴 타입은 동일하다;
  • 액세스는 부모 클래스 액세스 오버라이드 (override) 방법보다 낮다. 예를 들어 부모 클래스가 public으로 선언되는 경우, 보호 등의 서브 클래스에서이 메소드를 선언 할 수 없습니다보다 우선합니다.
  • 부모 클래스의 멤버는 하위 클래스를 재정의 할 수 있습니다.
  • 마지막 방법을 재정의 할 수 없습니다로 선언했다.
  • 정적 메소드가 재 작성 될 수는 없지만, 다시 선언 할 수있는 선언했다.
  • 같은 패키지의 상위 클래스와 서브 클래스, 서브 클래스는 개인 및 최종 접근의 진술 이외의 모든 방법의 상위 클래스를 재정의 할 수 있습니다.
  • 서브 클래스와 슈퍼 클래스 그렇게 만 서브 클래스가 공공에 대한 보호 부모 클래스의 비 final 메소드의 선언을 재정의 할 수 있습니다, 같은 패키지가 아닙니다.
  • 오버라이드 (override) 방법에 관계없이 메소드가 예외를 throw 다시 작성되었습니다 여부, 비 필수 예외를 throw 할 수 있습니다. 그러나, 필수 예외가 필수 선언보다 신규 또는 광범위한 던져 재정의 할 수있는 방법은, 그렇지 않으면 당신이 할 수있는, 오버라이드 (override)되는 메소드 예외입니다.
  • 생성자는 다시 할 수 없습니다.
  • 메소드가 상속 될 수 없다면,이 메소드를 재정의 할 수있다.

슈퍼 키워드를 사용하여

당신은 슈퍼 키워드를 사용, 서브 클래스에서 상위 클래스의 메소드를 호출 다시 작성해야합니다.

class Animal{

   public void move(){
      System.out.println("动物可以移动");
   }
}

class Dog extends Animal{

   public void move(){
      super.move(); // 应用super类的方法
      System.out.println("狗可以跑和走");
   }
}

public class TestDog{

   public static void main(String args[]){

      Animal b = new Dog(); // Dog 对象
      b.move(); //执行 Dog类的方法

   }
}

다음과 같은 결과를 컴파일 위의 예는 다음과 같습니다

动物可以移动
狗可以跑和走

오버로드 (과부하)

과부하 (과부하)이 있지만, 다른 매개 변수는 동일한 이름의 내부에있어서의 클래스이다. 반환 유형은 동일하거나 상이 할 수있다.

각각의 오버로드 된 메서드 (또는 생성자) 인수 형식의 고유 한 목록이 있어야합니다.

만 오버로드 된 생성자

규칙을 오버로드

  • 매개 변수 목록을 변경해야합니다 오버로드 방법;
  • 반환 형식을 변경할 수 있습니다 오버로드 방법;
  • 액세스 수식을 변경할 수 있습니다 오버로드 방법;
  • 오버로드 방법은 신규 또는 광범위한 검사 예외를 선언 할 수 있습니다;
  • 이 방법은 동일한 클래스에있을 수 또는 서브 클래스에서 오버로드 될 수있다.

public class Overloading {
 
	public int test(){
		System.out.println("test1");
		return 1;
	}
 
	public void test(int a){
		System.out.println("test2");
	}	
 
	//以下两个参数类型顺序不同
	public String test(int a,String s){
		System.out.println("test3");
		return "returntest3";
	}	
 
	public String test(String s,int a){
		System.out.println("test4");
		return "returntest4";
	}	
 
	public static void main(String[] args){
		Overloading o = new Overloading();
		System.out.println(o.test());
		o.test(1);
		System.out.println(o.test(1,"test3"));
		System.out.println(o.test("test4",1));
	}
}

오버로드의 차이를 다시 쓰기

차이의 포인트 오버로드 방법 재정의 방법
매개 변수 목록 당신은 수정해야합니다 수정해서는 안됩니다
반환 형식 당신은 수정할 수 있습니다 수정해서는 안됩니다
이상 당신은 수정할 수 있습니다 감소 또는 제거 할 수 있습니다, 당신은 신규 또는 광범위한 예외를 throw하지 않아야합니다
액세스 당신은 수정할 수 있습니다 더 엄격한 제한이 아니어야합니다 (제한이 감소 될 수있다)