Java是一种面向对象的编程语言,具有丰富的特性,其中多态和动态是其中两个非常重要的特性。
多态是指同一个方法可以被不同的对象调用,产生不同的结果。在Java中,多态可以通过继承和接口实现。例如:
public class Animal { public void move() { System.out.println("Animal is moving"); } } public class Dog extends Animal { public void move() { System.out.println("Dog is running"); } } public class Cat extends Animal { public void move() { System.out.println("Cat is jumping"); } } public class Main { public static void main(String[] args) { Animal animal1 = new Dog(); Animal animal2 = new Cat(); animal1.move(); // 输出:Dog is running animal2.move(); // 输出:Cat is jumping } }
在上面的例子中,Animal类定义了一个move()方法,而Dog和Cat继承了Animal类并重写了move()方法。在main()方法中创建了一个Dog对象和一个Cat对象,并将它们都赋值给一个Animal类型的变量。然后分别调用animal1和animal2的move()方法,由于animal1的实际类型是Dog,animal2的实际类型是Cat,因此会分别调用它们的move()方法,输出不同的结果。
动态是指程序在运行时可以检查和修改自身的行为。在Java中,动态可以通过反射和动态代理实现。例如:
public class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before " + method.getName() + "()"); Object result = method.invoke(target, args); System.out.println("after " + method.getName() + "()"); return result; } } public interface HelloWorld { void sayHello(); } public class HelloWorldImpl implements HelloWorld { public void sayHello() { System.out.println("Hello World"); } } public class Main { public static void main(String[] args) { HelloWorld target = new HelloWorldImpl(); MyInvocationHandler handler = new MyInvocationHandler(target); HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler); proxy.sayHello(); // 输出:before sayHello(),Hello World,after sayHello() } }
在上面的例子中,定义了一个MyInvocationHandler类实现InvocationHandler接口,它包含一个target成员变量用于保存目标对象,并实现了invoke()方法,在方法前后打印日志并调用目标方法。通过动态代理创建了一个HelloWorld接口的代理对象,代理对象调用sayHello()方法时,会先调用MyInvocationHandler的invoke()方法,然后再调用目标对象的sayHello()方法。