小言_互联网的博客

多态和静态

278人阅读  评论(0)

多态
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:父类的引用指向子类的类对象,或者接口的引用指向【遵从】接口实现的类对象。

代码实现多态
示例:

// 动物类
class Animal {

}

/*
猴子是不是动物
老虎是不是动物
单身狗是不是动物
 */

// 程序猿是动物类的子类
class CodingMonkey extends Animal {

}

// 老虎是动物类的子类
class Tiger extends Animal {

}

// 单身狗是动物类的子类
class SingleDog extends Animal {

}

class JavaSingleDog extends SingleDog {
    
}

public class Demo1 {
    public static void main(String[] args) {
        Animal animal = new Animal();

        feed(animal);

        // 该方法需要的参数是一个动物类对象,CodingMonkey是动物类的子类,也是动物类
        feed(new CodingMonkey());

        feed(new Tiger());
        feed(new SingleDog());
        
        feed(new JavaSingleDog());
    }

    /**
     * 这里是一个喂食的方法,需要的参数是一个动物类对象
     *
     * @param animal 动物类对象
     */
    public static void feed(Animal animal) {

        /*
        getClass()
        通过任意类对象调用,可以看到当前类对象的完整包名.类名
         */
        if (animal instanceof SingleDog) {
            System.out.println(animal.getClass() + "来吃狗粮了!!!");
        } else {
            System.out.println(animal.getClass() + "来吃饭了!!!");
        }
    }
}

示例2:

/**
 * 定义一个USB接口
 * @author Anonymous
 */
interface USB {
    /**
     * 在USB接口中定义一个connect方法,该方法是要求接口的实现类对象完成的!!!
     */
    public void connect();
}

/**
 * 鼠标【遵从】USB接口,是一个 USB设备,需要完成 connect方法
 */
class Mouse implements USB {

    @Override
    public void connect() {
        System.out.println("鼠标设备连接电脑!!!");
    }
}

/**
 * Logi 鼠标,继承 Mouse类,是一个 Mouse类的子类对象。
 * Logi 也是一个USB设备,借助于 Mouse类,间接遵从 USB接口
 */
class Logi extends Mouse {
    @Override
    public void connect() {
        System.out.println("Logi M280 无线鼠标 79");
    }
}

/**
 * 键盘【遵从】USB接口,是一个 USB设备,需要完成 connect方法
 */
class Keyboard implements USB {

    @Override
    public void connect() {
        System.out.println("键盘设备连接电脑!!!");
    }
}

/**
 * IKBC类,是 Keyboard类的一个子类
 * IKBC类也可以看做是一个 USB设备,间接遵从 USB接口
 */
class IKBC extends Keyboard {
    @Override
    public void connect() {
        System.out.println("IKBC C87 静音红轴");
    }
}

class PC {
    /**
     * 在 PC类中定义一个方法,需要的参数是 USB接口,该方法用于连接 USB设备
     * @param usb
     */
    public void usbConnect(USB usb) {
        usb.connect();
    }
}

public class Demo2 {
    public static void main(String[] args) {
        PC pc = new PC();

        Mouse mouse = new Mouse();
        Keyboard keyboard = new Keyboard();

        pc.usbConnect(mouse);
        pc.usbConnect(keyboard);

        /*
        该方法需要的参数是一个 USB接口,这里传入的是一个
        间接遵从 USB接口的实现类对象
         */
        pc.usbConnect(new Logi());
        pc.usbConnect(new IKBC());
    }
}

总结: 多态的使用可以使方法的参数范围变的更加的灵活

static 关键字
static 概述:
static: 静态
static:
修饰的和对象无关
1、通过对象使用静态的内容是存在一定的隐患或者直接就是错的!
2、普通的非 static 修饰的成员变量和成员方法用在 static 修饰的代码中,是存在一定的问题的! 【没有对象】

static 修饰成员方法
比如 main方法
public static void main( String[] args) { }

功能性代码用 static 修饰
工具类: 把所需要的功能代码,全部用 static 修饰,放到一个类内!! 这样所有的方法都以可通过类名直接调用!
优点:
1、效率高
2、节约内存
3、代码的普适性更强

static 修饰的代码块
格式:

static {

}

特点: 类文件只要加载,就一定会运行

static 面试题:

class Demo {
    static Demo d1 = new Demo();
    static Demo d2 = new Demo();
    
    static {
        System.out.println("静态代码块");
    }
    
    {
        System.out.println("构造代码块");
    }
    
    public Demo() {
        System.out.println("构造方法");
    }
    
    public static void main(String[] args) {
        Demo d = new Demo();
    }
}

/*
请问:
	代码运行效果是什么???
		1. 顺序原则!
		2. 执行要求!
		3. 语法要求!
答案:

执行者: static Demo d1 = new Demo();
	构造代码块
	构造方法
执行者:static Demo d2 = new Demo();
	构造代码块
	构造方法
执行者: 类内静态代码块
	静态代码块
执行者: main方法中 Demo d = new Demo();
	构造代码块
	构造方法
	
原则:
	1. 只要执行构造方法,一定会执行构造代码块!!!
	而且构造代码块执行优先级高!!!
	
	2. 代码执行最基本的原则,从上至下!!!
*/

static 总结
1、static 修饰的成员变量和成员方法,称之为静态成员变量和静态成员方法。在一些书籍和文章中也有类变量和类方法的说法。
2、static 修饰的内容,都是在类文件加载阶段完成,不被类对象约束!!并且程序不退出,就一直存在!!
3、尽量避免在 static 修饰的内容中,直接使用和类对象有关的内容。
4、静态的内容,最好只和静态的内容打交道。


转载:https://blog.csdn.net/singerDog/article/details/102154692
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场