多态
什么是多态?
同类型的对象,表现出的不同形态。
多态的表现形式
父类类型对象名称=子类对象;
多态的前提
- 有继承关系
- 有父类引用指向子类对象
- 有方法的重写
多态的好处
使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
Demo:
父类Person:
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show(){
System.out.println(name + ". " + age + "岁");
}
}
子类,Student、Teacher、administrator
public class Student extends Person{
@Override
public void show(){
System.out.println("学生的信息为: " + getName() + ", " + getAge());
}
}
public class Teacher extends Person{
@Override
public void show(){
System.out.println("老师的信息为: " + getName() + ", " + getAge());
}
}
public class administrator extends Person{
@Override
public void show(){
System.out.println("管理员的信息为: " + getName() + ", " + getAge());
}
}
Test类:
public class Test {
public static void main(String[] args) {
//创建三个对象,并调用register方法
Student s = new Student();
s.setName("zhangsan");
s.setAge(18);
Teacher t = new Teacher();
t.setName("aTai");
s.setAge(38);
administrator a = new administrator();
a.setName("liumou");
a.setAge(30);
register(s);
register(t);
register(a);
}
//这个方法技能接收老师,又能接收学生,还能接收管理员
//只能把参数写成这三个类型的父类
public static void register(Person p){
p.show();
}
}
多态中成员的特点
- 变量调用:编译看左边,运行也看左边
- 方法调用:编译看左边,运行看右边
demo
package polymorphismDemo2;
public class Test {
public static void main(String[] args) {
//创建对象(多态方式)
//Fu f = new Zi();
Animal a = new Dog();
//调用成员变量:编译看左边
//编译看左边: javac 编译代码的时候,会看左边父类中有没有这个变量,如果有,编译成功,如果没有编译失败
//运行也看左边: java运行代码的时候,实际获取的就是左边父类中成员变量的值
System.out.println(a.name);
//调用成员方法:编译看左边.运行看右边
//编译看左边:javac编译代码的时候.会看左边的父类中有没有这个方法,如果有,编译成功.如果没有,编译失败.
//运行看右边:java运行代码的时候,实际上运行的是子类中的方法
a.show();
//理解:
//Animal a = new Dog();
//现在用a去调用变量和方法的呀? 是的
//而a 是Animal类型的,所以默认都会从Animal这个类中去找
//成员变量:在子类的对象中,会把父类的成员变量也继承下的.父: name 子: name
//成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的。
}
static class Animal{
String name = "动物";
public void show(){
System.out.println("Animal --- show方法");
}
}
static class Dog extends Animal{
String name = "狗";
public void show(){
System.out.println("Dog --- show方法");
}
}
static class Cat extends Animal{
String name = "猫";
public void show(){
System.out.println("Cat --- show方法");
}
}
}
多态的优势
-
在多态形式下,右边对象可以实现解耦合,便于扩展和维护
-
定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
多态的弊端
- 不能使用子类的特有方法
- 若要使用要进行数据类型转换
- 自动类型转换
- 强制类型转换
- 强制类型转换能解决什么问题?
- 可以转换成真正的子类类型,从而调用子类独有功能。
- 转换类型与真实对象类型不一致会报错
- 转换的时候用Instanceof关键字进行判断
包
什么是包?
- 包就是文件夹。用来管理各种不同功能的Java类,方便后期代码维护。
使用其它类的规则
-
使用同一个包中的类时,不需要导包。
-
使用java.lang包中的类时,不需要导包。
-
其他情况都需要导包
-
如果同时使用两个包中的同名类,需要用全类名。
final关键字
- 如果用final修饰方法:表明该方法是最终方法,不能被重写
- 如果用final修饰类:表明该类是最终类,不能被继承
- 如果用final修饰变量:叫估常量,只能被赋值一次
最后:欢迎大家关注我的公众号