多态的应用 与 内部类

多态的应用

什么是多态:父类的引用指向了子类的实例

多态的实现方法:

  >使用父类作为方法的形参实现多态

  >使用父类作为方法的返回值实现多态

继承多态:参数的父类是普通类或者抽象类时

接口多态:参数的父类是一个接口时,构成接口多态

 

多态作为形参

基本数据类型

基本数据类型作为形参,和值传递没什么区别,不涉及到多态

引用类型

普通类

一个形参希望我们传递的是一个普通类时,我们实际传递的是该类的对象或者匿名对象

复制代码
public class OOP01 {
    public static void main(String[] args) {
        Student s = new Student();
        Person p = new Person();
        p.run(s);
        System.out.println("------------");
        p.run(new Student());//匿名对象当做实参传递
    }
}
class Student{
    public void study(){
        System.out.println("学习中");
    }
}
class Person{
    public void run(Student stu){
        stu.study();
        System.out.println("run方法");
    }
}
复制代码

 

抽象类

当一个形参希望我们传入的是一个抽象类时,我们实际上传入的是该类的子类对象 或 子类的匿名对象

复制代码
public class OOP01 {
    public static void main(String[] args) {
        //多态的体现
        Student s = new ABS();
        Person p = new Person();
        p.run(s);
        System.out.println("------------");
        p.run(new ABS());//匿名对象当做实参传递
    }
}

/**
 * 定义的抽象类
 */
abstract class Student{
    public abstract void study();
}

class ABS extends Student{
    @Override
    public void study() {
        System.out.println("学习中....");
    }
}

class Person{
    /**
     * 形参要求传递进来一个抽象类型
     * @param stu
     */
    public void run(Student stu){
        stu.study();
        System.out.println("run方法");
    }
}
复制代码

 

接口

当一个形参希望我们传入的是一个接口时,我们实际上传入的是该接口的实现类对象 或 实现类的匿名对象

复制代码
public class OOP01 {
    public static void main(String[] args) {
        IStudent s = new Student();
        Person p = new Person();
        p.run(s);
        System.out.println("------------");
        p.run(new Student());//匿名对象当做实参传递

        IStudent iStudent = new IStudent(){
            @Override
            public void study() {
                System.out.println("接口...");
            }
        };
        p.run(iStudent);

        p.run(new IStudent(){
            @Override
            public void study() {
                System.out.println("接口...1");
            }
        });

    }
}
class Student implements IStudent{
    public void study(){
        System.out.println("学习中");
    }
}

interface IStudent{
    void study();
}

class Person{
    public void run(IStudent stu){
        stu.study();
        System.out.println("run方法");
    }
}
复制代码

 

多态作为返回值

基本数据类型

基本数据类型作为返回值,和值传递没什么区别,不涉及到多态

引用数据类型

普通类

  当一个方法的返回值是一个普通类,实际返回的就是该类的对象,可以使用该类的对象来接收

复制代码
public class OOP01 {
    public static void main(String[] args) {
        Student s = new Student();
        Person p1 = s.study();
        Person eat = s.eat();
        System.out.println(p1);
        System.out.println(eat);
    }
}


class Person{

}

class Student{
    public Person study(){
        return new Person();
    }
    public Person eat(){
        Person p = new Person();
        return p;
    }
}
复制代码

 

抽象类

当一个方法返回值是一个抽象类时,实际返回的是该抽象类的子类对象,我们可以使用该抽象类接收。

如果使用该类的子类来接收,需要使用强制类型装换(使用强制类型转换需要注意强制转换的异常)

复制代码
public class OOP01 {
    public static void main(String[] args) {
        Student s = new Student();
        APerson p1 = s.study();
        APerson eat = s.eat();
        //自类接收父类发返回需要强制类型转换
        Person p3 = (Person) s.study();//强制转换有可能出现异常
        if (eat instanceof Person){
            Person p4 = (Person)eat;
        }

        System.out.println(p1);
        System.out.println(eat);
    }
}


abstract class APerson{

}

class Person extends APerson{

}

class Student{
    public APerson study(){
        return new Person();
    }

    public APerson eat(){
        return new APerson(){};
    }
}
复制代码

接口

当一个方法返回值是一个接口时,实际返回的是该接口的实现类对象,我们可以使用接口来接收。

如果使用实现类来接收,需要使用强制类型装换(使用强制类型转换需要注意强制转换的异常)

复制代码
public class OOP01 {
    public static void main(String[] args) {
        Student s = new Student();
        IPerson p1 = s.study();
        IPerson eat = s.eat();
        //自类接收父类发返回需要强制类型转换
        Person p3 = (Person) s.study();//强制转换有可能出现异常
        if (eat instanceof Person){
            Person p4 = (Person)eat;
        }

        System.out.println(p1);
        System.out.println(eat);
    }
}


interface IPerson{

}

class Person implements IPerson{

}

class Student{
    public IPerson study(){
        return new Person();
    }

    public IPerson eat(){
        return new IPerson(){};
    }
}
复制代码

 

当方法的返回值类型是引用类型的时候,可以使用链式调用

//链式调用
IPerson p5 = p1.eat().run().sleep();

复制代码
interface IPerson{
    IPerson sleep();
    IPerson run();
    IPerson eat();
}

class Person implements IPerson{

    @Override
    public IPerson sleep() {
        return this;
    }

    @Override
    public IPerson run() {
        return this;
    }

    @Override
    public IPerson eat() {
        return this;
    }
}
复制代码

内部类

概念:

   将类定义在类的内部,就是内部类

 

 内部类不能被外界直接实例化,还有(抽象类,接口,所有构造方法,被private修饰的类型 )

 

 

为什么要使用内部类

提高类的安全性

内部类的特点

>内部类可以直接访问外部类的所有的成员(变量和方法)

>外部类如果要访问内部类成员,必须创建内部类对象来实现

>内部类编译后的class文件命名有别于普通类:外部类$,内部类.classOu$Inner.class

>访问内部类的成员是非常麻烦的,而且造成程序耦合性增强,可读性降低,所以内部类慎用

 

 

 

 

posted @   魔光领域  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示