우리는 Java의 세 가지 주요 기능인 캡슐화, 상속 및 다형성을 알고 있습니다. 처음 두 가지는 Java 소개(6)에서 이미 언급한 바 있습니다. 이제 다형성의 특징에 대해 이야기해 보겠습니다.
다형성은 이름에서 알 수 있듯이 여러 형태를 의미합니다.
Java에서 다형성의 의미:
객체에 메시지를 보내고 객체가 메시지에 응답할 동작을 스스로 결정하도록 합니다.
하위 클래스 객체의 참조는 동적 메소드 호출을 구현하기 위해 상위 클래스 참조 변수에 할당됩니다.
Java의 다형성을 위한 전제 조건:
상속
상위 클래스 메소드 재작성
상향 변환
예를 들어 우리는 사람이고, 학생이고, 젊은이입니다. 나는 인간으로서 일을 할 수 있고, 학생으로서 학생표를 살 수도 있고, 젊은이로서 학생표를 살 수도 있습니다. 자선을 행하므로 우리는 다양한 형태를 통해 다양한 일을 할 수 있습니다. 이것이 더 잘 이해됩니까?
참고:
다형성 전제 조건: 하위-상위 클래스 관계가 있어야 합니다.
다형성 부모 클래스 참조 변수를 사용하여 메서드를 호출하면 하위 클래스의 재정의된 메서드가 호출됩니다.
다형성의 정의와 사용 형식:
부모 클래스 유형 변수 이름 = 새 하위 클래스 유형();
다형성 멤버의 특징:
다형성 멤버 변수: 컴파일하고 실행할 때 왼쪽을 보세요
다형성 멤버 메소드: 컴파일할 때 왼쪽을 보고, 실행할 때 오른쪽을 보세요
다형성 변환은 상향 변환과 하향 변환의 두 가지 유형으로 나뉩니다.
상향 변환 : 다형성 그 자체가 상향변환의 과정
사용형식 : 상위 클래스 유형 변수명 = 새로운 하위 클래스 유형();
적용 가능한 시나리오 : 확장성을 향상시켜 하위 클래스 유형을 마주할 필요가 없을 때, 또는 상위 클래스의 함수를 사용하여 해당 작업을 완료할 수 있습니다.
하향 변환: 상향 변환된 하위 클래스 객체는 강제 유형 변환 형식을 사용하여 상위 클래스 참조 유형을 하위 클래스 참조 유형으로 변환할 수 있습니다.
사용 형식: 하위 클래스 유형 변수 이름 = ( 하위 클래스 유형) 상위 클래스 유형의 변수
적용 가능한 시나리오: 하위 클래스의 고유한 기능을 사용하려는 경우.
코드 설명:
public class Person { //人类,作为父类使用 public void speak(){ System.out.println("我们都是一个人"); } } public class Student extends Person{ //继承父类,相当于我们是学生,有人的方法 @Override public void speak(){ System.out.println("我是人类中的学生"); } } public class Child extends Person{ //继承父类,相当于我们是孩子,有孩子的行为 @Override public void speak(){ System.out.println("我是人类中的孩子"); } } //测试类 public class TestMain { public static void main(String[] args) { //父类类型 变量名=new 子类类型(); Person p = new Student(); //子类对象的引用赋值给父类 p.speak(); //多态 相当于这里使用的是Student的方法。输出我是人类中的学生 //我作为人,我用学生的身份,说出:我是人类中的学生 Person p = new Child(); p.speak(); //输出:我是人类中的孩子 //我作为人,用孩子的身份,说出我是人类中的孩子 } } //这段代码,我们用到了 继承,重写,向上转型,因为多态本来就是向上转型的过程
다형성을 소개한 후 다형성의 용도는 무엇인가요? 왜 다형성은 Java의 세 가지 주요 특징으로 간주될 수 있습니까? 이유가 있을 겁니다:
코드 재사용성 향상
모듈 간의 결합 감소
여기서 다형성 메커니즘이 무엇인지 소개하고 싶습니다. Java 언어는 다형성을 어떻게 구현합니까? (조금 이해하기 어려울 수도 있고, 내용을 완전히 이해하지는 못하는데 이것도 인터뷰에서 나온 질문입니다)
소위 다형성이란 에 정의된 참조 변수가 가리키는 특정 유형을 말합니다. 참조 변수를 통해 생성된 프로그램 및 메서드 호출은 프로그래밍 중에 결정되지 않지만 프로그램 실행 중에 결정됩니다. 즉, 참조 변수가 어떤 클래스 인스턴스 객체를 가리킬지, 참조에 의해 실행된 메서드 호출이 결정됩니다. 변수는 어떤 클래스에서 구현되어야 하는지는 프로그램이 실행되는 동안 결정될 수 있습니다. 특정 클래스는 프로그램이 실행 중일 때만 결정되기 때문에 소스 프로그램 코드를 수정하지 않고도 참조 변수를 다양한 클래스 구현에 바인딩할 수 있으므로 참조에서 호출하는 특정 메서드가 그에 따라 변경됩니다. 프로그램 코드는 프로그램이 실행 중일 때 프로그램에 바인딩된 특정 코드를 변경하여 프로그램이 여러 실행 상태를 선택할 수 있도록 합니다. 다형성은 컴파일 타임 다형성과 런타임 다형성으로 구분됩니다. 그 중 편집 시 다형성은 주로 메서드의 오버로딩을 의미하며, 편집 후에는 런타임 시 두 가지 다른 기능이 됩니다. 런타임 다형성은 동적이며 동적 바인딩을 통해 달성됩니다. 이를 다형성이라고 합니다.
다형성을 이해하려면 다음 코드를 참조할 수도 있습니다.
class People{ //父类 public void eat(){ System.out.println("我们会吃饭"); } } class Student extends People{ //继承父类 @Override public void eat(){ System.out.println("我会吃肉"); } public void study(){ System.out.println("我们要好好学习"); } } class Teacher extends People{ //继承父类 @Override public void eat(){ System.out.println("老师会吃蔬菜"); } public void teach(){ System.out.println("老师要认真上课"); } } //测试类: public class TestMain { public static void main(String[] args) { People p=new Stu(); //子类对象的引用赋值给父类 p.eat(); //输出: 我会吃肉 } }
추상 클래스란 무엇인가요?
공통 클래스는 인스턴스화된 객체를 직접 생성할 수 있는 완전한 함수형 클래스로, 공통 클래스에 생성자, 공통 메소드, 정적 메소드, 상수, 변수 등을 포함할 수 있습니다. 추상 클래스는 일반 클래스의 구조에 추상 메서드를 추가하는 구성 요소를 말합니다.
추상 메서드:
모든 일반 메서드에는 메서드 본문을 나타내는 "{}"가 있습니다. 메서드 본문이 있는 메서드는 개체에서 직접 사용할 수 있습니다. 추상 메서드는 메서드 본문이 없는 메서드를 나타내며, 추상 메서드도 abstract 키워드로 수정해야 합니다. 즉, 추상 클래스의 추상 메서드를 작성하고 상속된 후 다시 작성할 필요가 없습니다.
추상 클래스 선언 키워드: abstractracat
추상 클래스 정의:
public abstract class studnet{//定义一个抽象类 public void study(){ //普通方法 System.out.println("我会学习"); } public abstract void eat(); //抽象方法,没有方法体,有abstract关键字做修饰 } //注意: 有抽象方法,这个类必须是抽象的!!!
예제 설명:
shape 클래스 Shape는 면적과 둘레를 계산하는 메서드를 제공해야 하지만 모양 자체는 결정되지 않았으므로 둘레를 계산합니다. 합과 면적의 방법을 결정할 수는 없으며, 이때 추상 클래스와 추상 메서드를 사용해야 합니다.
由于Shape类计算周长和面积的方法无法确定,那么就可以将这样的方法声明为抽象的,以便在具体的子类中进行实现。
//定义一个shape类,但是没有具体的形状,所以我们定义成抽象类 public abstract class Shape { private int a; public abstract void area(){} //求面积的方法 public abstract void perimeter(); //求周长的方法 public Shape() { //无参构造 } public Shape(int a) { this.a = a; } }
//计算圆形面积的子类 public abstract class shape { //有抽象方法的类,则一定是抽象类,需要关键字abstract修饰 private int a; public abstract void area(); //求面积的方法,没有方法体的方法,需要关键字abstract修饰 public abstract void perimeter(); //求周长的方法 } //创建计算圆面积和周长的子类,并继承抽象类shape,并重写shape内的方法 public class Circle extends shape{ public static double pi = 3.14; private double r; //半径 @Override public void area() { System.out.println("圆的面积:"+Circle.pi*this.r*this.r); } @Override public void perimeter() { System.out.println("圆的周长为:"+2*Circle.pi*this.r); } public Circle() { } public Circle(double r) { // this.r = r; } } //测试类: public class TestMain { public static void main(String[] args) { Circle c = new Circle(5); //传入半径为:5 c.area(); c.perimeter(); } }
//输出结果: 圆的面积:78.5
// 圆的周长为:31.400000000000002
抽象方法和抽象类的注意事项:
抽象类中是可以有构造函数的,并且构造函数的写法和其它类没有区别,只不过它真正跑起来是因为子类构造函数的super调用,毕竟我们没办法new一个抽象类对象出来,只能把抽象类的构造函数交给子类的构造函数去使用。
抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。
抽象类的子类,必须重写父类中所有的抽象方法,如果有一个抽象方法没有重写,都会出现编译错误不给过,这时也可以把子类也声明为抽象类,报错就会消失。
위 내용은 Java 다형성 및 추상 클래스의 용도와 원리는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!