多态
1.意义
- 同一类型的引用指向不同的对象时,有不同的实现
- 同一对象被造型为不同类型时,有不同的功能
2.向上造型
- 父类型的引用指向子类的对象
- 能造型的类型有:父类型、实现的接口
- 能点(.)出来什么,看引用的类型
能点出来的东西少于或等于子类
3.强制类型转换成功的条件
- 引用所指向的对象,就是该类型
- 引用所指向的对象,实现了该接口
4.通过instanceof来判断引用是否是某种类型
- instanceof返回boolean结果
- 强转成功的条件就是它为true的条件
Aoo o1=new Boo();
Boo o2=(Boo)o1;
Inter o3=(Inter 1)o1;
Coo o4=(Coo)o1;
if(o1 instanceof Coo){
Coo o4=(Coo)o1;
}
interface Inter1{
}
class Aoo{
}
class Boo extends Aoo implements Inter1{
}
class Coo extends Aoo{
}
System.out.println(o1 instance Boo);
System.out.println(o1 instance Inter1);
System.out.println(o1 instance Coo);
内部类
1.成员内部类
- 类中套类,外面的叫外部类,里面的叫内部类
- 内部类通常只服务于外部类,对外不具备可见性
- 内部类通常咋在外部类中创建的
- 内部类中可以直接访问外部类的成员(包括私有的)
内部类中有个隐式的引用
class Test{
void show(){
Aoo o1=new Aoo();
Boo o2=new Boo();
}
}
class Aoo{
private int a;
void(){
Boo o=new Boo();
}
class Boo{
void test(){
System.out.println(a);
System.out.println(Aoo.this.a);
System.out.println(this.a);
}
}
}
2.匿名内部类
- 如果在一段程序中需要创建一个类的对象(通常这个类需要实现某个接口或者继承某个类),而且对象创建后,这个类的价值也就不存在了,这个类可以不用命名,称之为匿名内部类
- 在匿名内部类中访问外部的数据,该数据必须加final
- 内部类有独立的.class
package oo.day06;
public class NstInnerClassDemo {
public static void main(String[] args) {
IInter1 o = new IInter1(){
};
int num=5;
IInter2 o2 = new IInter2(){
public void show(){
System.out.println("HiHiHi");
System.out.println(num);
}
};
o2.show();
}
}
interface IInter1{
}
interface IInter2{
void show();
}
3.局部内部类
- 局部内部类也叫方法内部类,就是定义在某个局部范围中的类,它和局部变量一样,都是在方法中定义的,其有效范围只限于方法 内部
- 在局部内部类中,局部内部类可以访问外部类的所有成员变量和方法,而局部内部类中的变量和方法却只能在创建该局部类的方法中进行访问
class Outer{
int m=0;
void test1(){
System.out.println("外部类成员方法");
}
void test2(){
class Inner{
int n=1;
void show(){
System.out.println("外部类变量m="+m);
test1();
}
}
Inner inner = new Inner();
System.out.println("局部内部类变量n="+inner.n);
}
}
public class Test{
public static void main (String [] args){
Outer outer=new Outer();
outer.test2();
}
}
4.静态内部类
- 所谓静态内部类,就是使用static关键字修饰的成员内部类。与成员内部类相比,在形式上,静态内部类只是在内部类前增加了static关键字,但在功能上,静态内部类中只能访问外部类的静态成员,同时通过外部类访问静态内部类成员时,可以跳过外部类从而直接通过内部类访问静态内部类成员
- 创建静态内部类对象的基本语法格式如下:
外部类名.静态内部类名 变量名=new 外部类名.静态内部类名
class Outer {
static int m=0;
static class Inner {
void show(){
System.out.println("外部类静态变量 m="+m);
}
}
}
public class Test{
public static void main (String [] args){
Outer.Inner inner=new Outer.Inner();
inner.show();
}
}