其他分享
首页 > 其他分享> > 多态的应用和内部类讲解

多态的应用和内部类讲解

作者:互联网

多态的应用

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

 

多态的实现方法:

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

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

 

 

继承多态:当这个作为参数的父类是普通类或者抽象类时

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

 

多态作为行参

 1、普通类

 当一个行参希望我们传递的是一个普通类时,我们实际传递的是该类的对象/匿名对象

public class OOPDemo01 {
    public static void main(String[] args) {
        Student student = new Student();
        Person person = new Person();
        person.run(student);
        System.out.println("=====");
        person.run(new Student());
    }
}
class Student{
    public void study(){
        System.out.println("学习");
    }
}
class Person{
    public void run(Student s){
        s.study();
        System.out.println("run");
    }
}

 2、抽象类

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

package com.example.ObjectOriented.Interface1.pp9;

public class OOPDemo01 {
    public static void main(String[] args) {
        //多态的体现
        AbsStudent student = new Student();
        Person person = new Person();
        person.run(student);
        System.out.println("======");
        person.run(new Student());
        System.out.println("=======");
        AbsStudent absStudent = new AbsStudent(){
            @Override
            public void study() {
                System.out.println("xxxxxxxx");
            }
        };
        person.run(absStudent);
        System.out.println("=======");
        //匿名内部类
        person.run(new AbsStudent(){
            @Override
            public void study() {
                System.out.println("xxxxxxxx");
            }
        });
    }
}
abstract class AbsStudent{
    public abstract void study();
}
class Student extends AbsStudent{

    @Override
    public void study() {
        System.out.println("学习");
    }
}
class Person{
    public void run(AbsStudent s){
        s.study();
        System.out.println("run");
    }
}

 

 3、接口

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

public class OOPDemo01 {
    public static void main(String[] args) {
        //多态的体现
        IStudent student = new Student();
        Person person = new Person();
        person.run(student);
        System.out.println("======");
        person.run(new Student());
        System.out.println("=======");
        IStudent absStudent = new IStudent(){
            @Override
            public void study() {
                System.out.println("xxxxxxxx");
            }
        };
        person.run(absStudent);
        System.out.println("=======");
        //匿名内部类
        person.run(new IStudent(){
            @Override
            public void study() {
                System.out.println("xxxxxxxx");
            }
        });
    }
}
class Student implements IStudent{
    public void study(){
        System.out.println("学习");
    };
}
interface IStudent{
    void study();
}
class Person{
    public void run(IStudent s){
        s.study();
        System.out.println("run");
    }
}

 

多态作为返回值

1、普通类

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

public class OOPDemo02 {
    public static void main(String[] args) {
        Studnet studnet = new Studnet();
        Person study = studnet.study();
        System.out.println(study);
        Person eat = studnet.eat();
        System.out.println(eat);
    }
}
class Person{

}
class Studnet{
    public Person study(){
        return new Person();
    }
    public Person eat(){
        Person person = new Person();
        return person;
    }
}

 

2、抽象类

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

package com.example.ObjectOriented.Interface1.ppp9;

public class OOPDemo02 {
    public static void main(String[] args) {
        Studnet studnet = new Studnet();
        AbsPerson study = studnet.study();
        //子类的接收,父类的返回,那么就需要强制类型转换
        Person study1 = (Person) studnet.study();

        System.out.println(study);
        AbsPerson eat = studnet.eat();
        if (eat instanceof Person){
            Person p4 = (Person) eat;
        }
        System.out.println(eat);
    }
}
abstract class AbsPerson{

}
class Person extends AbsPerson{

}
class Studnet{
    public AbsPerson study(){
        return new Person();
    }
    public AbsPerson eat(){
//        Person person = new Person();
        return new AbsPerson(){};
    }
}

 

3、接口

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

同样的如果我们使用实现类来接收的,那么同样有可能出现异常的问题,也就是强制类型转换的异常

package com.example.ObjectOriented.Interface1.ppp9;

public class OOPDemo02 {
    public static void main(String[] args) {
        Studnet studnet = new Studnet();
        IPerson study = studnet.study();
        IPerson eat = studnet.eat();
        //子类的接收,父类的返回,那么就需要强制类型转换
        IPerson study1 = (Person) studnet.study();
        if (eat instanceof Person){
            Person p4 = (Person) eat;
        }
        System.out.println(study);
        System.out.println(eat);
    }
}
interface IPerson{

}
class Person implements IPerson{

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

 

 

内部类讲解

相关概念

将类定义在类的内部,那么该类就称为内类

注意:内部类是一个相对的概念,如果Qutter类中有一个类Inner类,那么Otter类相对于Inner类来说就外部类,而inner相对于Outter来说就是内部类

内部类不能让外界进行实例化

 

特点:

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

2、外部类如果要内部类成员,必须创建内部类对象来实现

3、内部类编译后的class文件命名有别于普通类:外部类$内部类.class

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

 

内部类分为:成员内部类、局部内部类、静态内部类、匿名内部类

 

标签:study,多态,System,Person,应用,讲解,println,public,out
来源: https://www.cnblogs.com/xjw12345/p/16390545.html