19. Static inner class 与non static inner class的区别

Java当中一种有四种内部类:

  • 静态内部类
  • 普通内部类
  • 局部内部类
  • 匿名内部类

静态内部类(static inner class)

class outerClass{
    //静态内部类
    static class staticInnerClass{
    }
    //普通内部类
    class innerClass{
    }
    //局部内部类
    public void function(){
        class innerClass{
        }
    }
    //匿名内部类
    public MyFrame() {
     addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            ....
        }
    });
}
静态内部类 普通内部类 局部内部类 匿名内部类
实例化方式 不依赖外部类实例 依赖外部类实例 方法内部 只有一个实例
访问权限 外部静态成员和静态方法 外部所有成员方法 只能访问方法中final局部常量 同左
构造函数
其它 无publi,protected等修饰 同左;必须继承一个父类或者实现一个接口
2016/9/29 16:30 下午 posted in  Java

18. interface与abstract类的区别

interface中不能有变量,只能有公有静态常量,没有构造方法,默认为public abstract,一个类可实现多个interface,表示has-a关系,实现一个接口必须实现其中所以的方法。

抽象类中可以有自己的变量,可以有私有方法和非抽象方法,需要继承,一个类只继承一个,继承类如果不是抽象类必须实现抽象方法,如果是则不需要被重写。is-a关系。

接口和抽象类的相同点:
1.都不能被实例化
2.接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能被实例化。

不同:
1.接口中的方法只能有定义。抽象类中可以有定义和实现。
2.接口可以实现(implement)多个,但是继承抽象类只能继承一个
3.接口中不能有变量只能包含public static final常量。所有方法默认为public abstract。抽象类中可以有普通成员变量和成员方法。
4.接口用于实现常用功能,便于日后维护或者添加删除方法;抽象类则充当公共类的角色,不适用于日后重新对代码进行修改。

2016/9/29 15:11 下午 posted in  Java

17. Override和Overload的含义去区别

Override
覆盖(又称重写)指重写父类的同名方法,参数,名称,返回值都必须一样,子类不能降低父类方法的可见性(否则无法实现多态)

Overload
重载,在同一个类中,使用同名方法,但方法参数必须有不同,个数或类型

class Father{
    public void show(){
        System.out.println("Father");
    }
}

class Sub extends Father{
    
    public void show(){
        System.out.println("Sub");
    }
    
    public void show(String msg){
        System.out.println("reload:" + msg);
    }
    
    public void show(String msg, String time){
        System.out.println("reload:" + msg + " time:" + time);
    }
    
    public void show(int number){
        System.out.println("reload:" + number);
    }
}

若子类尝试降覆盖方法的可见性,编译会报错。

class Father{
    public void show(){
        System.out.println("Father");
    }
}

class Sub extends Father{
    
    private void show(){
        System.out.println("Sub");
    }
    
    public void show(String msg){
        System.out.println("reload:" + msg);
    }
    
    public void show(String msg, String time){
        System.out.println("reload:" + msg + " time:" + time);
    }
    
    public void show(int number){
        System.out.println("reload:" + number);
    }
}

输出

Untitled.java:9: 错误: Sub中的show()无法覆盖Father中的show()
    private void show(){
                 ^
  正在尝试分配更低的访问权限; 以前为public
1 个错误
2016/9/29 12:50 下午 posted in  Java