面向对象_static,final,包
1.static
1.1 作用
方便在没有创建对象的情况下来进行调用(方法/变量)。
1.2 static变量
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化。
1.3 static方法
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。举个简单的例子:
1.4 static代码块
静态代码块是定义在成员位置,使用static修饰的代码块。
特点:
1.它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。
2.该类不管创建多少对象,静态代码块只执行一次。
3.可用于给静态变量赋值,用来给类进行初始化。
误区
1.static关键字会改变类中成员的访问权限吗?
Java中的static关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字。
提示错误"Person.age 不可视",这说明static关键字并不会改变变量和方法的访问权限。
2.能通过this访问静态成员变量吗?
虽然对于静态方法来说没有this,那么在非静态方法中能够通过this访问静态成员变量吗?先看下面的一个例子,这段代码输出的结果是什么?
this代表什么?this代表当前对象,那么通过new Main()来调用printValue的话,当前对象就是通过new Main()生成的对象。而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是33。在printValue方法内部的value是局部变量,根本不可能与this关联,所以输出结果是33。在这里永远要记住一点:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。
3.static能作用于局部变量么?
static是不允许用来修饰局部变量。
2.final
2.1 final关键字的含义
final表面意思就是不可更改的,恒量的意思
在Java中final修饰的就是常量,而且变量名要大写;
2.2 特点
1.修饰变量,被final修饰的变量必须要初始化,赋初值后不能再重新赋值。
2.修饰方法,被final修饰的方法代表不能重写。
3.修饰类,被final修饰的类,不能够被继承。
3.包
3.1 包的声明格式
通常使用公司网址反写,可以有多层包,包名采用全部小写字母,多层包之间用”.”连接
3.2 包的访问
在访问类时,为了能够找到该类,必须使用含有包名的类全名(包名.类名)。