一、多态
1.面向对象三大特征
j 封装、继承、多态(抽象)
2.定义:同一个动作,具有不同的表现形式
3.多态的前提
(1)必须有方法的继承或者实现关系
(2)必须有方法的重写
4.多态的体现
(1)文字体现:父类 对象=子类 对象
(2)代码表达Fu fu=new Zi();
举例子:
Animal 动物类 Dog 狗类 (假设Dog已经继承Animal,并且重写了某个方法)
Animal an1 = new Dog();
Animal 动物类 Cat 猫类 (假设Cat已经继承Animal,并且重写了某个方法)
Animal an2 = new Cat();
5.多态调用方法的特点
编译阶段看父类,运行阶段看子类(编译阶段加载父类构造函数开辟内存空间,子类才能调用父类的方法)
6.多态的好处
多态最大的好处就是提高了代码的灵活性
7.多态的弊端
使用多态智能调用子类和父类都有的方法,不能调用子类特有的方法
解决方法:
向下转型(当多态是一个子类A,向下转型是一个子类B是,会出现类型转换异常,此时可以用instanceof方法判断这个对象是否是我们指定类的对象)
二、内部类
1.概念
所谓内部类就是在类A中定义了一个类B,此时B为内部类,A为外部类。
例如
/**
* 人类,外部类
*/
public class Person {
int age;
String name;
//内部类
//a.成员内部类(心脏类)
class Heart{
int jumpCount; //心跳次数
public void jump(){
System.out.println("心脏砰砰跳~~");
//在成员内部类中可以无条件访问外部类的任何成员
System.out.println(age);
System.out.println(name);
show();
}
}
public void show(){
//b.局部内部类(了解)
class xxx{
}
}
}
成员内部类有两个点:
a.在成员内部类中可以无条件访问外部类的任何成员
b.在测试类中创建成员内部类对象,该怎么写呢???
public class TestDemo {
public static void main(String[] args) {
//1.创建外部类对象
Person p1 = new Person();
//2.创建内部类对象
//Java规定,想要创建内部类的对象,必须先创建外部类的对象
//然后通过外部类对象才能创建内部类对象
//格式:
// Person.Heart 对象名 = new Person().new Heart();
Person.Heart h = new Person().new Heart();
//可以写这么写
Person.Heart h1 = p1.new Heart();
}
}
2.内部类编译的字节码文件
内部类编译之后的字节码文件名: 外部类名$内部类名.class 比如我们案例中的Heart类,编译之后: Person$Heart.class
3.匿名内部类
匿
名内部类的格式:
父类名/接口名 对象名 = new 父类名/接口名(){
//重写父类或者接口中所有抽象方法
};
三、权限修饰符
四、代码块
1.定义
由一对大括号括起来的一句或者多句代码,称为一个代码块
2.构造代码块
构造方法代码块的格式:
public class 类名{
{
构造代码块的代码
}
}
构造代码块每次在调用构造方法创建对象之前执行
3.静态代码块
静态代码块的格式:
public class 类名{
static{
静态代码块
}
}
静态代码块随着类的加载而执行且执行一次,在构造方法之前执行