Day9

Override:父类返回父类,那么子类可以返回子类。所以返回值类型是可以改变的。

final

final修饰类,除了这个类无法被继承外,和普通的类没有区别,可以继承父类。

final修饰方法,可以被继承,无法被重写。

final修饰variable:

  • 字面值常量:int =2; String ="";
  • 自定义常量:final修饰的变量

局部变量

  • final int a; 只能赋值一次,显式的赋值。
  • final在形参列表:同样表示传进方法体后变成了常量

成员变量

  • final修饰普通成员变量,创建对象后值就固定了,所以创建对象之前必须显式的进行赋值。可以显式的初始化,构造代码块、构造方法进行赋值。
  • final修饰静态成员变量:初始化以后就改变不了了。

引用数据类型

  • 一旦引用后,不能被赋值为别的对象。

多态

父类引用指向了不同的子类对象

多态的前提条件

  • 要有继承关系
  • 能够发生方法的重写。(排除static、final、private、protected、构造方法)
  • 父类的引用指向子类对象

成员变量是没有多态的,父类引用就是父类的成员变量,也就是说:编译看左边,运行看左边。

父类引用不能调用子类成员方法。可以再强制类型转换为子类,可以调用自己的成员方法,这样成员变量也是子类的了。

[引用类型变量] instanceof [类(接口)]

boolean result = obj instanceof Class

哺乳动物一定是动物,但动物不一定是哺乳动物,所以不能判定动物一定能转成哺乳动物,除非你一开始就知道它是哺乳动物。

当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。
总结一句话: 看右边new出来的对象是否是父亲,父亲无法转成儿子,儿子、孙子可以转换成父亲。
1.结合多态发生的条件,及继承相关知识,自己总结并验证下,哪些方法无法实现多态效果。

1.没有继承关系的

2.没有override(也包括final和static、private修饰的无法被重写)

3.访问权限不足的方法,包括private、部分protectd

4.父类中的构造方法

2.自己定义一个类,类中定义3个成员变量,这3个成员变量都被final修饰,
请用3种不同方式,为这3个被final修饰的成员变量赋值。

final修饰的成员变量在创建对象完成后就不能被修改了,所以可以通过以下几种方式赋值。

1.显式初始化

public class WorkTwo{
    final String name = "张三";
}

2.通过构造代码块赋值

public class WorkTwo{
    {
        name = "张三";
    }
    final String name;
}

3.通过构造方法

public class WorkTwo{
    final String name;
    public WorkTwo(String name){
        this.name = name;
    }
    //不能提供无参构造
}

3.实现如下多态案例,分别定义Person类,SouthPerson(表示南方人),NorthPerson(表示北方人)

Person
eat()

SouthPerson
eat()

NorthPerson
eat()

写代码实现,eat方法的多态效果

1:人要吃饭

2:南方人吃炒菜和米饭

3:北方人吃烩菜和馒头

1.Person类

package com.jiang.work.Day9.polymorph;

/**
 * ============================
 * 一定要注意命名规则
 * 一定要注意命名规则
 * 一定要注意命名规则
 * ============================
 * TODO
 *
 * @version 1.0
 * @Description: Person类
 * @author: https://github.com/cqpsjsl
 * @date: 2021/1/9 14:43
 */
public class Person {
    private String name;
    private int age;

    public void eat() {
        System.out.println("人要吃饭");
    }
}

2.SouthPerson类

package com.jiang.work.Day9.polymorph;

/**
 * ============================
 * 一定要注意命名规则
 * 一定要注意命名规则
 * 一定要注意命名规则
 * ============================
 * TODO
 *
 * @version 1.0
 * @Description: 南方人
 * @author: https://github.com/cqpsjsl
 * @date: 2021/1/9 14:44
 */
public class SouthPerson extends Person {
    @Override
    public void eat() {
        System.out.println("南方人吃炒菜和米饭!");
    }
}

3.NorthPerson类

package com.jiang.work.Day9.polymorph;

/**
 * ============================
 * 一定要注意命名规则
 * 一定要注意命名规则
 * 一定要注意命名规则
 * ============================
 * TODO
 *
 * @version 1.0
 * @Description: 表示北方人
 * @author: https://github.com/cqpsjsl
 * @date: 2021/1/9 14:45
 */
public class NorthPerson extends Person {
    @Override
    public void eat() {
        System.out.println("北方人吃烩菜和馒头!");
    }
}

4.Test类

package com.jiang.work.Day9;

import com.jiang.work.Day9.polymorph.NorthPerson;
import com.jiang.work.Day9.polymorph.Person;
import com.jiang.work.Day9.polymorph.SouthPerson;

/**
 * ============================
 * 一定要注意命名规则
 * 一定要注意命名规则
 * 一定要注意命名规则
 * ============================
 * TODO
 *
 * @version 1.0
 * @Description: 多态测试
 * @author: https://github.com/cqpsjsl
 * @date: 2021/1/9 14:32
 */
public class PolymorphTest {
    public static void main(String[] args) {
        // Person
        Person p = new Person();
        eat(p);

        // SouthPerson
         p = new SouthPerson();
        eat(p);
        //NorthPerson
        p = new NorthPerson();
        eat(p);
    }

    public static  void eat(Person p) {
        p.eat();
    }
}

运行结果:

人要吃饭
南方人吃炒菜和米饭!
北方人吃烩菜和馒头!

Process finished with exit code 0
posted @ 2021-01-09 16:19  多米_dmxq#top  阅读(189)  评论(0)    收藏  举报