面向对象之多态

本文深入解析多态在Java中的实现,包括行为多态(重载和重写)和属性多态。探讨其在提高代码复用、降低耦合和扩展性中的作用,以及数据类型转型(向上转型与向下转型)。同时涵盖内部类(成员、局部、静态和匿名)的应用实例,帮助理解面向对象编程中的这一核心概念。
摘要由CSDN通过智能技术生成

多态

1概述

在不同的个体上会表现出不同的状态,即同一个行为,不同的实现,就是多态。

2多态的定义

多态是面向对象的三大特征之一,也是最重要的特点,多态主要在Java中体现在两个方面:

1行为的多态(重载,重写 ---静态绑定)

2属性的多态(父类引用指向子类对象----动态绑定)

3多态的好处

提高代码的重用性

降低代码耦合度

提高程序的扩展性

4构成多态的必要条件

必须存在继承或者实现关系

父类的引用指向子类对象

必须有方法的重写

5数据类型转型

向上转型: 隐式转换(子类转为父类型)直接转

Pet cat = new Cat();
 Pet pet = new Pet();
 Pet p = cat;   //子类向上转型

向下转型:显示转换 (父类型转为子类型)手动转

Pet cat = new Cat();
Pet pet = new Pet();
Pet p = cat;
Cat c = (Cat)pet;  //父类型手动转为子类型

只能发生在继承关系中

子类之间不能互相转换的(编译无法通过)

内部类

在类的内部声明一个类,嵌套类,内属类;当一个类b只为另一个类a服务,其它类不可能再用到b时,就没必要再创建一个单独的类,因此可以将类b存放在类a中,减少不必要的文件创建,Java中的内部类包含以下四种:

成员内部类

局部内部类

静态内部类

匿名内部类

成员内部类

 定义成员内部类

public class Demo01 {
    private int a;   //属性、成员变量、全局变量
    {
        //游离块,代码块
    }
    public void m1(){   //行为、方法、成员方法
        System.out.println("这是类的成员方法");
    }
    //成员内部类
    class Inner{
        private int b;
        public void m2(){
            System.out.println("这是成员内部类的一个方法");
        }
    }
}

访问成员内部类的资源

public class Test {
    public static void main(String[] args) {
        Demo01 demo01 = new Demo01();  //创建外部类的对象
        Demo01.Inner inner = demo01.new Inner();   //通过外部类创建的对象再创建内部类对象
        inner.m2();
    }
}

注意:

1成员内部类和成员方法,成员变量同一个级别

2创建内部类需要外部类对象完成

3内部类可以直接访问外部类的资源

4大部分时候内部类是私有的

局部内部类

局部内部类类似于局部变量,一般在一个方法中或一个语句块中出现,作用范围只作用于当前的声明区域,若某一个类,只为某个语句块或某个方法提供服务,就不必要声明全局类,更没有必要创建单独的java文件,因此,只需要在该方法内部去声明这个类

public class Demo02 {
    int c = 50;
    public void m1(){  //成员方法
        int i = 10;   //局部变量
        class TestInner{      //局部内部类
            int a = 20;

            public void m2(){
                c = 90;
                //i = 100     局部变量的值不可修改
                System.out.println(i);
                System.out.println(c);
                System.out.println("这是局部内部类的方法");
            }
        }

        TestInner testInner = new TestInner();  //实例化局部内部类
        testInner.m2();       //调用局部内部类中的方法 
        testInner.a = 10;      //调用局部内部类方法
        System.out.println(testInner.a);
    }
}

注意:

1局部内部类,不能使用权限修饰符

2只能在方法中访问

3局部内部类可以使用全局变量,修改全局变量,但是它所属的方法的局部变量是只读的,默认添加final关键字

4.局部内部类想要调用外部类的变量,则需要使用 外部类名.this.变量名

静态内部类

定义

public class Demo03 {
    void m1(){
        System.out.println("普通成员方法");
    }
    static class Inner{  //定义一个静态内部类
        void m2(){
            System.out.println("这是静态内部类的方法");
        }
    }
}

使用

Demo03.Inner inner03 = new Demo03.Inner(); //静态内部类创建对象
inner03.m2();

 匿名内部类

它是一个没有名字的类,大多数时候,匿名内部类针对抽象类和接口来使用

对普通类创建匿名内部类

Demo04 demo04 = new Demo04(){   //匿名内部类的创建
            public void m1(){
                System.out.println("这是匿名内部类的m1方法!");
            }
        };

对接口创建匿名内部类

Demo05 demo05 = new Demo05() {
            @Override
            public void m1() {
                System.out.println("内部类重写了接口中的方法");
            }
        };

注意:

1匿名内部类就是一个没有名字的类

2创建匿名内部类时就是在创建匿名内部类对象

3匿名内部类没有构造器,如果要使用构造器功能,可以使用代码块实现构造器功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值