우리는 객체지향의 세 가지 주요 특징이 캡슐화, 상속, 다형성이라는 것을 알고 있습니다. 그러나 때때로 우리는 이러한 개념에 대해 항상 혼란스러워합니다. 이러한 개념은 미래의 추상화 지향 프로그래밍을 위한 견고한 기반을 마련하기 위해 아래에 정리되어 있습니다.
encapsulation의 개념은 여전히 이해하기 쉽습니다. 클래스를 정의할 수 있다면 캡슐화의 개념을 완전히 이해하신 것입니다. 아래에 정의된 클래스는 데이터를 캡슐화한 것입니다.
상속의 장점은 코드 재사용입니다. 상속된 하위 클래스는 자동으로 상위 클래스의 모든 속성과 메서드를 갖습니다. 따라서 기존 클래스를 상속한다는 것은 이러한 클래스의 메서드와 필드를 재사용하는 것을 의미합니다. 이를 바탕으로 서브클래스는 새로운 요구 사항을 충족하기 위해 몇 가지 새로운 메서드와 필드를 추가할 수도 있습니다. 이는 Java 프로그래밍의 핵심 기술입니다.
그럼 상속이 필요한지 어떻게 판단하나요? "is-a" 관계는 상속의 명백한 특징입니다. 이 문장의 의미는 다음과 같이 해석할 수 있습니다. Student가 Person을 상속받는 이유는 Student가 Person이기 때문입니다. 그러한 관계가 없다면 상속이 필요하지 않습니다. 이는 Liskov 대체 원칙의 정의이기도 하며, 하위 유형은 상위 유형을 대체할 수 있어야 합니다.
슈퍼클래스를 확장하여 서브클래스를 정의할 때 서브클래스와 슈퍼클래스의 차이점만 지적하면 됩니다. 따라서 클래스를 설계할 때 일반 메서드는 슈퍼 클래스에 배치하고 특수 목적을 가진 메서드는 하위 클래스에 배치해야 합니다. .
동적 바인딩에는 매우 중요한 기능이 있습니다. 기존 코드를 수정하지 않고도 프로그램을 확장할 수 있습니다. 따라서 다형성은 개방형 및 폐쇄형 원리의 기초입니다.
다음은 상속 및 다형성 구현의 구체적인 예입니다.
abstract는 추상 키워드입니다. (구체 클래스보다 추상 클래스에서 상속하는 것이 더 좋습니다.)
public abstract class Person { // 抽象类 private String name; // 私有变量 public String getName() { // Getter方法 return name; } public void setName(String name) { //Setter方法 this.name = name; } public Person(String name) { // 构造函数,用于初始化name super(); this.name = name; } public abstract String getDesc(); // 抽象类中的抽象方法。 只有声明,没有具体实现。 public String toString(){ // toString方法覆盖了Object类的toString方法 return name + getDesc(); } }
Extensions는 상속된 키워드입니다. Student는 Person을 상속하므로 Student에는 name 속성이 있습니다.
public class Student extends Person { // 继承类 private String major; // 新增加的数据 public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } public Student(String name,String major) { // 构造函数用于初始化 super(name); // 调用超类构造函数 this.major = major; } @Override public String getDesc() { // 必须实现超类中的抽象方法 // TODO Auto-generated method stub return " : a student, major is " + major; }
이 예에서도 캡슐화 없이는 상속이 없고, 상속 없이는 소위 다형성이 없다는 것을 알 수 있습니다. Java 튜토리얼에 대해 자세히 알아보려면 다음을 방문하세요. 위 내용은 Java의 세 가지 주요 기능: 캡슐화, 상속 및 다형성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!public class Employee extends Person{
private double salary;
public double getSalary() {
return salary;
}public void setSalary(double salary) {
this.salary = salary;
}
public Employee(String name, double salary) {
super(name);
this.salary = salary;
}
@Override
public String getDesc() { // TODO Auto-generated method stub
return " :a employee, salary is " + salary;
}
}
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub
Person[] p=new Person[2];
p[0]=new Student("Mark", "IT");
p[1]=new Employee("Jerry", 2000); for (Person person : p) {
System.out.println(person.getName()+person.getDesc());
}
}
}