1、多态性
1、什么是多态性?
* (1)同一个动作,对于不同的对象,产生不同的行为
* (2)多态指的时一个对象的多种形态(比如一只狗,它有狗的形态、同时也有动物的形态)
2、多态的体现方式
* (1)、使用继承:不同的子类重写父类的方法后,体现出来的形式不一样
* (2)接口的实现
3、形成多态的必要条件
* (1)继承
* (2)接口实现:定义一个类实现对应的接口类
* (3)重写:子类重写父类的方法
* (4)重载:调用相同的方法名,实现的功能不一样。
* (5)子类对象的多态性(重点):
4、程序分为两种状态,一个是编译状态,一个是运行状态
* 对于多态来说,编译时看左边(左边对象的属性和方法),运行时看右边(左边对象的属性和方法)
5、上转型和下转型
* (1)上转型:将子类对象交给父类引用,可以自动转换
* (2)下转型:把父类转成子类 强制类型转换
6、对象的多态性
* (1).父类的引用指向子类的实例
* (2).在编译期间调用父类的方法,真正执行的时候,执行的是子类的方法
* (3).编译看左边,运行看右边
//子类对象的多态性:父类的引用指向子类的实例
Pet pet=new Dog("旺财","二哈");//安全性更高
pet.eat();//Dog类中的eat()
pet.Info();
//在编译期间,程序会把pet对象看成父类对象,而父类对象没有sleep方法
// pet.sleep(); 不可以 因为sleep方法是Dog类独有的方法
//现在我就想通过pet去调用sleep方法,怎么办呢?强制类型转换
Dog dog1=(Dog)pet;
dog1.sleep();
//pet前面已经转成了dog,现在相当于dog转换成penguin,所以自然是不可以的(j经常会忘记已经转换了,从而出现错误)
// Penguin pe1=(Penguin)pet;
// pe1.swimming();
//解决方法是:
if(pet instanceof Dog) {
Dog dog2=(Dog)pet;
dog2.sleep();
}else if(pet instanceof Penguin) {
Penguin pe1=(Penguin)pet;
pe1.swimming();
}else {
System.out.println("类型错误");
}
2、final关键字
final关键字:代表最终的意思
final可以修饰什么?
- 1、修饰类
- 2、修饰方法
- 3、修饰成员变量
- 4、修饰局部变量
修饰类,这个类有什么特点?
这个类不能被继承,但是可以继承其他类
修饰方法,这个方法有什么特点?
代表这个方法是最终的方法,不能被重写
修饰成员变量有什么特点?
成员变量不会再有默认值,所以必须给其赋值
private final String sex="男";//不赋值就报错
修饰局部变量有什么特点?
一旦赋值,便不可改变。
3、static关键字
static:静态的
1、static修饰成员变量,(类变量)
- (1)这个成员变量就不属于对象,而属于类本身,我们就可以通过"类名.属性名";
- (2)就是只要通过这个类创建的对象,这些对象都可以共享该属性;当其中一个对象对类变量进行更改后,其他的这个类变量也会更改。
- (3)类变量随着类的加载而加载,类变量放在方法区的静态域里面
2、static修饰方法(类方法)
- (1)修饰方法,这个方法就属于类本身了,可以通过“类名.方法名()”进行调用
- (2)随着类的加载而加载
- (3)在静态方法里面只能调用静态方法和静态变量,相反在普通方法里面可以调用静态方法和静态变量,因为静态方法和静态变量的加载时机早于实例变量和实例方法的加载时机
- (4)不能使用this和super关键字
3、static修饰代码块
代码块的作用:完成初始化
- (1)非静态代码块:
可以给类的属性进行初始化操作,同时还可以调用类的方法(静态的、非静态的)、里面可以有输出语句;
每创建一个对象,就加载一次非静态代码块。 - (2)静态代码块
里面可以有输出语句;随着类的加载而加载;静态代码块只能执行一次;
静态代码块的加载时机早于非静态代码块;静态代码块只能调用类变量和类方法
//成员变量
private String name;//实例变量
private int age;//实例变量
protected static String nation;//类变量
//代码块:初始化
{
name="张三";
age=12;
nation="America";
show1();
System.out.println("非静态代码块");
}
//前面加一个static就是静态代码块
static {
// name="张三";报错,因为静态代码块是随着类加载而加载的,早于实例化变量和实例化方法,这也是为什么静态方法只能调用静态变量和静态方法的原因。
// age=12;
nation="America";
show1();
System.out.println("这是一个静态代码块");
}
//普通方法
public void show() {//加载时机晚于静态方法,所以可以调用静态变量和静态方法
System.out.println(this.age);
System.out.println(nation);//类变量
show1();//类方法
System.out.println("这是一个普通方法");
}
//静态方法
public static void show1() {
//this代表当前对象
// System.out.println(this.age);在静态方法里面只能调用静态方法和静态变量
System.out.println("这是一个静态方法");
}