美文网首页Java
Java基础篇一一访问控制、static、final

Java基础篇一一访问控制、static、final

作者: Help_II | 来源:发表于2020-11-19 10:14 被阅读0次

    访问控制符

    是一组限定类、属性或方法是否可以被程序里的其他部分访问和调用的修饰符。

    类的访问控制符只能是空或者 public,方法和属性的访问控制符有 4 个,分别是 public、 private、protected 和 friendly,其中 friendly 是一种没有定义专门的访问控制符的默认情况。

    访问控制修饰符的权限如表 1 所示。

    访问范围 private friendly(默认) protected public
    同一个类 可访问 可访问 可访问 可访问
    同一包中的其他类 不可访问 可访问 可访问 可访问
    不同包中的子类 不可访问 不可访问 可访问 可访问
    不同包中的非子类 不可访问 不可访问 不可访问 可访问

    访问控制在面向对象技术中处于很重要的地位,合理地使用访问控制符,可以通过降低类和类之间的耦合性(关联性)来降低整个项目的复杂度,也便于整个项目的开发和维护。

    static关键字

    static只能修饰成员英文含义静态

    修饰属性

    1.被static修饰的属性所有对象共享同一个值

    2.被static修饰的属性值会被保存在内存的方法区中

    3.当该类的所有对象共享一个资源时,将这个资源设置为静态能够节省内存

    4.静态属性使用类名调用

    5.静态属性也称为类属性

    修饰方法

    1.被static修饰的方法称之为静态方法,类方法

    2.静态方法可以直接使用类名调用无需实例化对象

    3.静态方法中无法调用普通(实例)属性和方法,因为静态方法中没有this

    4.如果一个不需要访问当前类中的实例成员就可以定义称静态的

    5.静态方法不能被重写

    修饰初始化块

    什么是初始化块

    在代码中直接编写{},{}中的内容就是初始化块

    初始化块中的内容会在构造方法运行前运行

    被static修饰的初始化块只会运行一次

    运行时机是JVM使用这个类之前,JVM加载类时运行静态块

    加载类的情况

    实例化对象

    使用类名调用静态成员

    反射

    static修饰成员变量

    用static修饰的成员变量不属于对象的数据结构,static变量是属于类的变量,通常可以通过类名来引用static成员。Static成员变量和类的信息一起存储在方法区而不是在堆中,一个类的static成员变量只有“一份”,无论该类创建了多少对象。

    Static修饰方法

    通常说的方法都会涉及到对具体对象的操作,这些方法在调用时,需要隐式的传递对象的引用(this)。

    int d=p1.distance(p2);
    

    调用distance方法时,除了传递p2参数外,还隐式的传递了p1作为参数,在方法中的this关键字即表示该参数

    static修饰的方法则不需要针对某些对象进行操作,其运行结果仅仅与输入的参数有关,调用时直接用类名引用。

    double c=Math.sqrt(3.0*3.0+4.0*4.0);
    

    该方法在调用时,没有隐式的传递对象引用,因此在static方法中不可以使用this关键字。

    由于static在调用时没有具体的对象,因此在static方法中不能对非static成员(对象成员)进行访问。Static方法的作用在于提供一些“工具方法”和“工厂方法”等。

    ... ... ...
    
    Point.distance(Point p1,Point p2)
    
    RandomUtils.nextInt()
    
    StringUntils.leftPad(String str,int size,char padChar)
    
    ... ... ...
    
    Math.sqrt() Math.sin() Arrays.sort()
    

    static块

    static块属于类的代码块,在类加载期间执行的代码块,只执行一次,可以用来在软件中加载静态资源。

    编写一个 Java 类,在类中定义一个静态变量,然后使用静态代码块修改静态变量的值。最后在 main() 方法中进行测试和输出。

    public class StaticCode {    
    public static int count = 0;    
    {       
     count++;        
    System.out.println("非静态代码块 count=" + count);   
     }    static {        
    count++;        
    System.out.println("静态代码块1 count=" + count);    
    }    static {        count++;        
    System.out.println("静态代码块2 count=" + count);    
    }    
    public static void main(String[] args) {        
    System.out.println("*************** StaticCode1 执行 ***************");        
    StaticCode sct1 = new StaticCode();        
    System.out.println("*************** StaticCode2 执行 ***************");        
    StaticCode sct2 = new StaticCode();    
    }}
    

    上述代码中 { } 代码块为非静态代码块,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。代码域中定义的变量都是局部的,只有域中的代码可以调用。

    final关键字

    final:(最终)是一个修饰u符。

    1.final可以修饰类,函数,变量(成员变量,局部变量)。

    2.被final修饰后的类不可以被其他类继承。

    3.被final修饰后的函数不可以被重写。

    3.被final修饰后的变量不允许被再次赋值。

    final在对变量进行修饰时一定赋值,被final修饰后的变量我们称为变量。

    <u style="box-sizing: border-box;">注意:</u>

    常量的命名规范;

    都要大写,如果这个名字是由多个单词组成的,在单词之间用下划线隔开。

    修饰类: 表示这个类不能被继承 修饰方法: 表示这个方法不允许被子类重写 修饰成员变量(属性): 属性值不能被修改 赋值时: 要么声明时赋值 要么构造方法中赋值 修饰局部变量: 修饰方法中声明的变量只能被赋值一次

    修饰方法的形式参数不能修改

    final修饰变量

    final关键字修饰成员变量,意为不可改变。final修饰成员变量有以下两种方式初始化:声明的同时初始化;构造函数中初始化。final关键字也可以修饰局部变量,使用之前初始化即可。

    public class Emp{
    
    private final int no=100;//final变量声明时初始化
    
    public void testFinal(){
    
    no=99;
    
    }//编译错误,final的变量不可以改变
    
    }
    

    final修饰方法和类

    final关键字修饰的方法不可以被重写,使一个方法不能被重写的意义在于:防止子类在定义新方法时造成“不经意”重写

    final关键字修饰的类不可以被继承。

    final class Foo{ } class Goo extends Foo{ } //编译错误
    

    JDK中有一些基础类库被定义为final的,例如:String、Math、Integer、Double等等。是一个类不能被继承的意义在于:可以保护类不被继承修改,可以控制滥用继承对系统造成的危害。

    static final常量

    static final修饰的成员变量称为常量,必须声明的同时初始化,不可被改变。

    static final常量会在编译器被替换。如图:

    final 修饰符使用总结

    1. final 修饰类中的变量

    表示该变量一旦被初始化便不可改变

    ,这里不可改变的意思

    对基本类型变量来说是其值不可变,而对对象引用类型变量来说其引用不可再变

    。其初始化可以在两个地方:一是其定义处,也就是说在 final 变量定义时直接给其赋值;二是在构造方法中。这两个地方只能选其一,要么在定义时给值,要么在构造方法中给值,不能同时既在定义时赋值,又在构造方法中赋予另外的值。

    2. final 修饰类中的方法

    说明这种方法提供的功能已经满足当前要求,不需要进行扩展,并且也不允许任何从此类继承的类来重写这种方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。在声明类中,一个 final 方法只被实现一次。

    3. final 修饰类

    表示该类是无法被任何其他类继承的,意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。

    对于 final 类中的成员,可以定义其为 final,也可以不是 final。而对于方法,由于所属类为 final 的关系,自然也就成了 final 型。也可以明确地给 final 类中的方法加上一个 final,这显然没有意义。

    相关文章

      网友评论

        本文标题:Java基础篇一一访问控制、static、final

        本文链接:https://www.haomeiwen.com/subject/dvdkiktx.html