static

final方法
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
使用final方法的原因有二:


第一、把方法锁定,防止任何继承类修改它的意义和实现。


第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

class Test1 {

public void f1() {

    System.out.println("f1");

}

//无法被子类覆盖的方法

public final void f2() {

    System.out.println("f2");

}

public void f3() {

    System.out.println("f3");

}

private void f4() {

    System.out.println("f4");

}

}

public class test2 extends Test1 {

   

public void f1(){    

    System.out.println("Test1父类方法f1被覆盖!");

}

 

public static void main(String[] args) {

    test2 t=new test2();

    t.f1();   //正常复写

    t.f2(); //调用从父类继承过来的final方法 final能继承,不能覆盖

    t.f3(); //调用从父类继承过来的方法

    //t.f4(); //调用失败,无法从父类继承获得 private

}

}

 

 

用final修饰的成员变量表示常量,值一旦给定就无法改变!
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
从下面的例子中可以看出,一旦给final变量初值后,值就不能再改变了。
另外,final变量定义的时候,可以先声明,而不给初值,这中变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,

 

一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。

public class Test3 {

        private final String S = "final实例变量S";

        private final int A = 100;

        public final int B = 90;

 

        public static final int C = 80;

        private static final int D = 70;

 

        public final int E; //final空白,必须在初始化对象的时候赋初值

 

        public Test3(int x) {

                E = x;

        }

 

        /**

         * @param args

         */

        public static void main(String[] args) {

                Test3 t = new Test3(2);

                //t.A=101;    //出错,final变量的值一旦给定就无法改变

                //t.B=91; //出错,final变量的值一旦给定就无法改变

                //t.C=81; //出错,final变量的值一旦给定就无法改变

                //t.D=71; //出错,final变量的值一旦给定就无法改变

 

                System.out.println(t.A);

                System.out.println(t.B);

                System.out.println(t.C); //不推荐用对象方式访问静态字段

                System.out.println(t.D); //不推荐用对象方式访问静态字段

                System.out.println("-------");

                System.out.println(Test3.C);

                System.out.println(Test3.D);

                System.out.println("-------");

                //System.out.println(Test3.E); //出错,因为Efinal空白,依据不同对象值有所不同.

                System.out.println(t.E);

 

                Test3 t1 = new Test3(3);

                System.out.println(t1.E); //final空白变量E依据对象的不同而不同

        }

 

        private void test() {

                System.out.println(new Test3(1).A);

                System.out.println(Test3.C);

                System.out.println(Test3.D);

        }

 

        public void test2() {

                final int a;     //final空白,在需要的时候才赋值

                final int b = 4;    //局部常量--final用于局部变量的情形

                final int c;    //final空白,一直没有给赋值.   

                a = 3;

                //a=4;    出错,已经给赋过值了.

                //b=2; 出错,已经给赋过值了.

        }

}

 

 

只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

 

 

 

public static

public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。

 

 

static变量

对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

 

 

静态方法可以直接通过类名调用

 

 

 

因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

 

 

 

 

static中任何new都是无效的

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值