>  기사  >  Java  >  한 글로 JAVA 객체지향 다형성을 마스터하세요

한 글로 JAVA 객체지향 다형성을 마스터하세요

WBOY
WBOY앞으로
2022-06-15 11:48:111911검색

이 글에서는 다형성과 관련된 문제를 주로 소개하는 java에 대한 관련 지식을 제공합니다. 다형성은 동일한 개체를 가리키며 동시에 여러 형태를 갖는 객체 지향 프로그래밍의 중요한 특징입니다. 모든 사람에게 도움이 되기를 바랍니다.

한 글로 JAVA 객체지향 다형성을 마스터하세요

추천 학습: "java 비디오 튜토리얼"

1. 개념

다형성은 객체지향 프로그래밍(OOP)의 중요한 기능으로, 동일한 엔터티가 동시에 여러 형태를 갖는다는 것을 의미합니다. 즉, 동일한 실체의 객체가 서로 다른 시기에 서로 다른 객체를 나타내는데, 이는 다양한 형태의 객체를 의미합니다.

서로 다른 하위 클래스 개체를 상위 클래스로 처리하여 서로 다른 하위 클래스 개체 간의 차이점을 보호하고, 공통 코드를 작성하고, 공통 프로그래밍을 만들고, 호출 표준을 통합할 수 있습니다.

예를 들어 여자친구가 과일을 사달라고 합니다. 무엇을 사든 사과든 수박이든 과일이라면 이는 삶의 다양성을 보여주는 것입니다

또 다른 예는 새끼 고양이, 강아지입니다. , 자돈 등을 모두 작은 동물로 분류할 수 있는데, 각각의 작은 동물이 먹어야 하도록 균일하게 설정할 수 있습니다. 그러나 작은 동물마다 습성이 다르기 때문에 이를 고유하게 설정할 수 있습니다. 작은 동물, 다형성 객체는 상위 클래스에 정의된 하위 클래스에 다시 작성된 함수만 호출할 수 있으며, 하위 클래스의 고유 함수는 호출할 수 없습니다. 이로써 코드 통일이 이루어집니다

2. 전제 1 다형성: 상속의 전제

    다형성 2: 메서드 재작성이 있어야 합니다
  1. 부모 클래스 참조는 다음과 같이 하위 클래스 객체를 가리킵니다. Animal a = new Cat();
  2. 다형성에서는 왼쪽을 보세요. 컴파일 시, 실행 시 권리

  3. 한 글로 JAVA 객체지향 다형성을 마스터하세요3. 연습: 다형성 입력 사례
패키지 생성: cn.tedu.oop

클래스 생성: TestDemo.java

package cn.tedu.oop2;/*本类用作多态的入门案例*/public class TestDemo {
    public static void main(String[] args) {
        //6.创建“纯纯的”对象用于测试
        Animal a = new Animal();
        Cat c = new Cat();
        Dog d = new Dog();
        a.eat();//小动物Animal吃啥都行~调用的是父类自己的功能
        c.eat();//小猫爱吃小鱼干~调用的是子类重写后的功能
        d.eat();//小狗爱吃肉骨头~调用的是子类重写后的功能
        /*2.父类对象不可以使用子类的特有功能*/
        //a.jump();//报错,Animal类里并没有这个方法
        //a.run();//报错,Animal类里并没有这个方法
        c.jump();//小猫Cat跳的老高啦~,子类可以调用自己的功能
        d.run();//小狗Dog跑的老快啦~,子类可以调用自己的功能

        //7.创建多态对象进行测试
        /*3.口诀1:父类引用指向子类对象
        * 解释:创建出来的子类对象的地址值,交给父类类型的引用类型变量来保存*/
        Animal a2 = new Cat();//Cat类对象的地址值交给父类型变量a2来保存
        Animal a3 = new Dog();//Dog类对象的地址值交给父类型变量a3来保存
        //8.测试多态对象
        /*4.口诀2:编译看左边,运行看右边
        * 解释:必须要在父类定义这个方法,才能通过编译,把多态对象看作是父类类型
        *      必须要在子类重写这个方法,才能满足多态,实际干活的是子类*/
        a2.eat();//小猫爱吃小鱼干~,多态对象使用的是父类的定义,子类的方法体
    }}/*1.多态的前提:继承+重写*///1.创建父类class Animal{
    //3.创建父类的普通方法
    public void eat(){
        System.out.println("小动物Animal吃啥都行~");
    }}//2.1创建子类1class Cat extends Animal{
    //4.1添加重写的方法
    public void eat(){
        System.out.println("小猫爱吃小鱼干~");
    }
    //5.1添加子类的特有功能
    public void jump(){
        System.out.println("小猫Cat跳的老高啦~");
    }}//2.2创建子类2class Dog extends Animal{
    //4.2添加重写的方法
    @Override
    public void eat(){
        System.out.println("小狗爱吃肉骨头~");
    }
    //5.2添加子类的特有功能
    public void run(){
        System.out.println("小狗Dog跑的老快啦~");
    }}

