• final&static


     final

         1.final修饰类,那么该类不能有子类,那么也就没有子类重写父类的方法,也就没有多态

         2.final修饰成员变量,那么成员变量要么显式赋值(用第一种),要么在构造方法中赋值

           无论哪一种,都要手动赋值

      class Person{
                 private final int age=10;//显式赋值
                 private final String name;
                 public Person(){
                     this.name="张三";//构造方法中赋值
                 }
           }

     

         3.final修饰局部变量,局部变量只能被赋值一次

         4.final修饰方法,不能子类重写

           final不能与abstract关键字共存,如果修饰抽象方法,该方法不能被重写,那么抽象方法没有存在意义

    static

    静态修饰的成员变量的特点

     a. class Chinese{
              private final static String cn="中国";//所有的中国人共享一份国籍cn
                                                   //final 与 static 前后顺序无所谓
              private  static String skin;
          }
          被静态修饰的成员变量被该类所有的对象共享,如果其中一个对象改变了共享数据,
          其它对象方法访问的是改变后的
          new Chinese().skin="黄种人";
          System.out.println(new Chinese().skin);//黄种人,两个对象共享skin  
         b.静态成员随着类的加载(new该类的对象或者通过类名来调用静态方法或者该类被继承)而加载
           放在方法区,具有默认值(和成员变量各类型的默认值相同) 
    
         c.通过 类名.静态成员 直接访问

    静态成员&非静态成员&局部变量

         1.内存的区别:

            非静态成员:和对象同生共死(对象存在的时候,这个非静态成员也存在,存在于堆中有默认值),当对象被GC(垃圾回收器),回收走的时候,这个非静态成员也会销毁

            静态成员:和类同生共死(静态成员随着类的加载(new该类的对象或者通过类名来调用静态方法或者该类被继承)而加载

            放在方法区,具有默认值(和成员变量各类型的默认值相同))

            局部变量:和方法同生共死,随着方法的调用而进入到方法栈中,当方法执行结束,方法弹栈,该方法中所有的局部变量都要被销毁

          2.默认值:

            成员变量和静态变量才有默认值,局部变量要想使用(打印)必须被赋值

          3.局部变量不能被static修饰,static只修饰成员位置(变量,方法,内部类),可以用final修饰符

    静态成员的访问的注意事项

           a.静态成员只能直接访问静态成员,不能直接访问非静态成员

     class Person{
               private  static String cn="中国";
               public static void method(){
                   System.out.println(cn);//静态可以直接访问静态
                   //method2();//静态不能直接访问非静态
                   Person p=new Person();
                   p.method2();//因为对象已经存在,可以访问非静态成员
               }
               public void method2(){
                 System.out.println(cn);//因为静态是先存在(祖宗),method2方法是非静态,后存在(子孙)
                                       //那么后存在的(子孙)可以访问先存在(祖宗)
               }
              }

            b.静态方法没有this和super关键字

     class Animal{
                int i=10;
              }
     class Person extends Animal{//人是哺乳动物的一种
               private  static String cn="中国";
               private int i=3;
               public static void method2(){
               //System.out.println(this.i);//假设method2()中有this关键字,this一定会指向某个对象,但是当执行Person.method2()的时候,通过类名.静态方法调用
               //此时还没有创建任何对象,此时发生矛盾
               //System.out.println(super.i);//假设method2()中有super关键字,super可以访问父类的属性,但是父类中的属性是在子类对象中存在的,
               //但是当执行Person.method2()的时候,通过类名.静态方法调用
               //此时还没有创建任何子类对象,无法访问父类成员,发生矛盾
               }
              }
               System.out.println(Person.method2());
  • 相关阅读:
    Python-手动安装第三方包
    SQL SERVER-根据jobID查job
    python-包模块等概念
    锁表
    Python-try异常捕获
    胶水语言
    C++之多态性与虚函数
    android
    开源许可协议
    hal
  • 原文地址:https://www.cnblogs.com/xwb583312435/p/9115040.html
Copyright © 2020-2023  润新知