多态的总结

多态:

一种事物的多种形态|多种表现形式

行为的多态

一个行为的不同的实现方式

多态的前提:

类的继承|接口的实现

多态的最终体现:

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

注意:如果多态想要有意义,需要配合方法的重写,多态才有意义

多态调用:

会调用子类中重写的方法

多态的实现效果:

配合方法的重写,当父类引用指向不同的子类对象,同一个方法具有不同的实现方式-->行为多态

public class Class001_Polymorphic {
    public static void main(String[] args) {
        //对应类型的数据赋值给对应类型的变量
        int i = 1;
        Person p = new Person();
        Student s = new Student();
        //多态的最终体现
        Person person = new Teacher();
        person.test();
    }
}
//定义父类
class Person{
    void test(){
        System.out.println("Person");
    }
}
//子类
class Student extends Person{
    void test(){
        System.out.println("Student");
    }
}
//子类
class Teacher extends Person{
    void test(){
        System.out.println("Teacher");
    }
}

多态调用成员的特点:

父类引用调用

成员变量:

编译运行看父类|左边|类型

成员方法:

编译看父类|左边|类型

运行看子类|右边|对象

注意:

多态是行为的多态

多态如果不配合方法的重写没有意义

父类引用对子类新增内容不可见

类型转换:

基本数据类型:类型转换

//先定义变量
int i = 1;
byte b;
//自动类型提升
long l = i;
//强制类型转化
b = (byte)i;

引用数据类型:转型

类型的大小:看继承关系|实现关系

父类 > 子类

//向上转型:自动类型提升
    Person p = new Student();//--> 多态
//向下转型:强制类型转换
    Student s = (Student)p;
//可通过 s 引用调用Student类型所有的内容

注意:

运行过程中可能出现ClassCastException 类型转换异常

引用强转类型的时候,没有转为指向的子类对象类型,转为其他子类类型,出线的异常。

预防出现类型转换类型异常:

引用instanceof类型:判断前面的引用是否指向后面类型的对象或者后面类型子类的对象,是->true 不是->false

抽象的:

抽象类:被abstract修饰的类

抽象方法:被abstract修饰的方法

没有方法体

存在与抽象类中

特点:

1、抽象类不能实例化

2、抽象类可以定义任意内容(属性,功能(抽象的方法,具体的方法))

3、抽象方法必须要求被重写

4、抽象类使用:通过具体子类对象使用

具体子类:重写所有的抽象方法 + 按需新增

抽象子类:按需重写抽象方法 + 按需新增

5、一个抽象方法一旦被重写,可以不再被重写,根据需求决定

6、abstract 不能与 private , final , static , native 一起使用

7、抽象类可以实现多态

public class Class001_Abstract {
    public static void main(String[] args) {
        //Develop d = new Develop();
        //具体子类对象
        Develop java = new Java();
        java.work();
        java.sleep();
        //java.mr();
    }
}
//父类
abstract class Develop {
    //方法体: 不知道怎么写,不知道写什么
    public abstract void work();
    //具体方法
    public void sleep(){
        System.out.println("胡吃海喝!!!!");
    }
}
//子类
class Java  extends Develop{
    @Override
    public void work() {
        System.out.println("服务器端开发");
    }
    //新增功能
    public void mr(){
        System.out.println("与测试,产品,谈论...探讨...");
    }
}
//抽象子类
abstract class Web extends Develop{
    //public abstract void work();
    public void haha(){
        System.out.println("每天哈哈傻笑...");
    }
}

接口:

接口可以理解为是一个特殊的抽象类

功能的集合

引用数据类型

接口可以帮助定义规范

解耦--> 降低耦合度

类是单继承 , 接口多实现

定义:

insterface 定义接口

组成:

jdk7及之前:

公共的静态的常量

public static final --> 修饰符可以任意省略

公共的抽象的方法

public abstract --> 修饰符可以任意省略

使用:

1、接口不能实例化

