`

java中修饰符的注意要点

阅读更多


abstract的的注意要点:

 

  abstract 修饰符可以用来修饰类和成员方法
  用 abstract 修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化,即不允许创建抽象类本身的实   例。没有用 abstract 修饰的类称为具体类,具体类可以被实例化。
  用 abstract 修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。没有用 abstract 修饰的方法称为具体方法,具体方法具有方法体。 

 abstract 语法规则:
        抽象类可以没有抽象方法,但包括了抽象方法的类必须被定义为抽象类。如果子类没有实现父类中所有的抽象方法,那么子类也必须被定义为抽象类。
       
以下一个父类

Java代码 复制代码
  1. package test;   
  2.   
  3. //抽象类   
  4.   
  5. abstract class Shape{   
  6.   
  7. //受保护的属性   
  8.      protected double length;   
  9.     protected double width;   
  10.         
  11.     //构造方法   
  12.      Shape(double num1,double num2){   
  13.                this.length = num1;   
  14.                this.width = num2;   
  15.        }                
  16.      //定义了一个抽象方法,方法体为空,只要有类继承就必须实现这个抽象方法,否则子类也必须声明为抽象类   
  17.      abstract double area();             
  18. }  

 


1、如果一个类包含了抽象方法,这个类也必须用 abstract 来修饰;但一个 abstract 类不一定非要包含抽象方法。
2、抽象方法必须要通过子类来实现,所以它不可以是静态的,也不可以是 final 的
3、同上原理,抽象类也不可以是 final 的。

 

 

static的注意要点:

类的成员变量有两种,一个是实例变量,没有被 static 修饰,一种是被 static 修饰过的变量,叫类变量或者静态变量。

     静态变量和实例变量的 区别: 
     静态变量在内存中只有一个拷贝,运行时JAVA虚拟机只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配。可以直接通过类名访问静态变量。
     对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。

      static 方法
      成员方法分为静态方法和实例方法。用 static 修饰的方法叫做静态方法,或者类方法。静态方法和静态变量一样,不需要创建类的实例,可以直接通过类名来访问。

      因为静态方法不需要通过它所属的类的任何实例就会被调用,因此在静态方法中不能使用 this 关键字,也不能直接访问所属类的实例变量和实例方法,但是可以直接访问所属类的静态变量和静态方法。

Java代码 复制代码
  1.          
  2. class StaticTest{   
  3.   
  4.         static int num =100;   
  5.         int num1 = 20;   
  6.   
  7.         static void staticMethod(){   
  8.            System.out.println("StaticMethod!");   
  9.            //System.out.println(this.num); //编译错误,在static 方法内,不能使用this 关键字   
  10.               //System.out.println(this.num1);//编译错误,在static 方法内,不能使用this 关键字   
  11.              //   System.out.println(num1);//编译错误,在static 方法内,不能直接访问非 static 变量或者方法   
  12.   
  13.             System.out.println(StaticTest.num);   
  14.         }   
  15.                
  16.           void LocalMethod(){   
  17.                        System.out.println("StaticMethod!");   
  18.            }   
  19.   
  20.                       
  21.   
  22.               public static void main(String args[]){   
  23.                        StaticTest t = new StaticTest();   
  24.   
  25.                        //静态变量被所有的实例共享   
  26.                           t.staticMethod();   
  27.                        System.out.println(t.num);   
  28.                        StaticTest.staticMethod();   
  29.                        System.out.println(StaticTest.num);   
  30.                    }   
  31.         }   
  32.   
  33.       //  总结:在静态方法内不允许访问非静态变量 不能出现 this 和 supper   
      
class StaticTest{

        static int num =100;
        int num1 = 20;

        static void staticMethod(){
           System.out.println("StaticMethod!");
           //System.out.println(this.num); //编译错误,在static 方法内,不能使用this 关键字
              //System.out.println(this.num1);//编译错误,在static 方法内,不能使用this 关键字
             //   System.out.println(num1);//编译错误,在static 方法内,不能直接访问非 static 变量或者方法

            System.out.println(StaticTest.num);
        }
            
          void LocalMethod(){
                       System.out.println("StaticMethod!");
           }

                   

              public static void main(String args[]){
                       StaticTest t = new StaticTest();

                       //静态变量被所有的实例共享
                          t.staticMethod();
                       System.out.println(t.num);
                       StaticTest.staticMethod();
                       System.out.println(StaticTest.num);
                   }
        }

      //  总结:在静态方法内不允许访问非静态变量 不能出现 this 和 supper 



类中可以包含静态代码块,它不存在于任何方法体中。在JAVA虚拟机加载类时会执行这些静态代码块。如果类中包含多个静态块,那么JAVA虚拟机将按照他们在类中出现的顺序依次执行它,并且每个代码块只会被执行一次。

Java代码 复制代码
  1. class StaticBlock{   
  2.   
  3.              static int i =5;   
  4.              int j;   
  5.              static{   
  6.                       System.out.println("First :"+i++);   
  7.                   }   
  8.   
  9.              static{   
  10.                       System.out.println("Sencond :" +i++);   
  11.                   }   
  12.                    
  13.              public static void main(String args[]){   
  14.                       StaticBlock s1 = new StaticBlock();   
  15.                       StaticBlock s2 = new StaticBlock();   
  16.                       System.out.println("Last :"+i);   
  17.                   }   
  18.        }  
 class StaticBlock{

              static int i =5;
              int j;
              static{
                       System.out.println("First :"+i++);
                   }

              static{
                       System.out.println("Sencond :" +i++);
                   }
                 
              public static void main(String args[]){
                       StaticBlock s1 = new StaticBlock();
                       StaticBlock s2 = new StaticBlock();
                       System.out.println("Last :"+i);
                   }
        }



      静态方法必须被实现
      静态方法用来表示某个类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。既然如此,当前类必须为静态方法提供实现,即一个静态的方法不能被定义为抽象方法。

      static 和 abstract 永远不能放在一起用

      如果一个方法是静态的,它就必须自力更生,自己实现该方法。
      如果一个方法是抽象的,那么它就只表示类所具有的功能,但不会去实现它,在子类中才会去实现它。

        作为程序入口的 main() 方法是静态方法

        因为把 main() 方法定义为静态方法,可以使得JAVA虚拟机只要加载了 main 方法所属的类,就能执行 main() 方法,而无须创建这个类的实例。

        在 main() 方法中不能直接访问实例变量和实例方法。

 

 


1、非静态的内部类不能包含静态的方法和成员。
2、静态的内部类可以用 final 或 abstract 修饰,但两者不可以同时用。

3、静态方法不会被继承,所以不可以是抽象的

 

 

final的注意要点:

 

       final 具有 不可更改的意思,它可以修饰非抽象类,非抽象成员方法和变量。
        用 final 修饰的类不能被继承,没有子类 如 String
       用 final 修饰的方法不能被子类的方法覆盖
        用 final 修饰的变量表示常量,只能被赋值一次
        用 final 不能修饰构造方法,因为方法覆盖这一概念仅适用于类的成员方法,而不适用于类的构造方法,父类的构造方法和子类的构造方法之间不存在覆盖关系,因此用 final 修饰构造方法是豪无意义的。

        父类中用 private 修饰的方法不能被子类的方法覆盖,因此 private 类型的方法默认是 final 类型的。
       
final 类
        String  类 ,不让继承,封装实现的细节。

final 方法
        在某些情况下,出于安全的原因,父类不允许子类覆盖某个方法,此时可以把这个方法声明为 finnal 类型。java.lang.Object 类,getClass()为 final 类型,equals()不为 final 类型。  

final 变量
        用 final 修饰的变量表示取值不会改变的常量。
        final 修饰符可以修饰静态变量,实例变量和局部变量,分别表示静态常量,实例常量和局部常量。

        例如 出生日期,年龄的限制等。
        final 变量都必须显示初始化,否则会导致编译错误。
        final 变量只能被赋值一次。
 
在程序中使用 final 修饰符来定义常量的作用
        提高程序的安全性,禁止非法修改取值固定并且不允许修改的数据
        提高程序代码的可维护性。


1、如果一个类已经是 final,再给里面的方法加上 final 是没有意义的。
2、final 和 static 同时用来修饰方法的话,因为 static 不存在继承,所以这时候 final 是多余的。
3、final 和 static 可以同时修饰成员,这是有意义的:表示该成员不依赖于类的实例,且只能赋值一次。
4、final 和 static 可以同时修饰内部类,这是有意义的:表示该内部类不依赖于其外部类的实例,而且不可以有子类。
5、抽象意味着必须要有继承,所以 abstract 和 final 任何时候都不可以同时使用

 

在程序中使用 final 修饰符来定义常量的作用
        提高程序的安全性,禁止非法修改取值固定并且不允许修改的数据
        提高程序代码的可维护性。

 

 

public protected default private 的注意要点
位置            private 默认 protected   public
同一个类               是 是 是     是
同一个包内的类    否 是 是     是
不同包内的子类    否 否 是     是
不同包并且不是子类    否 否 否     是

public 访问权限最高,不论是不是同一个包或是否是子类 都可以访问
protected 其次只有是不同包且不是子类的无法访问外,其它均可
默认级别 次之,要求只能是同一个包中的类才能访问
private 只能是同一个类才能访问 

 

 

transient 的注意要点
   首先是JAVA的序列化,简单来说就是将某一个类存储以文件形式存储在物理空间,下次再从本地还原的时候,还可以将它转换回来,这种形式便利了网络上的一些操作。

   序列化只能保存对象的非静态成员交量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符都不能保存。

   以文件形式描述某些信息时,容易涉及到安全问题,因为数据位于Java运行环境之外,不在Java安全机制的控制之中。对于这些需要保密的字段,不应保存在永久介质中 ,或者不应简单地不加处理地保存下来 ,为了保证安全性。应该在这些字段前加上transient关键字。 它的意思是临时的,即不会随类一起序列化到本地,所以当还原后,这个关键字定义的变量也就不再存在。

如果TransTest 类的一个对象被序列化,i的内容不被保存,但j的将被保存。

Java代码 复制代码
  1. class TransTest {      
  2.   transient int i;   //不需要保存      
  3.    int j;            //需要保存      

Synchronize 的注意要点
   先提出问题,如果开启多线程同时操作同一实例变量,Thread-0线程从主内存中取出的值a 为 1,然后a++;  Thread-1线程也从主内存中取出的值 a 进行 a+=2操作;Thread-0存入2到主内存中,Thread-1也存入,这样就覆盖了Thread-0存入的值.
 
   原因是在JAVA 的内存模型中,是每一个进程都有一个主内存,每个线程都有自己的内存,线程从主内存取得数据,计算后再存回到主内存中.

   解决这个问题就可以使用 synchronize关键字.
   使用synchronized修饰此方法后,把下面的这几个步骤当作一个原子操作:取数据,操作数据,存数据。原子操作是不能够被打断的,所以就保证了数据的一致性,这样在同一时间有线程再执行,虽然在效率上比较有影响,但是能够保证在同一时间只有一个线程能够访问到这一块内存单元。



 

分享到:
评论

相关推荐

    21天学会Java之(Java SE第五篇):继承、常用的关键字、封装及权限修饰符、多态

    文章目录继承常用的关键字this关键字static关键字super关键字final关键字封装及权限修饰符封装的作用及其优点权限修饰符封装的使用细节多态多态的概念多态的使用要点对象的转型instanceof运算符类型自动提升及强制...

    Java2游戏编程.pdf

    3.6 类修饰符 3.7 接口 3.8 快捷地创建类 3.9 包 3.10 总结 3.11 练习 第4章 Java API为你服务:常用Java类 4.1 java.lang包 4.1.1 java.lang.Object 4.1.2 java.lang.String 4.1.3 java.lang.StringBuffer 4.1.4 ...

    javaSE整体学习总结,超级全面

    import(导入类),package(包机制),继承(extends)使用要点,implements,方法的重写(override),final(关键字)使用,instanceof(关键字),组合的核心,super本质是什么,封装(encapsulation),封装的简单规则,访问权限修饰符,...

    J2SE技术总结-Java学习精华教程-电子书

    自定义时使用修饰符 .....继承和多态 ..........继承(扩展) ..........多态 .....接口和抽象类 ..........接口和抽象类 ..........接口和抽象类相关设计模式 .....GUI(图形用户界面)和Applet ..........GUI_添加组件...

    connect-four-tester:面向Java Connect Four项目入门的Connect Four测试器

    (将GraderRunner.java和GamesStatistics.java添加到项目中,并在Connect4Game中更改了某些访问修饰符。) 使用说明 将学生的MyAgent.java文件复制到src/main/java目录。 在命令行上运行./gradlew 。 (Windows...

    程序员考试刷题-Learning-Java:尝试使用git来学习和记录java特性

    程序员考试刷题讲座问题/杂记 使用hackerrank、codecademy、codesignal解决练习题 修改数组,比较 公共和静态是默认的?...通过使用访问修饰符和 getter/setter 来隐藏数据实现,以确保安全性和干净、可扩展

    TerrariaClone:spa难以理解的意大利面条式代码

    没有访问修饰符。 一切都是包私有的。 为了避免声明局部变量和循环索引,所有内容的所有变量都在类级别全局声明。 这是TerrariaClone.java几百行声明之一: int x, y, i, j, k, t, wx, wy, lx, ly, tx, ty,

    精通正则表达式~~~

    表达式编译、/o修饰符、qr/···/和效率... 348 理解“原文”副本... 355 Study函数... 359 性能测试... 360 正则表达式调试信息... 361 结语... 363 第8章:Java. 365 Java的正则流派... 366 Java对\p{…...

    我的编程感悟(中文PDF)(共37M二分卷)分卷二

    7.2.6 SIMD编程注意要点 203 7.2.7 SIMD的性能检测 204 第8章 引擎中的优化 205 8.1 Blit的优化 207 8.2 脏矩形优化 209 8.2.1 “风魂”中改进的脏矩形算法 215 8.2.2 滚动优化 219 8.2.3 覆盖优化 222 8.2.4 脏矩形...

    我的编程感悟(中文PDF)(共37M二分卷)分卷一

    7.2.6 SIMD编程注意要点 203 7.2.7 SIMD的性能检测 204 第8章 引擎中的优化 205 8.1 Blit的优化 207 8.2 脏矩形优化 209 8.2.1 “风魂”中改进的脏矩形算法 215 8.2.2 滚动优化 219 8.2.3 覆盖优化 222 8.2.4 脏矩形...

    Visual C++ 2005入门经典--源代码及课后练习答案

    2.3.3 整型修饰符 47 2.3.4 布尔类型 48 2.3.5 浮点类型 48 2.3.6 ISO/ANSI C++中的基本类型 49 2.3.7 字面值 50 2.3.8 定义数据类型的同义词 50 2.3.9 具有特定值集的变量 51 2.3.10 指定枚举常量...

    Tcl_TK编程权威指南pdf

    修饰符 事件序列 虚拟事件 事件关键词 第4部分 tk组件 第27章 按钮与菜单 按钮命令与作用域问题 与tcl变量关联的按钮 按钮属性 按钮操作 菜单和菜单按钮 键盘遍历 操纵菜单和菜单条目 菜单属性 通过...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    5.2.5 使用const修饰符 224 5.2.6 rvalue引用形参 225 5.2.7 main()函数的实参 227 5.2.8 接受数量不定的函数实参 229 5.3 从函数返回值 231 5.3.1 返回指针 231 5.3.2 返回引用 233 5.3.3 函数中的静态变量...

Global site tag (gtag.js) - Google Analytics