您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

javase - 08 -多态- 抽象类

一、 继承的内存解析

 

二、多态

1、场景分析

 

学生管理系统数据由mysql迁移到oracle中,数据操作代码发生变更 这时候如果想要程序有良好的扩展性,使用java的多态的特性

2、什么是多态

一个事物的多种表现形态 键盘的F1 在不同的软件下按F1得到的结果不一样

3、引入多态语法

案例: 动物、人、猪 人是动物 猪是动物

使用代码来表示 :

public class Animal {

public void eat() {
    System.out.println("吃东西");
}

}

class People extends Animal{

public void eat() {
    System.out.println("吃火锅");
}
​
public void playGames() {
    System.out.println("撸啊撸");
}

}

class Pig extends Animal{

public void eat() {
    System.out.println("拱白菜");
}
​
public void sleep() {
    System.out.println("猪睡觉");
}

}

ublic class AnimalTest { public static void main(String[] args) {

    //人是动物
    //人类继承动物类,人类是动物类的子类
    Animal a1 = new People();
    a1.eat();//吃火锅
    //a1.playGames();//报错! Animal我们称为编译时类型,代码编译看编译时类型,编译时类型有的方法才可以调用
    //运行时类型  运行时的类型是People
    //运行时可以理解为
    //People a1 = new People();
    People p = (People)a1;
​
    Animal a = new Animal();
    People p1 = (People)a;
​
    //猪是动物
    Animal a2 = new Pig();
    a2.eat();//拱白菜
    //a2.sleep;
}

}

4、编译时类型和运行时类型

对象赋值,=号左边就是编译时类型,new 的对象类型是运行时类型 写代码看左边的类型(编译时类型),编译时类型有的方法和属性才能使用 代码运行时,子类如果重写了父类的方法,运行的是子类重写后的方法

1.左侧类型1我们称为 编译时类型

2.方法调用看左侧

3.左侧类型有才可以使用

4.右侧类型2我们称为 运行时类型

5.方法执行时看右边

6.子类如果重写了这个方法,调用的是子类重写后的方法

5、类型转换

向上造型 向下造型

 

6、instanceof关键字

判断某个对象的运行时类型 是否 是 某个类型

表达式语法:

 

布尔表达式,返回true或者false

7、练习

public class A { public String show(D obj) { return ("A and D"); } public String show(A obj) { return ("A and A"); } }

class B extends A { public String show(B obj) { return ("B and B"); } public String show(A obj) { return ("B and A"); } }

class C extends B { }

class D extends B { }

 

public class Test { public static void main(String[] args) {

    A a1 = new A();//创建A的实例
    A a2 = new B();//多态 编译是看A 运行时看B
    B b = new B();//创建B的实例
    C c = new C();//创建C的实例
    D d = new D();//创建D的实例
​
    System.out.println(a1.show(b));//A and A
    System.out.println(a1.show(c));//A and A
    System.out.println(a1.show(d));//A and D
​
    //稍微复杂点
    System.out.println(a2.show(b));//B and A
    System.out.println(a2.show(c));//B and A
    System.out.println(a2.show(d));//A and D
​
    System.out.println(b.show(b));//B and B
    System.out.println(b.show(c));//B and B
    System.out.println(b.show(d));//A and D
}

}

三、final

final修饰的变量 变为 常量 常量名全大写 Math.PI

四、代码块

1.静态代码块

2.局部代码块

3.构造代码块

五、抽象类

抽象方法:

1、某个父类中的方法他的方法实现是没有任何意义的,我们完全可以把这个方法写为抽象方法

什么场景下使用抽象类:

(1)类中有抽象方法

(2)这个类无法被实例化,只能被继承

示例代码:

public abstract class Dog {

private String name;
private int age;
​
public Dog() {}
public Dog(String name, int age) {
    this.name = name;
    this.age = age;
}
​
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
public abstract void fight();

public class DogTest { public static void main(String[] args) {

    Dog dog1 = new Husky("哈儿",5);
    
    dog1.fight();
    
    //抽象类不能实例化 - 抽象类不能创建对象!

// Dog dog2 = new Dog(); while(true) {

    }   
        }
        }

抽象类和抽象方法的总结:

1、被abstract修饰的方法叫做抽象方法,抽象方法一定没有方法体。

2、抽象方法所在的类一定是抽象类,这个类被abstract修饰

3、抽象类中不一定有抽象方法

4、抽象类不能实例化对象


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进