多态:意味着允许不同类的对象对同一消息做出不同的响应
多态大多指的是允许时多态
必要条件:满足继承关系,父类引用指向子类对象
会产生不同的方法,都是一个方法,实例类型不同,不一样方法
2和3被称为向上转型 隐式转型 自动转型——父类引用指向子类实例
我们可以调用自己重写的,可以调用父类的派生方法
不过无法调用自己的特有方法
向下转型:
强制类型转换
子类引用指向分类对象,此处必须进行强转
可以调用子类特有方法
这个类型不能成功执行
必须满足转换条件
instanceof判断是否满足特定类型
返回布尔值
父类含有static方法不允许子类重写
向上转型之后只能调用到父类原有的静态方法
这段代码有问题,但是。。。不符常理
这样就可以了
可以向上转型,指向子类实例
当父类只是知道子类应该包含怎样方法,但无法确切知道这些子类如何实现这些方法就要用抽象类
抽象方法:
不能有方法体,同时子类必须实现
子类不想重写必须定义为抽象类
static final private不能和抽象并存,想想也知道
接口 interface
接口在类中得实现
接口推荐I大头
通常设置为public或者默认访问权限,默认public
接口中抽象方法可以不写abstract
不想实现必须设置抽象类
接口可以包含常量
默认public static final
接口的常量用接口访问是接口的值
用使用接口的类来访问是 那个类的值
默认方法:
default
可以带方法体
还有静态方法 static
不过无法实例调用静态
我们得用接口名调用静态
jdk1.8后使用 默认 和 静态
子类重写默认方法
默认是public访问权限
但是default关键字在重写方法就没了
调用了接口默认方法
多个接口
用,逗号分开
多接口可能 默认方法相同 出错
可以重写那个相同的方法
如果已经继承父类,默认调用父类的同名方法
接口继承:
接口可以继承,并且可以继承多个父接口
两个父接口同时存在同名默认方法
必须重写
内部类:
内部类信息需要靠外部类访问
内部类隐藏在外部类之内,更好的实现了信息隐藏
分类一下四种
成员内部类:最常见的内部类,也称普通内部类
获取内部类实例对象
1 new 外部类 再new 内部类
2. 外部类对象来new内部类
3.通过外部类获取方法
在外部类通常或设置内部类获取方法
内部类必须借助外部信息
内部类访问修饰符可以任意,但是访问范围受到影响
内部类可以直接使用外部类成员信息
另外内部类和外部类重名,优先内部类
如果要访问外部类
父类.this.属性
外部类使用内部类成员必须使用内部类实例
否则无法直接访问
内部类编译后是 外部类$内部类.class
静态内部类:
static修饰的内部类
静态内部类可以不依赖于外部类对象直接创建
静态内部类智能调用外部类静态方法
不然必须new
访问外部成员必须
new
静态内部类对象实例时,可以不依赖于外部类对象
可以通过外部类.内部类.静态成员的方式,访问内部类的静态成员
外部类和内部类同名,默认访问内部类
访问外部类静态属性则通过 外部类.属性
非静态属性,就要new
方法内部类:
定义在外部类中的内部类,也称局部内部类
只能在方法里使用,
方法内不能定义静态成员,
不能public和privat和protected修饰
方法内部类对象无法直接获取
只有通过调用getHeart方法产生Heart对象
不过无法访问内部的方法,因为是方法里的成员 过了这个方法就没了
所以很少返回对象,而调用里面的方法
不过可以包含final ,abstract
匿名内部类
有时候对某个类实例只用一次,这个类对整个程序而言可有可无
类的定义和创建放到一起完成
内存损耗,系统影响小
不过只能使用一次
推荐只用到一次,类定以后马上用到,给类命名不会导致代码更容易被理解的情况
编译后 类名$1.class 类名$2.class
而且匿名内部类无法添加访问修饰符的
private public abstract static protected无法修饰
无法编写构造方法,因为没名字
不过可以构造代码块
但是这种基本不用的
不能出现静态成员的
可以实现接口 可以继承父类 但是不可兼得