多态
同一个对象 体现出来的多种不同形态(身份) 将一种行为表现出不同的效果要想实现多态的效果 需要现有继承关系
体现:
- 父类类型的引用 指向 子类的对象 Person p = new Teacher();
- 该引用只能调用父类中定义的属性或方法
- 如果子类中将父类的方法重写,那么调取方法后执行的结果是子类重写之后的那个结果
如果父类与子类有同名的属性 执行父类的属性
如果父类与子类有同名的方法(重载) 执行子类重写之后的方法 - 若想要调用子类中独有的成员 (强制类型转化) 造型 铸型 (向上/向下转型)
- 造型时(强制向下转型时) 可能会出现一个运行时异常
ClassCastException 造型 铸型 异常
如果想要避免造型的异常 可以用instanceof关键字来进行判断
对象 instanceof 类
//1.创建对象
Person p = new Teacher();//自动向上转型 Teacher--->Person
p.eat();
p.sleep();
p.talk();
//如果想要调用子类独有的属性或方法
//需要将类型还原会真实类型 强制类型转化 造型 向上转型 向下转型
Teacher t = (Teacher)p;
t.eat();
t.sleep();
t.talk();
t.teach();
内部类
指的是在Java中可以将一个类定义在另一个类的内部
内部类可以定义在 类的内部 (与类成员层次一致)
内部类可以定义在 方法/块内部 (与类成员相差一个层次 方法的局部变量一个层次)
- 成员内部类
将一个类直接定义在类的里面,作为成员,与属性或方法层次一致
成员内部类可以与正常类一样 使用不同的修饰符来修饰
好处1.省略了一个.java文件 好处2.成员内部类中可以访问外部类的所有成员 包括 私有的
若想要在内部类中通过对象.调用外部类成员 外部类.this.外部类成员;
内部类存在后 源代码进行编译 产生一个字节码 Demo$InnerDemo.class - 局部内部类
将一个类定义在方法/块里面,作为成员的内部结构,与临时的局部变量一个层次
局部内部类像是一个局部的变量一样,不能用public protected private及static
只能用abstract或final
局部内部类命名规则Demo$1InnerTestMethod Demo$2InnerTestMethod
局部内部类使用的变量只能是final修饰 - 匿名内部类
成员匿名内部类
局部匿名内部类
public interfase Test{
public void test();
}
Test t = new Test(){
public void test(){
}
};
通常接口或抽象类的具体子类这样写
开发中为了省略一个类文件 上述写法比较常见
匿名内部类很特殊 只有类体 没有类的所有结构( 修饰符 名字 继承 实现)
不能用任何修饰符来修饰 匿名内部类也没有构造方法
Swing 做一个按钮 绑定一个事件监听器 - 静态内部类
成员静态内部类
不需要外部类对象,通过正常的方式直接创建内部类
静态元素不能访问非静态成员(自己类和外部类)
public class Demo {
private String name = "这是正常类中的属性";
public void testDemo(){
System.out.println("这是正常类中的方法");
}
public void testDemoOne(){
String s = "";
//定义一个局部内部类
class InnerTestMethod{
//局部内部类中使用的局部变量都需要加final修饰
}
}
public void testDemoTwo(){
String s;
//定义一个局部内部类
class InnerTestMethod{
}
}
//成员内部类
public class InnerDemo{
private String name="我是内部类的属性";
public void testInnerDemo(){
System.out.println("我是成员内部类的方法:"+this.name);
Demo.this.testDemo();
}
}
//匿名内部类(主要是针对那些不能直接创建对象的抽象类和接口而来的)
Person p=new Person(){
public void eat(){
System.out.println("匿名");
}
};
//静态内部类
private static class InnerDemoStatic{
}
}