4 다형성의 장점은 다음과 같습니다. 객체의 특정 유형에 따라 객체의 특정 메소드를 사용할 수 있습니다

프로그램의 확장성과 유지 관리성이 향상됩니다

    5. 다형성 사용
  1. 전제: 다형성 객체는 자신을 고려합니다. 상위 클래스 유형
멤버 변수: 상위 클래스의

멤버 메소드 사용: 덮어쓰기로 인해 하위 클래스의

정적 멤버 사용: 클래스가 로드될 때 로드되며 이를 호출하는 사람은 누구든지 Whose를 반환합니다.
  1. 6. 연습: 다형성 멤버를 사용하여 테스트
  2. 패키지 만들기: cn.tedu.oop
  3. 클래스 만들기: TestDemo2.java
  4. package cn.tedu.oop2;/*本类用于测试多态成员的使用情况*/public class TestDemo2 {
        public static void main(String[] args) {
            //7.创建纯纯的子类对象
            Dog2 d = new Dog2();
            System.out.println(d.sum);//20,子类自己的属性
            d.eat();//小狗爱吃肉包子,子类自己的方法
    
            //8.创建多态对象
            /*口诀1:父类引用指向子类对象*/
            /*口诀2:编译(保存)看左边,运行(效果)看右边*/
            Animal2 a = new Dog2();
            /*多态中,成员变量使用的是父类的*/
            System.out.println(a.sum);//10
            /*多态中,方法的声明使用的是父类的,方法体使用的是子类的*/
            a.eat();//小狗爱吃肉包子
            /*多态中,调用的静态方法是父类的,因为多态对象把自己看作是父类类型
            * 直接使用父类中的静态资源*/
            a.play();//没有提示,玩啥都行~
            Animal2.play();
        }}//1.创建父类class Animal2{
        //3.创建父类的成员变量
        int sum = 10;
        //4.创建父类的普通方法
        public void eat(){
            System.out.println("吃啥都行~");
        }
        //9.1定义父类的静态方法play
        public static void play(){
            System.out.println("玩啥都行~");
        }}//2.创建子类class Dog2 extends Animal2{
        //5.定义子类的成员变量
        int sum = 20;
        //6.重写父类的方法
        @Override
        public void eat(){
            System.out.println("小狗爱吃肉包子");
        }
        //9.2创建子类的静态方法play
        //@Override
        /*这不是一个重写的方法,只是恰巧在两个类中出现了一模一样的两个静态方法
        * 静态方法属于类资源,只有一份,不存在重写的现象
        * 在哪个类里定义,就作为哪个类的资源使用*/
        public static void play(){
            System.out.println("小狗喜欢玩皮球~");
        }}
7 확장

7.1 포괄적인 자동차 케이스 디자인

패키지 만들기: cn .tedu.oopexec

클래스 생성: DesignCar.java

package cn.tedu.oop2;/*本类用于完成汽车设计案例*/public class DesignCar {
    public static void main(String[] args) {
        //9.创建一个纯纯的父类对象进行测试
        Car c = new Car();
        System.out.println(c.getColor());//null
        c.start();
        c.stop();
        //c.swim();//报错,父类对象不可以调用子类的特有功能

        //10.创建纯纯的子类对象做测试
        BMW b = new BMW();
        System.out.println(b.color);//五彩斑斓的黑
        System.out.println(b.getColor());//null
        b.start();//都让开,我的车要起飞啦~
        b.stop();//唉呀妈呀熄火了~

        //11.创建多态对象进行测试
        Car c2 = new TSL();
        //System.out.println(c2.color);
        System.out.println(c2.getColor());
        c2.stop();
        c2.start();
        //c2.swim();
    }}//1.通过分析,抽象形成一个汽车类class Car{
    //2.定义并封装汽车类的属性--成员变量
    private String brand;//品牌
    private String color;//颜色
    private int id;//编号
    private double price;//价格

    //3.定义功能
    public void start(){
        System.out.println("我的小车车启动啦~");
    }
    public void stop(){
        System.out.println("唉呀妈呀熄火了~");
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }}//4.创建子类class BMW extends Car{
    String color = "五彩斑斓的黑";
    //5.重写父类的方法
    @Override
    public void start(){
        System.out.println("都让开,我的车要起飞啦~");
    }}//6.创建子类2class TSL extends Car{
    //7.重写父类的方法
    @Override
    public void stop(){
        System.out.println("唉呀妈,怎么停不下来呢");
    }
    //8.添加子类的特有功能
    public void swim(){
        System.out.println("没想到吧,我还是个潜水艇");
    }}
