多态
1概述
在不同的个体上会表现出不同的状态,即同一个行为,不同的实现,就是多态。
2多态的定义
多态是面向对象的三大特征之一,也是最重要的特点,多态主要在Java中体现在两个方面:
1行为的多态(重载,重写 ---静态绑定)
2属性的多态(父类引用指向子类对象----动态绑定)
3多态的好处
提高代码的重用性
降低代码耦合度
提高程序的扩展性
4构成多态的必要条件
必须存在继承或者实现关系
父类的引用指向子类对象
必须有方法的重写
5数据类型转型
向上转型: 隐式转换(子类转为父类型)直接转
Pet cat = new Cat();
Pet pet = new Pet();
Pet p = cat; //子类向上转型
向下转型:显示转换 (父类型转为子类型)手动转
Pet cat = new Cat();
Pet pet = new Pet();
Pet p = cat;
Cat c = (Cat)pet; //父类型手动转为子类型
只能发生在继承关系中
子类之间不能互相转换的(编译无法通过)
内部类
在类的内部声明一个类,嵌套类,内属类;当一个类b只为另一个类a服务,其它类不可能再用到b时,就没必要再创建一个单独的类,因此可以将类b存放在类a中,减少不必要的文件创建,Java中的内部类包含以下四种:
成员内部类
局部内部类
静态内部类
匿名内部类
成员内部类
定义成员内部类
public class Demo01 {
private int a; //属性、成员变量、全局变量
{
//游离块,代码块
}
public void m1(){ //行为、方法、成员方法
System.out.println("这是类的成员方法");
}
//成员内部类
class Inner{
private int b;
public void m2(){
System.out.println("这是成员内部类的一个方法");
}
}
}
访问成员内部类的资源
public class Test {
public static void main(String[] args) {
Demo01 demo01 = new Demo01(); //创建外部类的对象
Demo01.Inner inner = demo01.new Inner(); //通过外部类创建的对象再创建内部类对象
inner.m2();
}
}
注意:
1成员内部类和成员方法,成员变量同一个级别
2创建内部类需要外部类对象完成
3内部类可以直接访问外部类的资源
4大部分时候内部类是私有的
局部内部类
局部内部类类似于局部变量,一般在一个方法中或一个语句块中出现,作用范围只作用于当前的声明区域,若某一个类,只为某个语句块或某个方法提供服务,就不必要声明全局类,更没有必要创建单独的java文件,因此,只需要在该方法内部去声明这个类
public class Demo02 {
int c = 50;
public void m1(){ //成员方法
int i = 10; //局部变量
class TestInner{ //局部内部类
int a = 20;
public void m2(){
c = 90;
//i = 100 局部变量的值不可修改
System.out.println(i);
System.out.println(c);
System.out.println("这是局部内部类的方法");
}
}
TestInner testInner = new TestInner(); //实例化局部内部类
testInner.m2(); //调用局部内部类中的方法
testInner.a = 10; //调用局部内部类方法
System.out.println(testInner.a);
}
}
注意:
1局部内部类,不能使用权限修饰符
2只能在方法中访问
3局部内部类可以使用全局变量,修改全局变量,但是它所属的方法的局部变量是只读的,默认添加final关键字
4.局部内部类想要调用外部类的变量,则需要使用 外部类名.this.变量名
静态内部类
定义
public class Demo03 {
void m1(){
System.out.println("普通成员方法");
}
static class Inner{ //定义一个静态内部类
void m2(){
System.out.println("这是静态内部类的方法");
}
}
}
使用
Demo03.Inner inner03 = new Demo03.Inner(); //静态内部类创建对象
inner03.m2();
匿名内部类
它是一个没有名字的类,大多数时候,匿名内部类针对抽象类和接口来使用
对普通类创建匿名内部类
Demo04 demo04 = new Demo04(){ //匿名内部类的创建
public void m1(){
System.out.println("这是匿名内部类的m1方法!");
}
};
对接口创建匿名内部类
Demo05 demo05 = new Demo05() {
@Override
public void m1() {
System.out.println("内部类重写了接口中的方法");
}
};
注意:
1匿名内部类就是一个没有名字的类
2创建匿名内部类时就是在创建匿名内部类对象
3匿名内部类没有构造器,如果要使用构造器功能,可以使用代码块实现构造器功能