Java入门第68课——多态和内部类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/houjunkang363/article/details/90736348

1.1 多态

1.1.1 多态的意义

    · 一个类型的引用在指向不同的对象时会有不同的实现:

        IT客栈职员 emp1=new IT客栈讲师();

        IT客栈职员 emp2=new IT客栈项目经理();

        emp1.完成工作();

        emp2.完成工作();

    · 同样一个对象,造型成不同的类型时,会有不同的功能

        IT客栈讲师 teacher=new IT客栈讲师();

        企业技术顾问 consultant=teacher;

        技术图书作者 author=teacher;

        consultant.培训员工();

        author.编辑稿件();

1.1.2 向上造型

    · 一个类的对象可以向上造型的类型有

        父类的类型

        其实现的接口类型

    · Java编译器根据类型检查调用方法是否匹配

    IT客栈讲师 teacher=new IT客栈讲师();

    IT客栈职员 emp=teacher;

    企业技术顾问 consultant=teacher;

    技术图书作者 author=teacher;

    

    emp.上班打卡();

    emp.完成工作();

    consultant.培训员工();

    author.编辑稿件();

1.1.3 强制转型

    · 可以通过强制转换将父类型变量转换为子类型变量,前提是该变量指向的对象确实是该子类类型。

    · 也可通过强制转换将变量转换为某种接口类型,前提是该变量指向的对象确实实现了该接口。

    · 如果在强制转换过程中出现违背上述两个前提,将会抛出ClassCastException

    

    IT客栈职员 emp1=new IT客栈讲师();

    IT客栈讲师 teacher=(IT客栈讲师)emp1;

    技术图书作者 author=(技术图书作者)emp1;

    IT客栈项目经理 pm=(IT客栈项目经理)emp1;

    //会抛出ClassCastException

1.1.4 instanceof关键字

    · 在强制转型中,为了避免出现ClassCastException,可以通过instanceof关键字判断某个引用指向的对象是否为指定类型。

    IT客栈职员 emp1=new IT客栈讲师();//通过instanceof运算判断emp1引用所指向的对象是否是指定类型

    System.out.println(emp1 instanceof IT客栈讲师);//true

    System.out.println(emp1 instanceof 技术图书作者);//true

    System.out.println(emp1 instanceof IT客栈项目经理);//false

    

    IT客栈项目经理 pm=null;

    if(emp1 instanceof IT客栈项目经理){

        pm=(IT客栈项目经理)emp1;

    }//类型强制转换时最好配合instanceof判断,这样可以避免出现ClassCastException

1.2 内部类

1.2.1 定义成员内部类

    · 一个类可以定义在另外一个类的内部,定义在类内部的类称之为Inner,其所在的类称之为Outer;

    · Inner定义在Outer的内部。通常只服务于Outer,对外部不具备可见性,Inner可以直接调用Outer的成员及方法(包括私有的)。

    class Outer{
        private int time;
        
        class Inner{
            public void timeInc(){
                time++;
            }
        }
    }

1.2.2 创建内部类对象

    · 一般情况下,Inner对象会在Outer对象中创建(构造方法或其他方法);Inner对象中会有一个隐式的引用指向创建它的Outer类对象。

    class Outer{
        private int time;
        private Inner inner;
        
        Outer(int time){
            this.time=time;
            inner=new Inner();
            inner.timeInc();
        }
        
        public void printTime(){
            System.out.println(time);
        }
        
        class Inner{
            public void timeInc(){
                time++;
            }
        }
    }
    
    Outer outer=new Outer(100);
    outer.printTime();

         上面代码的输出结果为:101。在Outer构造方法中创建的Inner对象会有一个隐式的引用指向创建它的Outer对象,调用Inner对象的timeInc方法,即会对Outer的time属性进行操作。

1.2.3 定义匿名内部类

    · 如果在一段程序中需要创建一个类的对象(通常这个类需要实现某个接口或者继承某个类),而且对象创建后,这个类的价值也就不存在了,这个类可以不必命名,称之为匿名内部类。

    image.png

定义匿名内部类(续1)

    public interface Action{
        public void execute();
    }
    
    public class Main{
        public static void main(String[] args){
            Action action=new Action(){
                public void execute(){
                    System.out.println("Hello,World");
                }
            };
            action.execute();
        }
    }

    代码中创建了实现了Action接口的内部匿名类对象,并调用其execute方法。

1.3 面向对象汇总

1.3.1 面向对象汇总

    · 面向对象特征:

        封装

        继承

        多态

扫描关注我吧:

猜你喜欢

转载自blog.csdn.net/houjunkang363/article/details/90736348
今日推荐