java内部类部分用法实例介绍



java内部类部分用法实例介绍。以下案例可以看到,例二和例三,如果调用run(),则会当作普通的继承处理,调用本类中覆盖的方法,但线程仍是主线程,没有启用新线程。

而例一中,Class2继承Class1,如果方法没有覆盖,则调用Class1可的fun1(),覆盖的方法写在类里面(与普通方法平级),则调用覆盖后的方法。但如果将覆盖方法写在new Class1(){}里面,则会被认为当前类没有覆盖方法,仍会调用父类的fun1()。但是,new Class1()这个对象含有覆盖方法,于是用这个对象调用fun1()是覆盖后的方法。
java中,继承一个父类,如是没有覆盖父类的方法,会默认调用父类的方法。不管是父类型还是子类型。

如果将方法写在某内部类里面,如new Class1(){}或static class C extends Class1{} 这两种写法是同一种意思。这样写,对除这个内部类以外的类是毫无意义的。为什么调用线程的方法有作用,我认为可能是传入的对象被转换成了当前类的对象。

例子一:

public class Class1 {
public void fun1(){
System.out.println(“aaaaaaaaaaaaaaaaa”);
}
}

=========================================

public class Class2 extends Class1{
public Class2(Class1 c){
//c.fun1();//覆盖
}

public static void main(String[] args) {
Class2 c2 = new Class2(new Class1(){
public void fun1(){
System.out.println(“bbbbbbbbbbbbbbbbbb”);
}
});
c2.fun1();//没覆盖,如果注释没打开↓
}
/*public void fun1(){
System.out.println(“bbbbbbbbbbbbbbbbbb”);
}*/
}

=========================================

public class Class4 extends Class1{
public static void main(String[] args) {
Class1 c = new C();
c.fun1();//覆盖

}
static class C extends Class1{
public void fun1(){
System.out.println(“c4″);
}
}
}


 

 
例子二:

public class ClassSix extends Thread{
public static void main(String[] args) {
Thread t = new Thread(new A());
t.start();

t.run();
}
static class A implements Runnable{
@Override
public void run() {
System.out.println(“aaaaaaaaaaaaaa”);
}
}
}

 

例子三:

public class ClassSeven {
public static void main(String[] args) {
Thread t = new Thread(new Runnable(){
@Override
public void run() {
System.out.println(“aaa==”+Thread.currentThread().getName());
}
});
t.start();

t.run();

}
}