2、接口需要通过实现类的对象使用

3、父类需要通过子类继承 extends --> 父类的成员,子类继承父类有权可以直接使用

接口需要通过实现类去实现 implements --> 因为接口中几乎都是抽象方法没有方法体,需要实现类自己实现方法体,所有就叫做实现

接口的实现与类的继承很想,都拥有了父类的成员使用权,或者拥有接口中定义的功能,但是一个侧重点再拿过来就用,一个侧重点在拿过来要实现才能用

4、接口的使用:

具体的实现类:重写所有的重写方法 + 按需新增

抽象的实现类:按需重写 + 按需新增

5、接口可以多实现,类只能单继承

6、如果一个类同时继承父类实现接口,要求先继承后实现

public class Class001_Interface {
    public static void main(String[] args) {
        System.out.println(MyInterface.PI);
        //根据具体的实现类的对象使用
        MyImpl my = new MyImpl();
        my.test1();
        my.test1();
        my.haha();
    }
}
//接口
interface MyInterface{
    //公共的静态的常量
    double PI = 3.14;
    //公共的抽象的方法
    public abstract void test1();
    void test2();
}
interface A{
    void a();
}
interface B{
    void b();
}
//具体实现类
class MyImpl  extends Object implements MyInterface,A,B {
    @Override
    public void test1() {
    }
    @Override
    public void test2() {
    }
    //新增内容
    public void haha(){}
    @Override
    public void a() {
​
    }
    @Override
    public void b() {
    }
}
//抽象实现类
abstract class MyImpl2 implements MyInterface{
    @Override
    public void test1() {
​
    }
}

jdk8之后:新增

1、静态方法:可以定义方法体

使用:通过接口名使用

2、默认方法:可以定义方法体

显示的被default修饰

使用:通过实现类对象使用

public class Class003_Inteface {
    public static void main(String[] args) {
        Swim.test();
        //实现类对象
        new SwimImpl().test2();
    }
}
interface Swim{
    void swimming();
    //静态方法
    public static void test(){
        System.out.println("静态方法");
    }
    //默认方法
    public default void test2(){
        System.out.println("默认方法");
    }
}
class SwimImpl implements Swim{
    @Override
    public void swimming() {
​
    }
}

注意:

1、父类与接口无法完全相互代替,如果可以建议使用接口,因为接口可以多实现非常灵活

2、类与类之间只能继承

类与接口之间,只能是类继承接口

类与类之间之只能单继承

类与接口之间可以多实现

接口与接口之间,可以多继承

3、接口可以实现多态,接口引用指向实现类对象

public class Class002_Interface {
    public static void main(String[] args) {
        testSmoke(new Teacher());
    }
    /**
     * 会继续吸烟的人
     * @param s Smoke接口的实现类对象
     */
    public static void testSmoke(Smoke s){  //Smoke s = new Teacher();  接口多态
        s.smoking();
    }
}
//父类
class Person{
    public String name;
    public int age;
​
    public void sleep(){
        System.out.println("闭上眼睛休息");
    }
}
//接口  吸烟
interface Smoke{
    void smoking();
}
//喝酒
interface Drink{
    void drinking();
}
interface Code{
    void code();
}
//总和接口 : 吸烟 喝酒 打牌...
interface Amusement extends Smoke,Drink{}
//子类
class Teacher extends Person implements Smoke,Code,Drink{
    public String subject; //学科
​
    public void teach(){
        System.out.println("教书育人");
    }
    @Override
    public void smoking() {
        System.out.println("标准的吸烟方法");
    }
    @Override
    public void code() {
​
    }
    @Override
    public void drinking() {
    }
}
class Student extends Person implements Code{
​
    @Override
    public void code() {
    }
}
//社会人
class SocialMan extends Person implements Amusement{
    @Override
    public void smoking() {
        System.out.println("社会人吸社会烟...");
    }
    @Override
    public void drinking() {
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值