public
和private
两个都是访问权限修饰符,用于控制外界对类内部成员的访问。
public
:表明对象成员是完全共有的,外界可以随意访问。用public
修饰的数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用。private
:表明对象成员是完全私有的,不容许外界的任何访问。private
表示私有,私有的意思就是除了class
自己之外,任何人都不可以直接使用,包括子类。static
:static
是控制类成员变化的修饰符之一static
:静态成员修饰符,其修饰的静态变量脱离具体对象独立存在,在内存中之后一份拷贝,所有的对象都公用这一个存储空间,所以对static修饰的静态变量进行的修改对该类的所有对象都起作用。static
修饰的静态函数代表所有对象的统一操作,只能调用静态变量。static
是针对面向对象中的“多态”而提出来的,static
修饰的静态成员不存在多态性。
static
表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static
代码块,但是Java
语言中没有全局变量的概念。怎么理解这句话?记住java
是一个面向对象的语言,万事万物皆对象,无论你做什么都需要创建一个对象,然后再调用这个对象的方法,所以java
中压根就没有所谓的“全局变量”,但是没有这个概念,不代表你不可以实现这个功能,java
存在的目的就是让人们使用它去达到人们想要的效果,所以static value
就可以达到全局变量的作用。
用public
修饰的static
成员变量和成员方法本质是全局变量和全局方法,当声明这个类的对象时,不会生成static
变量的副本,而是类的所有实例共享同一个static
变量。只要这个类被加载,Java
虚拟机就能根据类名在运行时数据区的方法区内找到他们。因此,static
对象可以在它的任何对象创建之前访问,无需引用任何对象。
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
方法其实是一个全新的方法,不是对基类方法的重写,仅仅是同名罢了。
对于静态变量在内存中只有一个拷贝(节省内存),JVM
只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
所以一般在需要实现以下两个功能时使用静态变量:
this
和super
关键字,不能直接访问所属类的实例变量和实例方法(就是不带static
的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!就是java
面向对象的思想,实例是你这个类本身的属性,你会用这个本身的属性去做一些事情,而这些事情不是固定的,不能像静态方法一样一成不变。static
方法独立于任何实例,因此static
方法必须被实现,而不能是抽象的abstract
。静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的。static
(静态的)就能创建这样的成员。如果一个成员被声明为static
,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static
。static
成员的最常见的例子是main()
。因为在程序开始执行时必须调用main()
,所以它被声明为static
。static
的方法有以下几条限制:
static
方法。static
数据。this
或super
。