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());

 

posted @ 2018-05-31 09:59  木东木容  阅读(146)  评论(0编辑  收藏  举报