7.2 호출 표준을 통일하기 위한 다형성

package cn.tedu.oop2;public class TestFruit {
    public static void main(String[] args) {
        Fruit f = new Fruit();
        Apple a = new Apple();
        Orange o = new Orange();
        get(f);
        get(a);
        get(o);
    }
    //只需要创建一个方法,就可以执行截然不同的效果
    //忽略子类对象的差异统一看作父类类型
    public static void get(Fruit f){
        f.clean();
    }}class Fruit{
    public void clean(){
        System.out.println("水果要洗洗再吃");
    }}class Apple extends Fruit{
    @Override
    public void clean(){
        System.out.println("苹果需要削皮");
    }}class Orange extends Fruit{
    @Override
    public void clean(){
        System.out.println("橙子需要剥皮");
    }}

7.3 정적 변수와 인스턴스 변수의 차이점

구문 정의의 차이점: 정적 변수는 반드시 앞에 정적 키워드를 추가하되 인스턴스 변수 앞에 추가하지 마십시오.

프로그램 실행 시 차이점: 인스턴스 변수는 객체의 속성에 속하며, 인스턴스 객체가 생성되어야 그 안에 있는 인스턴스 변수에 공간이 할당되고, 이 인스턴스 변수를 사용할 수 있습니다. 정적 변수는 인스턴스 객체에 속하지 않고 클래스에 속하므로 클래스 변수라고도 합니다. 프로그램이 인스턴스 객체를 생성하지 않고 클래스의 바이트코드를 로드하는 한 정적 변수에는 공간이 할당되며 정적 변수를 사용할 수 있습니다. 즉, 인스턴스 변수는 이 개체를 통해 사용되기 전에 개체를 만들어야 하며, 정적 변수는 클래스 이름을 사용하여 직접 참조할 수 있습니다.

7.4 상향 변환 및 하향 변환


JAVA에서는 상속이 중요한 기능입니다. 확장 키워드를 통해 상위 클래스가 현재 하위 클래스의 요구 사항을 충족할 수 없는 경우 하위 클래스가 상위 클래스의 기능을 재사용할 수 있습니다. 그런 다음 하위 클래스는 상위 클래스의 메서드를 재정의하여 확장할 수 있습니다.

이 과정에는 다형성 적용이 있습니다. 변환에는 상향 변환과 하향 변환의 두 가지 방법이 있습니다.

상향 변환: 서로 다른 하위 클래스 개체를 상위 클래스로 처리하여 서로 다른 하위 클래스 개체 간의 차이점을 보호하고, 범용 코드를 작성하고, 범용 프로그래밍을 만들고, 호출 표준을 통합할 수 있습니다. 예: 상위 클래스 Parent, 하위 클래스 Child 상위 클래스의 참조는 하위 클래스 객체를 가리킵니다. Parent p=new Child();

참고: 상향 변환 중에 하위 클래스 객체는 상위 클래스 객체로 간주되며, 상위 클래스의 함수만 호출할 수 있습니다. 하위 클래스가 상위 클래스에 선언된 메서드를 재정의하는 경우 메서드 본문은 하위 클래스의 재정의된 함수를 실행합니다. 그러나 이때 개체는 자신을 상위 유형으로 간주하므로 다른 리소스는 여전히 상위 유형을 사용합니다.

예: 화뮬란은 아버지를 위해 군대에 입대합니다. 모두가 화뮬란을 아버지로 여기지만 실제로 군대에 가는 사람은 화뮬란입니다. 게다가 화뮬란은 아버지가 할 수 있는 일만 할 수 있고 그녀에게는 허락되지 않습니다. 군부대에서 화장을 하려고.

하향 변환(덜): 서브클래스의 참조는 서브클래스 객체를 가리키며, 그 과정에서 강제 변환이 채택되어야 합니다. 이전에 상향 변환된 하위 클래스 객체이고 여전히 하위 클래스의 고유한 기능을 수행하려고 하므로 하위 클래스 객체로 복원해야 합니다
Parent p = new Child();//상향 변환, 이때 , p는 Parent 유형
Child c = (Child)p;//이때 Parent 유형 p를 작은 유형 Child로 변환합니다
실제로는 상위 클래스 객체를 만드는 것과 같습니다. 또는 자신만의
참고: 다운캐스팅할 때 하위 클래스의 특수 메서드 사용을 용이하게 하기 위한 것입니다. 즉, 하위 클래스 메서드의 기능을 확장하면 하위 클래스 함수를 직접 사용할 수 있습니다.
예: Hua Mulan의 전쟁이 끝난 후 그녀는 더 이상 아버지로 간주될 필요가 없으며 "노란 거울을 볼 수 있습니다"

추천 학습: "java 비디오 튜토리얼"

위 내용은 한 글로 JAVA 객체지향 다형성을 마스터하세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제