Java学习笔记14 static和final关键…

1.     static关键字:可以用于修饰属性,也可以用来修饰方法,还是可以用来修饰类

a)         用来修饰属性:分析:

public class StaticTest

{

   public static void main(String args[])

   {

         MyStatic myStatic = new MyStatic();

         MyStatic myStatic2 = new MyStatic();

         myStatic.a = 5;

         System.out.println(myStatic2.a);

   }

}

class MyStatic

{

   static int a ;

}结果:5

结论:对于属性来说,如果属性被static关键字所修饰,不管一个类生成多少个对象,多个对象,共同使用一个static所修饰的静态成员变量;一个对象对该静态变量进行了修改,其他对象的该静态成员变量的值也会发生相应的变化。

静态变量可通过类名.成员变量名(推荐使用)的方式来使用它。

b)         static修饰方法:static修饰的方法叫做静态方法。

分析:public class StaticTest

{

  public static void main(String args[])

  {

       MyStatic.output();

  }

}

 

class MyStatic

{

  public static void output()

  {

       System.out.println("output");

  }

}结果:output

结论:对于静态方法来说,可以使用类名.方法名(推荐使用)的方式来访问

2.      静态方法只能继承,不能重写(override),但可以隐藏。

分析:

class M

{

    public static void output()

    {

          System.out.println("M");

    }

}

class N extends M

{

    public static void output()

    {

          System.out.println("N");

    }

}结论:1)父、子类中均为静态方法,那叫隐藏(加了@override才叫重写,是不允许的),与普通方法利用利用多态(如调用普通方法output()     M m = new N();m.output();,使用多态调用的是子类的方法)不同,静态方法调用的是父类的方法还是子类的方法,与引用所对应的类型一致,而不是与指向的对象一致。如M m = new N();调用的任是M中的方法;2)父类和子类有无静态修饰不一致,则报错(即静态方法不能被覆盖,静态方法不能覆盖普通方法);3)父、子类中均是普通方法,则是重写(允许重写),可根据多态的特性选择调用。

3.     final修饰类,当一个类被final所修饰时,表示该类是一个终态类,即不能被继承。分析:

   public class FinalTest

{

    public static void main(String args[])

    {

          F f = F();

    }

}

final class E   //该类不能被继承

{

 

}

class F extends E

{

   

}错误:无法从最终类E进行继承。

4.     final修饰方法:当一个方法被final所修饰时,表示该方法是一个终态方法。即不能被重写

5.  final修饰属性:当一个属性被final所修饰时,表示该属性不能被改写。

总之:final修饰的东西不能再改变。

 分析:public class FinalTest

{

    public static void main(String args[])

    {

          People people = new People();

          //people.address = new Address();//错误:无法为最终变量分配值

          people.address.name = "shanghai";//正确;

    }

}

class People

{

    final Address address = new Address();

}

class Address

{

    String name = "beijing";

}结论:1address是一个引用变量,它的值指向new Address()对象,由于fianl所修饰的变量值不能改变,即变量address指向的对象不能再改变,因此people.address = new Address();错误;2)而people.address.name = "shanghai";address所指对象的地址没有变,只是其中的内容发生变化,只要最终变量address存储的对象的地址不发生变化,内容是可以变化的

6.  final修饰一个原生数据类型时,表示该原生数据类型的值不能发生变化(比如不能从10变为20);如果final修饰一个引用类型时,表示该引用类型不能再指向其他的对象了,当爱引用所指向的对象的内容是可以变化的。

7.  对于final类型成员变量,一般来说有两种付初值方式:

  1)在声明final类型的成员变量时就赋上初值;

2)在声明final类型的成员变量时不赋初值,但在类的所有构造方法中都为其赋上初值。

 

8.  Static代码块:静态代码块,静态代码块的作用是完成一些初始化工作。首先执行静态代码块,然后执行构造方法,静态代码块在类被加载的时候执行,而构造方法是在生成对象的时候执行;要想调用某个类来生成对象,首先需要将类加载到java虚拟机上,然后由JVM加载这个类来生成对象

9.  类的静态代码块只会执行一次,是在类被加载的时候执行的,因为每个类只会被加载一次,所以静态代码块只会被执行一次;而构造方法则不然,每次生成一个对象的时候都会调用类的构造方法,所以new一次就会调用构造方法一次。

10.  如果继承体系中既有构造方法,又有静态代码块,那么首先执行最顶层的类的静态代码块,一直执行到最底层类的静态代码块,然后再去执行最顶层的类的构造方法,一直执行到最底层的构造方法。注意:静态代码块只会执行一次。

11.  不能在静态方法中访问非静态成员变量;可以在静态方法中访问静态的成员变量;可以在非静态方法中访问静态的成员变量

总结:静态的只能访问静态的,非静态的可以访问一切。

12.  不能在静态方法中使用this关键字,因为:静态方法可由类直接调用。而this是代表对象的,无实例怎会有对象

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值