多态概述
1. 多态的字面意思就是有多种形态。就是说同一行为会有多种不同表现形式。当一个类引用不同的对象时就会有多种的表现形式。
2. 多态存在的前提条件:多态的存在必须要有继承,也就是说需要父类和子类的存在。
多态的实现
多态的实现依赖与向上造型,向上造型指的是一个父类型引用指向子类型对象的过程。
向上造型的格式如下:
父类型 变量名 = new 子类型对象();
接口类型 变量名 = new 实现类对象();
Animal a=new Cat();
Animal b=new Dog();
除了向上造型以外还有向下造型,也就是强制转换类型。
Cat c = (Cat) a;
Dog d = (Dog) b;
列子
父类:
package test;
public class Father {
int age = 40;
void getAge() {
System.out.println(age);
}
void getScore() {
}
}
子类1:
package test;
public class Son extends Father {
int age = 20;
int score = 90;
int c=22;
@Override
void getAge() {
System.out.println(age);
}
@Override
void getScore() {
System.out.println(score);
}
void aaa() {
System.out.println("111");
}
}
子类2:
package test;
public class Dao extends Father {
int age = 13;
int score = 88;
@Override
void getAge() {
System.out.println(age);
}
void getScore() {
System.out.println(score);
}
}
主方法:
package test;
public class Main {
public static void main(String[] args) {
Father a = new Son();
System.out.println(a.age);//输出父类age
a.getAge();
a.getScore();
Father b = new Dao();
b.getAge();
b.getScore();
Son s = (Son) a;//调用子类自己的方法
s.aaa();
System.out.println(s.age);
// Son l=new Son();
// l.aaa();
// System.out.println(l.c);
// System.out.println(l.age);
}
}
注意事项: 主方法中的**System.out.println(a.age);**输出的是父类中的age。我们通过向上造型定义的a在调用变量时会调用Father中的值,而通过a调用方法是会优先调用子类中重写的方法。
如果在子类中定义了自己的方法则可以通过向下造型来实现,向下造型和注释行中实现效果是一致的,用向下造型可以实现多态。
内部类简介
内部类顾名思义就是类中的类,我们可以在类中再写一个类。
内部类分类: 1.成员内部类2.静态内部类3.局部内部类
成员内部类
public class Outer{
// ...
public class Inner{
//....
}
}
使用:
内部类中, 可以随意使用外部类成员
外部类中, 使用内部类成员时需要创建内部类对象
无关类中, 使用内部类成员
1.间接调用, 在外部类方法中调用内部类方法
main方法中, 调用外部类方法
2.直接调用, 需要创建内部类对象
外部类.内部类 a = new 外部类().new 内部类();
内部类和外部类有同名成员变量
外部类的成员变量: 外部类.this.变量
内部类的成员变量: this.变量
静态内部类
静态内部类和成员内部类差不多,用了静态修饰符。
局部内部类
局部内部类需要在方法中定义,并只在方法中有效。在局部内部类中, 使用局部变量, 必须是final的。局部内部类是一次性的类, 只能用一次。不能使用权限修饰符