面向对象多态概念
事物存在多种形态
多态的前提:1、要有继承关系 2、方法重写 3、父类引用指向子类对象
多态成员访问的特点:
成员变量:
编译看左边(父类),运行看左边(父类)
注意:当创建子类对象的时候,子类对象是可以访问父类成员的,这块区域就是所说的super,同时还包括指向自身的指针this
父类只能访问到父类区域变量值、
成员方法:
编译看左边(父类),运行看右边(子类)
编译时看父类是否存在该方法,而运行时看子类是否有该方法而通过,真正进栈的是子类的print方法
静态方法
编译看左边(父类),运行看左边(父类)
静态和类相关,算不上重写,因此访问仍然看左边
父类引用指向子类对象 ,父类调用子类独有的方法编译出错,因此需要向上转型或者向下转型
当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
基本数据类型自动类型提升(小变大)和强制转换(大变小);
引用数据类型 :父类引用指向子类对象就向上转型
子类引用指向父类对象是向下转型
多态的好处:1、提高了代码的维护性(继承保证) 父类更新方法,子类会继承下来使用
2、提高了代码拓展性(多态保证)
多态的弊端:不能使用子类特有的属性和行为
开发室很少在创建对象时候用父类引用指向子类对象,而创建子类对象更方便,可以使用子类中特有属性
当做参数时候使用多态最好,可扩展性高,当使用子类方法时候,使用强制转换(向上转换),促使父类转换成子类
这里容易出现类型转换异常ClassCastException,因此使用关键词instanseof
instanseof 判断前边的引用是否是后面的数据类型
if(对象 instanseof 类){
执行操作
}
注意,如果子类方法没有,而父类方法有,并且该方法中调用了相同的方法,考虑思路为:父类继承给子类方法,子类方法调用本类中的同名方法
一定要调用子类方法
多态 https://www.cnblogs.com/chenssy/p/3372798.html
当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
------------------------------------------------------------------------------------------
抽象类特点
使用abstract修饰
abstract 类名()
public abstract void 方法名();
注意 抽象类不允许被实例化,因为抽象方法调用没有意义
注意抽象类的子类,要么是抽象类,要么重写抽象类的所有方法
------------------------------------------------------------------------------------------
接口interface:其中全部都必须是抽象方法 实现接口用关键字 implements
接口中的成员特点:
只能是常量,并且必须是静态公共的;public staic final xxx = 1.0;其是默认修饰符
接口中没有构造方法,成员方法只能是抽象方法,实现接口中的方法必须使用的是public修饰符
------------------------------------------------------------------------------------------
package 关键字 将字节码文件(.class)分类存放
import 关键字 写在package下面,在开发中要尽量导入具体类而非某一个包
package语句在一个java文件中只能有一个,若没有package,默认表示无包名
权限修饰符 本类 同一包下 (子类和无关类) 不同包下(子类) 不同包下(无关类)
private Y
默认修饰符 Y Y
protected Y Y Y
public Y Y Y Y
成员方法有权限修饰符号,状态修饰符final static,抽象修饰符abstract
类只有public 和默认修饰符两种 状态修饰符 abstract
内部类:
内部类访问特点:
1、内部类可以直接访问外部类成员(变量和方法),包括私有的
2、外部类要访问内部类对象,必须要创建对象
3、外部类名.内部类目 对象名 = 外部类对象.内部类对象;
创建内部类对象 Outer.Inner oi = new Outer().new Inner();
-------------------------------------------------------------------------------------------
成员内部类的私有使用,是不能直接调用的,需要在方法中本类创建内部类对象
静态成员内部类,当做静态方法,可以直接类名调用,注意静态内部类中的静态变量和静态方法可以用类名直接调用,而非静态方法需要创建对象来实现
静态内部类如果要访问外部的成员变量或者成员方法,那么必须是静态的。
会生成两个.class文件,一个是外部的类Outer.class , 另一个是 Outer$Inner.class
内部类方法获取获取外部类引用就是 外部类.this.成员
--------------------------------------------------------------------------------------------
局部内部类==局部变量 只能在方法中访问到
局部变量 无法再局部内部类中访问,除非局部变量声明为常量类型final ,防止变量被释放,而将其放入常量池,方便其余的进行使用
--------------------------------------------------------------------------------------------
匿名内部类:内部类的简化写法(一个继承了该类或者实现了该接口的子类匿名对象)
new 类名或者接口名{
是一个继承了该类或者实现了该接口的子类匿名对象
}.调用方法();
想用实例化接口 就是用new 接口名(){实现}
注意:抽象不能够和静态、私有、final共有