当先锋百科网

首页 1 2 3 4 5 6 7

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()方法。