一.多态的概述及其使用
1.继承与重写、父类引用指向子类对象是触发多态的三大前提
2.多态是同一种事物表现出的多种形态
3.多态的好处:(下文会举例说明)
- 提高了代码的使用效率
- 提高了代码的可扩充性
- 将代码化繁为简
class Animal{
public void eat(){
System.out.println("what");
}
public void sleep(){
System.out.println("how");
}
}
class Dog extends Animal{
public void eat(){ System.out.println("狗吃骨头");}
public void sleep(){System.out.println("狗睁着眼睛睡觉");}
}
class Cat extends Animal{
public void eat(){ System.out.println("猫吃狗");}
public void sleep(){System.out.println("猫不睡觉");}
public void special(){ //父类无法继承子类方法
System.out.println("很可爱,有主宰铲屎官的能力");
}
}
public class Duotai{
public static void main(String[] args){
Animal heihei=new Cat(); //触发多态机制
Animal lala=new Dog();
nani(heihei);
nani(lala);
Cat z=(Cat)heihei;
z.special();
}
public static void nani(Animal obj){
obj.sleep();
obj.eat();
}
/*如果nani()的参数不是Animal类型,那要产生相同效果代码如下
public static void nani(Cat obj){
obj.sleep();
obj.eat(); }
public static void nani(Dog obj){ //当对象过多时很明显以Animal为类型的简便的多
obj.sleep();
obj.eat(); }
*/
}
}
4.多态的弊端:
- 不能使用子类特有功能
- 解决方案:
A.创建子类对象调用方法
B.把父类的引用强制转化为子类的引用(向下转型)
二.final的概述及其应用
- 当final修饰一个类时,该类不能被继承也不能被重写
- final(最终的),为常量声明,只能付一次值,赋值后其值不能在改变
- final赋值初始化有两种方式:
- 变量声明时赋值
- 成员变量声明时不赋值,但要在这个类的所有构造函数中对此变量赋值,局部变量声明时只需在该方法内部对其进行赋值
- final对引用类型修饰时,只是限定了其引用变量的引用不可改变,但其引用对象的值是可以变得
public class FinalTest {
final int f1=10;
/*f1=20; 报错,因为final只能赋一次值*/
final int f2;
public FinalTest(){
f2=2;
}
public static void main(String[] args) {
final double f3;
f3=0.3;
Value f4=new Value(3) //final对引用类型
f4.v=5;
}
}
class Value{
int v;
public Value(int v){this.v=v;
System.out.println("输出f4对象的第一次值"+v);
}
}
三.static的应用
- 同类类加载时先执行static初始化,创建对象(new)时进行成员变量初始化,在进行构造方法初始化
- 父类往往比子类更先完成类加载
- 由static修饰的变量放在静态储存区
public class Demo_6541 {
static Demo_6541_Book b1;
static Demo_6541_Book b2;
Demo_6541_Book b3 = new Demo_6541_Book("chushihua b3");
Demo_6541_Book b4 = new Demo_6541_Book("chushihua b4");
static {
b1 = new Demo_6541_Book("chushihau b1");
b2 = new Demo_6541_Book("chushihua b2");
}
public static void heihei() {
System.out.println("hei hei bei diao yong");
}
public static void main(String[] args) {
heihei();//调用方法会对 Demo_6541进行类加载,执行static
new Demo_6541();//创建对象(new)时进行成员变量初始化,在进行构造方法初始化
}
}
class Demo_6541_Book {
public Demo_6541_Book(String BookName) {
System.out.println(BookName);
}
}
输出结果:
chushihau b1
chushihua b2
hei hei bei diao yong
chushihua b3
chushihua b4
进程已结束,退出代码为 0
符合预期。