zoukankan      html  css  js  c++  java
  • final 关键字

    1,空白final
    package example;

    class People{
        private int i;
        People(int ii){
            i=ii;
        }
    }
    public class Test{
        private final int i=0;
        private final int j;            //空白final必须在每个构造器中用表达式对final进行赋值
        private final People p;         //否则会提示可能空白终态字段 可能尚未初始化
        Test(){
            j=1;
            p=new People(1);
        }
        Test(int x){
            j=2;
            p=new People(x);
        }
        
        public static void main(String[] args) {
            Test a=new Test(20);
            
        }
    }

    2,final参数
    package example;

    class Gizmo{
        public void spin(){}
    }

    public class Test{         
        
        void with(final Gizmo g){   //java允许在参数列表中以声明的方式将参数指明为final
                                    //这意味着你无法改变在方法中更改参数引用的对象
            // g=new Gizmo();   //illegal--g is final
        }
        int g(final int i){
            // i++;    //can't change
            return i+1;
        }
                
    }
    3
    final和private
    类中所有的private方法都隐式的指定为final的,由于无法取用private方法,所以也就无法覆盖他。
    可以对private添加final修饰词,但这并不能给该方法增加任何额外意思。

    这一问题会造成混淆,可以对private方法试图覆盖,似乎是奏效的,编译器也不会报错。

    package example;

    class WithFinals{
        private final void f(){
            System.out.println("WithFinal.f()");
        }
        private void g(){
            System.out.println("WithFinal.g()");
        }
    }
    class OverridingPrivate extends WithFinals{
        public final void f(){
            System.out.println("OverridingPrivate.f()");
        }
        public void g(){
            System.out.println("OverridingPrivate.g()");
        }
    }

    public class Test{         
        public static void main(String[] args){
            OverridingPrivate op=new OverridingPrivate();
            op.g();
            op.f();
            WithFinals op2= op; //向上转型
            //op2.f();
            //op2.g();           编译无法通过
        }
            
    }


    覆盖只是在某方法是基类的接口的一部分时才会出现,即必须能将一个对象向上转型为它的基类类型
    并调用相同的方法。如果某个方法为private,他就不是基类的接口的一部分,它仅仅是一些隐藏于类中的
    程序代码,只不过是具有相同的名称而已。由于private方法无法触及而且能有效隐藏,所以除了把他看成
    因为他所属的类组织结构的原因而存在外,其他任何任务都不需要考虑到他。




    4final类
    package example;

    final class A{
        int i=1;
        final int j=2;
        void f(){
            
        }
    }
    /*class B extends A{   //编译错误
        
    }*/
    public class Test{         
        public static void main(String[] args){
        A a=new A();
        a.i=2;
        // a.j=3; 编译错误
        }
            
    }

    注意,final类禁止继承,所以final中所有方法都是隐式的指定为final。
    但,final类的域可以根据个人意愿选择是或者不是final

  • 相关阅读:
    编码和字符集
    【机器学习】模型泛化
    asp.net GridView控件的列属性
    asp.net截取指定长度的字符串内容
    asp.net 对数据库表增加,删除,编辑更新修改
    asp.net 链接数据库ADO.NET
    常用正则表达式 验证电子邮件网址邮政编码等
    ASP.NET获取文件的相关知识
    C#获取picturebox图片路径
    C# dataGridView根据数据调整列宽
  • 原文地址:https://www.cnblogs.com/xurui1995/p/5233207.html
Copyright © 2011-2022 走看看