• Java学习笔记(十)——多态


    一、多态

    1、对象的多种形态

    (1)引用多态:

          父类的引用可以指向本类的对象

          父类的引用可以指向子类的对象

    (2)方法多态:

          创建本类对象时,调用的方法为本类方法:

          创建子类对象时,调用的方法是子类方法,如果没重写,调用的就是继承父类的方法

    (3)父类的引用是不可以调用子类特有的方法。

    二、多态中的引用类型转换

    1、向上类型转换(隐式/自动类型转换)

        小类型到大类型的转换

    2、向下类型转换(强制类型转换)

        大类型到小类型的转换

    3、instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题。

    4、一个demo

    image

    5、使用instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题的一个demo

    image

    三、抽象类

    1、语法定义

        在类前面使用abstract修饰的类就是抽象类

    2、应用场景:

    (1)在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。

    (2)从多个具有相同特征的子类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。

    3、作用:

        限制规定子类必须实现的某些方法,但不关注实现细节。

    4、使用规则:

    (1)使用abstract定义抽象类

    (2)abstract定义抽象方法,只有声明,不需要实现

    (3)包含抽象方法的类是抽象类

    (4)抽象类中可以包含普通的方法,也可以没有抽象方法。

    (5)抽象类不能直接创建,可以定义引用变量

    5、一个demo

    (1)建立一个手机抽象类

    image

    package com.cnblogs;
    
    public abstract class Telphone 
    {
        public abstract void call();
        public abstract void sendMessage();
    }

    (2)创建一个老式手机CellPhone类

    imageimage

    package com.cnblogs;
    
    public class CellPhone extends Telphone {
    
        @Override
        public void call() {
            // TODO Auto-generated method stub
            System.out.println("通过键盘打电话");
        }
    
        @Override
        public void sendMessage() {
            // TODO Auto-generated method stub
            System.out.println("通过键盘发短信");
        }
    
    }

    (3)同(2),建立只能手机类SmartPhone

    package com.cnblogs;
    
    public class SmartPhone extends Telphone {
    
        @Override
        public void call() {
            // TODO Auto-generated method stub
            System.out.println("使用语音打电话");
    
        }
    
        @Override
        public void sendMessage() {
            // TODO Auto-generated method stub
    
            System.out.println("使用语音发短信");
        }
    
    }

    (4)建立入口类Init

    image

    package com.cnblogs;
    
    public class Init {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Telphone tel1 = new CellPhone();
            tel1.call();
            tel1.sendMessage();
            Telphone tel2 = new SmartPhone();
            tel2.call();
            tel2.sendMessage();
    
        }
    
    }

    (5)运行结果:

    image

    四、Java中的接口

    1、接口定义

          类是一种具体实现提,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类方法的具体实现,它只规定这些类里必须提供的某些方法。

    2、定义方法:

          使用interface关键字:

    [修饰符]  interface 接口名[extends 父接口1,父接口2……]
    {
        0个~多个常量定义
        0个~多个抽象方法定义
    }

    3、接口定义:

          接口中的方法只能是抽象方法,总是使用,即使定义时不添加public  abstract修饰符,系统也是默认加上的。

    4、使用接口:

          一个类可以实现一个或多个接口,实现接口使用implements关键字,Java中一个类只能继承一个父类,但是可以继承多个接口。

    image

          格式固定,不能改变extends和Implements顺序的调换。

    5、一个demo

    image

    (1)定义一个接口:

    image

    image

    package com.cnblogs;
    
    public interface IPlayGame {
        public void playGame();
    
    }

    (2)SmartPhone引用接口

    package com.cnblogs;
    
    public class SmartPhone extends Telphone implements IPlayGame 
    {
    
        @Override
        public void call() {
            // TODO Auto-generated method stub
            System.out.println("使用语音打电话");
    
        }
    
        @Override
        public void sendMessage() {
            // TODO Auto-generated method stub
    
            System.out.println("使用语音发短信");
        }
        
        public void playGame()
        {
            System.out.println("手机可以玩游戏");
        }
    
    }

    (3)新建PSP类,引用接口

    image

    image

    package com.cnblogs;
    
    public class Psp implements IPlayGame {
    
        @Override
        public void playGame() {
            // TODO Auto-generated method stub
            System.out.println("PSP可以玩游戏");
    
        }
    
    }

    (4)使用方法:

    IPlayGame ip1 = new SmartPhone();
    IPlayGame ip2 = new Psp();
            
    ip1.playGame();
    ip2.playGame();

    6、使用接口

    (1)接口在使用过程中,还经常与匿名内部类配合使用

    (2)匿名内部类定义:

           没有名字的内部类,多用于关注实现而不关注实现类的名称

    (3)语法格式:

    Interface i = new Interface();
    {
        public void method()
        {
            System.out.println("匿名内部类实现接口的方式");
        }
    }

    (4)一个demo

    IPlayGame ip3 = new IPlayGame(){
    
                @Override
                public void playGame() {
                    // TODO Auto-generated method stub
                    System.out.println("使用匿名内部类的方式实现接口");
                }
            };
            
            ip3.playGame();
            
            new IPlayGame(){
    
                @Override
                public void playGame() {
                    // TODO Auto-generated method stub
                    System.out.println("使用匿名内部类的方式实现接口2");
                }
                
            }.playGame();
    image

    五、UML简介

    1、UML概念

    image

  • 相关阅读:
    IO—》字节流&字符流
    IO—》递归
    IO—》File类
    IDEA快速升级模块版本号
    redis使用Jackson2JsonRedisSerializer序列化问题
    git 创建管理多用户
    linux后台启动程序脚本实例
    linux 安装配置kafka脚本
    linux 安装配置zookeeper脚本
    linux安装配置JDK脚本
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4947514.html
Copyright © 2020-2023  润新知