?????????????????????????????????????????

/*
 * Java?????????????????????????
 */
interface A {}
 
class B implements A {}
 
class C implements A {}
 
class Test {
    A b = new B();
    A c = new C();
}

/*
 * ??????????????? NameChanger???????Client??????
 * ??NameChanger??changeName????????????Client????????????????Client?????????????????
 * Client??????NameChanger??????????????????
 */
class Client {
 
    private INameChanger changer;
    private String clientName;
    
 
    public Client(INameChanger changer) {
        this.changer = changer;
    }
 
    public void showMyNewName() {
        String newName = changer.changeName(Client.this);
        System.out.println(newName);
    }
    
    public String getName() {
        return clientName;
    }
 
    public void setName(String clientName) {
        this.clientName = clientName;
    }
}
 
 interface INameChanger {
    
    public String changeName(Client client);
    
}
 
 
public class ChangeNameTest {
    
    public static void main(String[] args) {
        
        Client client = new Client(new INameChanger(){
            public String changeName(Client client) {
                return "Mr." + client.getName();
            }
        });
        client.setName("Tom");
        client.showMyNewName();
        
        Client client2 = new Client(new INameChanger(){
            public String changeName(Client client) {
                return "Miss." + client.getName();
            }
        });
        client2.setName("Lucy");
        client2.showMyNewName();
        
    }