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
浙公网安备 33010602011771号