static 、final、abstract、interface

来源:互联网 发布:工控机跑linux 编辑:程序博客网 时间:2024/05/13 21:33
 1.static
  static可以修饰属性、方法、初始化块和内部类。
   static修饰的属性为类变量,也称为静态变量,每个类只有一个,是该类的所有对象所共同拥有的,访问时可以用“类名.变量名”或者“引用.变量名”来访问。任何对象对静态变量做修改,其他对象看到的是修改后的值;静态变量可以用作计数器,用来计数创建对象的个数。静态变量是在类加载的时候初始化的,只初始化一次。
   static修饰的方法是静态方法,是类的所有对象所共同拥有的一个功能,使用时也是可以用对象或者类名来调用,静态方法里不能直接访问实例变量(非静态变量),并且在静态方法里不能出现this或者super 。  
              静态方法只能被静态方法覆盖,覆盖以后不体现多态,因为静态方法只看编译时类型,即根据编译时类型确定运行的方法。即运行该引用的类里面的该方法!!!
  static修饰的初始化块是静态初始化块  类里面的一个独立的代码块称为初始化块;
                   静态初始化块在类第一次被加载时执行,只执行一次,并且是在静态变量初始化后执行的。
  例如:class a{
                      static{      xxxxxxxx     }
                     }
   static 修饰的内部类是静态内部类,位于类之内,方法之外,用static修饰。其余性质见内部类一节。
 
            类加载:Jvm在第一次使用一个类时,会根据classpath所指定的路径去找这个类所对应的字节码文件,并读进Jvm保存起来,这个过程称之为类加载。
2.final
    用final修饰的类:该类不能被继承,不能被继承意味着不能改变里面的代码。对虚拟机的正常运行有重要作用的类通常是final的,如:String,System,Math等等。
    用final修饰的方法:用final修饰的方法不能被覆盖,用final修饰的类里面的方法更不能覆盖,因为这样的类连子类都不能有!   
    final和private的区别:用final修饰的方法不能覆盖但是能继承!用private修饰的方法不能被继承,所以谈不上覆盖···
   对于变量:final修饰的变量就是常量,通常final和static连用来声明常量。例如:final static int num=3;
                 final修饰引用类型数据时,引用(地址)不能变,引用所指向的内存里的真正数据不受限制。
                如:final Person p = new Person(); p.age=34;不会出错,因为final修饰的是引用p,p不能变,而p所指向的人的年龄可以变化;而如果再出现一句p = new Person();则会出错了,因为p又指向了另一个对象!!
               final修饰的实例变量:在声明的同时赋值,或者在构造方法里赋值,只能选择一种方法!!
               final修饰的静态变量: 在声明的同时赋值,或者在静态初始化块里赋值,也只能选择一种方法赋值。因为已经用final修饰了,一旦赋值就不能再修改!
3.abstract
   1.abstract用于修饰类,这种类是抽象类,抽象类不能手动创建对象,即不可以用new关键字来调用其的构造方法创建对象。但是可以声明抽象类类型的引用;
   2.abstract用于修饰方法,这种方法是抽象方法,抽象方法只有方法的声明,没有方法体(即只定义了做什么,没有写怎么做··)。例如:public abstract void eat();抽象方法允许方法的定义和实现分开。
 含有抽象方法的类一定是抽象类。抽象类里不一定含有抽象方法。
 抽象类主是用来要被继承的,子类继承自抽象类,就要实现里面的抽象方法,如果不想让子类也是抽象类的话,必须实现父类里面的所有的抽象方法!
 抽象类也有构造方法,只是不能手动new对象而已,而当抽象类的子类new对象时也会调用该抽象类的构造方法来自动创建一个该类的对象包含在子类的对象中。 或者使用匿名内部类来new抽象类或者借口的对象,详见匿名内部类。
某些关键字不能同时使用:例如:1.abstract final void eat();  2. private abstract void eat();   3.  static abstract void eat();
   即  abstract不能和final,private,static连用。
 
 4. interface(接口)             
   接口是一个特殊的抽象类,与抽象类有相同点也有不同点,接口没有构造方法!
   里面的常量都是public,static,final的,默认为有这些修饰,接口里面只有常量,没有变量。
   里面的方法都是公开的(public)、抽象的(abstract)。 
  
   接口不能创建对象,但是可以声明一个接口类型的引用。
   接口存在的意义是被子类实现,用关键字implements。
   如果不想让子类也抽象,就要实现接口里面的所有的抽象方法 。
   实现接口的过程中注意方法的访问权限,必须为public的!!  
   
   接口本身支持多继承,继承了父接口里功能的定义。
   类可以同时继承一个父类,实现多个接口。     
   接口没有构造方法,不能创建对象
  
   接口的作用:
     1 多继承
        接口是对类的共性进行再次抽象,抽象出类的次要类型
        因为接口是次要类型,所以在类关系里不占一个节点,
        不会破坏类层次关系的树状结构  
     2. 标准(弱耦合)   
        一个接口就是一个标准,有了标准就可以实现弱耦合。
        接口将标准的制定者,标准的实现者以及标准的使用者分离开,降低实现者和使用者的耦合度。
        接口是java里一种重要的降低耦合的工具。       
       
        接口可以屏蔽不同实现类的差异,当底层的实现类更换后,不会对上层的使用者产生影响,体现在参数和返回值。
       多态也多在参数和返回值上体现,即将参数和返回值设为父类型,而实际上的参数和返回值是各种不同的子类型的对象,于是在实际运作的过程中的各种形参的各种方法(也就是父类的各种方法),其每一种方法运行起来都是根据实际参数或者对象的实际类型(运行时类型)来执行该子类对象的自己的方法。
 
 
 
  初始化的顺序:1父类的static变量 2父类的实例变量  3子类的static变量 4 子类的实例变量
         顺序为1324  
原创粉丝点击