`
jingwuyuan
  • 浏览: 8885 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java核心技术基础知识个人总结之——接口、内部类与代理

阅读更多
一、接口:是对类的一组需求的描述。接口中所有的方法自动地属于public,所以不用提供关键字public。在接口中还可以定义常量,但是接口绝对不能含有实例域,也不能在接口中实现方法。类实现接口用implements关键字,实现接口要实现接口的所有方法,并且方法必须声明为public。
Arrays里的静态方法sort(Object[] o)要求数组中的元素必须属于实现了Comparable接口的类(实现该接口的int CompareTo(T other)方法)。
1、接口的特性:不能使用new运算符实例化一个接口,但是可以声明一个接口的变量引用一个实现了该接口的类的对象。可以使用instanceof来检查某个对象是否实现了某个接口。接口中的域将被自动设为public static final。JAVA每个类只能够拥有一个超类,但却可以实现多个接口,实现的各个接口用逗号隔开。

二、对象克隆:先掌握protected这个访问权限:相同包里的类可以互相访问protected方法,子类可以访问超类的protected方法,但是超类并不能访问子类的protected方法,就算是子类覆盖了超类的方法。子类都继承父类的protected方法,并且也是protected的,如果子类不在一个包下,也不能互相访问这个继承于超类的方法,也就是说子类继承的超类的protected的方法不具有包的访问权限,要访问的话除非又让另一个类去继承他。(不是所有的子类都可以看做是一个超类吗?但是这里一定要注意,他们继承超类的protected方法不能互相访问,除非他们和超类在一个包下)
浅克隆:就是对对象里面的其他对象的引用做拷贝,而引用指向的是同一对象,这样的克隆,只有本类对象才能克隆本类对象,调用的是Object的克隆方法。
深克隆:让类继承标记接口Cloneable,并使用public修饰符重新定义clone方法,并调用超类的super.clone(),必继续克隆对象里的实例域(那么该实例域的类也应该继承Cloneable接口,如果没有那么会抛出一异常个ClonenotSupportedException),这样克隆的是值,而不是引用。

三、接口与回调:一般是定义一个接口,其他类的方法接受这个接口,并去调用这个接口的实现类里面的方法。


四、内部类:
1、使用内部类的主要原因:内部类可以访问类定义所在的作用域中的数据,包括私有数据;内部类可以对同一个包中的其他类隐藏起来;可以使用匿名的内部类可以让代码简洁。

2、普通内部类的特性:内部类的对象总有一个隐式引用,它指向了创建它的外部类对象。实际上是编译器修改了内部类的构造器,为内部类添加了一个外围类的引用。内部类可以为私有的,这样只有它的外围类才能产生这个内部类的对象。如果是一个公用的内部类,那么可以先new一个外围类的对象,然后用这个外围的对象去new一个内部类的对象,语法是OuterClassInstance.new InnerClass(),示例:
class Outer{
private String str="PRIVATE";
public class Inner{
   public void callOuter(){
    System.out.println(Outer.this.str);
  }
}
 

}
public class Test{
  public static void main(String[] args){
    Outer outer=new Outer();
    Outer.Inner inner=outer.new Inner();
    inner.callOuter();
  }

}
需要注意的是:内部是一种编译器现象,而与虚拟机无关的。内部类可以访问外围类的私有数据。内部类怎么去调用外围类的私有变量:其实是编译器编译时就给外围类添加了一个静态的方法,而内部类去调用这个方法。
javap -private||public ClassName 可以反射编译后的类。

3、局部内部类:不能用public说明符进行说明。在局部方法里的内部类,在外围内的其他方法里无法访问,但是这个内部类不仅可以访问外围类变量,还可以访问局部变量,不过为了维护数据的同一,要被访问的局部变量必须声明为final。(可以用一个对象的引用作为final,这样引用的对象里的值可以变,只是不可以让他去引用其他对象,比如可以用数组变量声明为final).

4、匿名内部类:假如只创建这个类的一个对象,就不必命名了,这个叫匿名的内部类。由于匿名类没有类名,所以匿名类不能有构造器,取而代之的是会将参数传递给超类构造器。

5、静态内部类:如果使用内部类只是为了把一个类隐藏在另一个类的内部,并不需要内部类引用外围类对象,此时可以将内部类声明为静态的,可以取消产生的对外围类的引用。静态的内部类可以在其他类中访问,要加上外围类名修饰:OuterClassName.InnerclassName innerclass=new OuterClassName.InnerclassName();


五、代理:利用代理可以在运行时创建一个实现了一组给定接口的新类,这样不用实现接口而用代理类去调用方法。代理需要掌握的类主要是:Proxy和InvocationHandler.所有代理类都覆盖了Object中的:tostring,equals,hashcode,这些方法也是调用invoke,Object中的其他方法没有被覆盖。
代理示例:
import java.lang.reflect.*;
public class MyProxy {
  public static void main(String []args){
    Myinterface o=(Myinterface)Proxy.newProxyInstance
    (Thread.currentThread().getContextClassLoader(),
     new Class[]{Myinterface.class},
     new MyInvocationHandle("ss"));
     System.out.println(o.myMethod("xx"));
  }

}
class MyInvocationHandle implements InvocationHandler{
    private String s;
    public MyInvocationHandle(String s){
    this.s=s;
    }
    public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
System.out.println("代理成功");
System.out.println(method.getName());
return args[0].toString();
}

}
interface Myinterface{
String myMethod(String s);
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics