우리는 Java의 세 가지 주요 기능인 캡슐화, 상속 및 다형성을 알고 있습니다. 처음 두 가지는 Java 소개(6)에서 이미 언급한 바 있습니다. 이제 다형성의 특징에 대해 이야기해 보겠습니다.
다형성이란 무엇인가요?
다형성은 이름에서 알 수 있듯이 다양한 형태
를 의미합니다. Java에서 다형성의 의미:
1 객체에 메시지를 보내고 객체가 응답할 동작을 스스로 결정하도록 합니다. 메시지
2. 동적 메서드 호출을 구현하려면 하위 클래스 개체의 참조를 상위 클래스 참조 변수에 할당하세요. 3. 상향변환
다형성에 대한 나의 설명:
예를 들어 우리는 인간이고, 학생이고, 젊은이이기 때문에 인간으로서 일을 할 수도 있고, 학생으로서 학생표를 살 수도 있습니다. 젊은이로서의 우리의 정체성을 자선 활동에 활용하여 다양한 형태로 다양한 일을 할 수 있습니다. 이것이 더 잘 이해됩니까?
참고:다형성 전제 조건: 하위-상위 클래스 관계가 있어야 합니다.
다형성 부모 클래스 참조 변수를 사용하여 메서드를 호출하면 하위 클래스의 재정의된 메서드가 호출됩니다.
다형성 정의 및 사용 형식:
부모 클래스 유형 변수 이름 = 새 하위 클래스 유형();
다형성 멤버의 특성:다형성 멤버 변수: 컴파일하고 실행하여 확인
왼쪽의 다형성 멤버 메소드: 왼쪽에서 컴파일하고 오른쪽에서 실행
다형성 변환은 상향 변환과 하향 변환의 두 가지 유형으로 나뉩니다.
상향 변환 : 다형성 자체가 상향변형의 과정
적용 시나리오 : 하위 클래스 유형을 마주할 필요가 없는 경우, 확장 속성을 올려서, 또는 해당 작업을 완료하려면 상위 클래스의 기능을 사용하십시오.
하향 변환: 상향 변환된 하위 클래스 객체는 강제 유형 변환 형식을 사용하여 상위 클래스 참조 유형을 하위 클래스 참조 유형으로 변환할 수 있습니다.
사용 형식: 하위 클래스 유형 변수 이름 = ( 하위 클래스 유형) 상위 클래스 유형의 변수
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(); //输出:我是人类中的孩子 //我作为人,用孩子的身份,说出我是人类中的孩子 } } //这段代码,我们用到了 继承,重写,向上转型,因为多态本来就是向上转型的过程
코드 재사용성 향상
모듈 간의 결합 감소
소위 다형성이란 에 정의된 참조 변수가 가리키는 특정 유형을 말합니다. 참조 변수를 통해 생성된 프로그램 및 메서드 호출은 프로그래밍 중에 결정되지 않지만 프로그램 실행 중에 결정됩니다. 즉, 참조 변수가 어떤 클래스 인스턴스 객체를 가리킬지, 참조에 의해 실행된 메서드 호출이 결정됩니다. 변수는 어떤 클래스에서 구현되어야 하는지는 프로그램이 실행되는 동안 결정될 수 있습니다. 특정 클래스는 프로그램이 실행 중일 때만 결정되기 때문에 소스 프로그램 코드를 수정하지 않고도 참조 변수를 다양한 클래스 구현에 바인딩할 수 있으므로 참조에서 호출하는 특정 메서드가 그에 따라 변경됩니다. 프로그램 코드는 프로그램이 실행 중일 때 프로그램에 바인딩된 특정 코드를 변경하여 프로그램이 여러 실행 상태를 선택할 수 있도록 합니다. 다형성은 컴파일 타임 다형성과 런타임 다형성으로 구분됩니다. 그 중 편집 시 다형성은 주로 메서드의 오버로딩을 의미하며, 편집 후에는 런타임 시 두 가지 다른 기능이 됩니다. 다형성은 동적 바인딩을 통해 달성되므로 런타임 다형성은 동적입니다.
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 키워드로 수정해야 하는 메서드를 나타냅니다. 다르게 말하면 추상 클래스의 추상 메서드는 후속 구현에서 상속자에 의해 재정의될 수 있으며 반드시 추상 클래스에서 구현될 필요는 없습니다.
추상 클래스 선언 키워드:abstracat
추상 클래스 정의: 举例解释:形状类Shape需要提供用于计算面积和周长的方法,但是形状本身没有被确定,那么计算周长和面积的方法就无法确定,此时我们就需要使用抽象类和抽象方法。 由于Shape类计算周长和面积的方法无法确定,那么就可以将这样的方法声明为抽象的,以便在具体的子类中进行实现。 抽象方法和抽象类的注意事项: 抽象类中是可以有构造函数的,并且构造函数的写法和其它类没有区别,只不过它真正跑起来是因为子类构造函数的super调用,毕竟我们没办法new一个抽象类对象出来,只能把抽象类的构造函数交给子类的构造函数去使用。 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。 抽象类的子类,必须重写父类中所有的抽象方法,如果有一个抽象方法没有重写,都会出现编译错误不给过,这时也可以把子类也声明为抽象类,报错就会消失。 简洁总结: 抽象方法:没有方法体的方法,需要关键字abstract修饰 有抽象方法的类,则一定是抽象类,需要关键字abstract修饰 抽象方法不能使用private和static修饰 抽象类,不一定有抽象方法的类 抽象类,不一定有抽象方法的类 抽象类可以有构造函数 普通类和抽象类有哪些区别? 普通类不能包含抽象方法,抽象类可以包含抽象方法 抽象类不能直接实例化,普通类可以直接实例化。 위 내용은 Java의 상태 및 추상 클래스는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!public abstract class studnet{//定义一个抽象类
public void study(){ //普通方法
System.out.println("我会学习");
}
public abstract void eat(); //抽象方法,没有方法体,有abstract关键字做修饰
}
//注意: 有抽象方法,这个类必须是抽象的!!!
//定义一个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