美文网首页
代码查错

代码查错

作者: 骇客与画家 | 来源:发表于2018-01-01 20:34 被阅读0次
    abstract class Name {
        private String name;
        public abstract boolean isStupidName(String name) {}
    } 
    
    答案:错。abstract method 必须以分号结尾,且不带花括号。
    
    public class Something {
        void doSomething() {
            private String s = "";
            int I = s.length();
        }
    }
    
    答案: 错。局部变量前不能放置任何访问修饰符 (private,public,和 protected)。final 可以用来修饰局部变量
    
    (final 如同 abstract 和 strictfp,都是非访问修饰符,strictfp 只能修饰 class 和 method 而非variable)。
    
    public class Something {
        private abstract String doSomething();
    }
    
    答案: 错。abstract 的 methods 不能以 private 修饰。abstract 的 methods 就是让子类implement(实现)具体细节的,怎么可以用 private 把 abstract method 封锁起来呢? (同理,abstract method 前不能加 final)。
    
    public class Something {
        public int addOne(final int x) {
            return ++x;
        }
    } 
    
    答案: 错。int x 被修饰成 final,意味着 x 不能在 addOne method 中被修改。
    
    public class Something {
        public static void main(String[] args) {
            Other o = new Other();
            new Something().addOne(o);
        }
        public void addOne(final Other o) {
            o.i++;
        }
    }
    class Other {
        public int i;
    } 
    
    答案: 正确。在 addOne method 中,参数 o 被修饰成 final。如果在 addOne method 里我们修改了 o 的 reference(比如: o = new Other();),那么如同上例这题也是错的。但这里修改的是 o 的 member vairable(成员变量),而 o 的 reference 并没有改变。
    

    final关键字

    final修饰变量

    • final关键字修饰变量,意为不可改变。

    • final修饰成员变量,两种方式初始化:

      • 声明同时初始化
      • 构造函数中初始化
    • final关键字也可以修饰局部变量,使用之前初始化即可。

      public class Emp {
        private final int no = 100; //final变量声明时初始化
        public void testFinal(){
          no = 99;//编译错误,final的变量不可被改变
        }
      }
      

    final修饰方法

    • final关键字修饰的方法不可以被重写。
    • 使一个方法不能被重写的意义在于:防止子类在定义新方法时造成的"不经意"重写。
    2018-01-01 14-23-22屏幕截图.png

    final修饰类

    • final关键字修饰的类不可以被继承。

      final class Foo { }

      class Goo extends Foo { } //会有编译错误

    • JDK中的一些基础类库被定义为final的,例如:String、Math、Integer、Double等等。

    • 使一个类不能被继承的意义在于:可以保护类不被继承修改,可以控制滥用继承对系统造成的危害

    static final常量

    • static final 修饰的成员变量成为常量,必须声明同时初始化,不可被改变。

    • static final 常量会在编译期被替换,例如:

      class Foo{
        public static final int NUM = 100;
      }
      
      class Goo{
        public static void main(String[] args){
            System.out.println(Foo.NUM);
          // 代码编译时,会替换为:System.out.println(100);
        }
      }
      

      static final 常量 Foo.NUM会在编译时被替换为其常量值(100) ,在运行Goo类时,Foo类不需要被载入。

    相关文章

      网友评论

          本文标题:代码查错

          本文链接:https://www.haomeiwen.com/subject/yafxnxtx.html