基本概念:
- 多态性是指一个对象对应多种不同的类型,比如猫具备猫的属性又具备动物所具有的属性。
- 多态在代码中的体现:父类或接口的引用指向子类对象。
- 多态的优点:提高了代码的扩展性,前期定义的代码可以使用后期的内容。
- 多态的弊端:前期定义的内容不能使用后期内容的特有属性。
- 多态实现的前提:必须要有关系(继承或实现,要有覆盖
多态的三种形式
方法重载
方法重写/方法覆盖
动态绑定:父类类型引用指向子类对象
对象的多态性:
- 向上转型:【自动】父类 父类对象 = 子类实例;
- 向下转型:【强制】子类 子类对象 = (子类)父类实例;
使用多态:父类类型引用指向子类对象
为了提高程序的扩展性,将Dog类和Cat类向上抽取成Animal类,在Animal类中定义相同的方法,例如:say();
public static void show(Animal animal){
animal.say();
}
此时调用两个类中的say方法时:将类型向上提取,使用父类类型声明
//创建Dog对象
Animal d = new Dog();//向上转型,将Dog类型向上转成Animal类型
show(d);
但目前调用Dog和Cat类的say方法都没有问题
如果想调用Dog的lookHome方法怎么办?
解决方案:向下转型 ,将使用父类类型声明的对象,向下转成特定的对象,调用特定的方法
//创建Dog对象
Animal d = new Dog();
show(d);
//调用dog类中特有的方法
Dog dog = (Dog)d; //将Animal类型 向下转型 成Dog类型
dog.lookHome();
instanceof:判断类型具体是哪一个类
案例:
public static void show(Animal animal){
animal.say();
//如果animal接收的是dog,直接调用lookHome方法
if(animal instanceof Dog){
Dog d = (Dog)animal;
d.lookHome();
}else{
System.out.println("我不是只狗");
}
}
类型转换的应用场景:
- 向上转型:调用的方或属性不是子类中特有的
- 向下转型:需要调用子类中特有的属性和特有的方法
多态中的成员使用特点
类中的成员:
- 成员变量
- 成员方法
- 静态方法
成员变量
编译时:看等号左边,如果左侧的类中没有该成员变量,直接报错
运行时:看左侧,打印出左侧的属性值
成员方法
编译时:看等号左侧
运行时:执行等号右侧的方法
静态方法
那个类引用就执行哪个类
例:
public class A {
public int a = 10;
static{
System.out.println("1");
}
{
System.out.println("A代码块");
}
public A() {
System.out.println("2");
}
}
public class B extends A{
public int b =20;
static{
System.out.println("a");
}
{
System.out.println("B代码块");
}
public B() {
System.out.println("b");
}
}
public class ThreadTest {
public static void main(String[] args) {
A ab = new B();
System.out.println("--------------------");
B b = new B();
}
}
输出结果:
1
a
A代码块
2
B代码块
b
--------------------
A代码块
2
B代码块
b
执行顺序:A静态代码块 --> B静态代码块 --> A代码块 --> A构造函数 --> B代码块–>B构造函数
单例设计模式
目的:保证对象的唯一性
- 案例:人去不同的银行办贷款
Person类
Bank类 - 分析:
人不同的银行办贷款,每个银行都要创建一个Person对象但是每次创建对象,产生对象都是新对象而此案例中要求创建的对象是同一个对象。怎么实现? - 解决方案:new造成的问题,直接让对象不能new此时外界不能创建对象,在本类中提供一个方法对外返回一个Person类对象,后面每家银行都使用该方法获取Person对象
示例代码:
package com.njwangbo.test06;
/**
* 单例模式讲解
* @author Administrator
*
*/
public class Person{
int score;
//私有无参构造,外界将无法new出新对象
private Person(){}
//创建Person对象
private static final Person p = new Person();
//提供一个出口使外界可以得到该对象
public static Person getPerson(){
//返回Person对象
return p;
}
}