轻松理解Java中的public、private、static和final

发布时间 2023-07-20 19:00:23作者: ACAI-cc

一、概念
1、public和private
两个都是访问权限修饰符,用于控制外界对类内部成员的访问。

  • public:表明对象成员是完全共有的,外界可以随意访问。用public修饰的数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用。
  • private:表明对象成员是完全私有的,不容许外界的任何访问。private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,包括子类。

2、static:static是控制类成员变化的修饰符之一。
 static:静态成员修饰符,其修饰的静态变量脱离具体对象独立存在,在内存中之后一份拷贝,所有的对象都公用这一个存储空间,所以对static修饰的静态变量进行的修改对该类的所有对象都起作用。static修饰的静态函数代表所有对象的统一操作,只能调用静态变量。static是针对面向对象中的“多态”而提出来的,static修饰的静态成员不存在多态性。
 static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。怎么理解这句话?记住java是一个面向对象的语言,万事万物皆对象,无论你做什么都需要创建一个对象,然后再调用这个对象的方法,所以java中压根就没有所谓的“全局变量”,但是没有这个概念,不代表你不可以实现这个功能,java存在的目的就是让人们使用它去达到人们想要的效果,所以static value就可以达到全局变量的作用。
 进一步解释一下。用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明这个类的对象时,不会生成static变量的副本,而是类的所有实例共享同一个static变量。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

3、final:final也是控制类成员变化的修饰符。
 final:final用来修饰方法和属性表示特殊的意义。修饰方法时表示方法不能被重写;修饰属性时表示属性不能被改变,这里属性又分为对象和基本类型,修饰基本类型表示基本类型赋值以后不能再被赋值,修饰对象表示这个属性不能再指向其他对象(引用不变),但是他指向的这个对象本身还是可以被改变的。
 使用final关键字可以声明类、成员变量和成员方法,一经声明,便不可继承、不可修改和不能覆盖。还有,final方法不能被子类覆盖。编译器在调用final方法时会转入内嵌机制(直接将方法主体插入到调用处),大大提高执行效率(50%左右)。API类中的许多方法,如Object类中的getClass方法为final方法。同时,final还不能用于修饰构造方法。

特殊情况:

        class Base {
                private final void method() {
                        System.out.println(“In Base…”);
                }
        }
        class Sub extends Base {
                public void method() {
                        System.out.println(“In Sub…”);
                }
       }

大家看上边的代码,虽然父类和子类中都有method这个方法,但是不算是重写,因为基类中的method方法的访问修饰符是private,就表示这个方法是私有的,对子类是不可见的,所以子类中的method方法其实是一个全新的方法,不是对基类方法的重写,仅仅是同名罢了。

4、静态变量和实例变量的区别
 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
 对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
所以一般在需要实现以下两个功能时使用静态变量:

  • 在对象之间共享值时
  • 方便访问变量时

5、静态方法

  • 静态方法可以直接通过类名调用,任何的实例也都可以调用静态方法。静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!就是java面向对象的思想,实例是你这个类本身的属性,你会用这个本身的属性去做一些事情,而这些事情不是固定的,不能像静态方法一样一成不变。

  • 由于static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的。

  • 有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。

  • 声明为static的方法有以下几条限制:

    • 它们仅能调用其他的static 方法。
    • 它们只能访问static数据。
    • 它们不能以任何方式引用this 或super