1. Java作用域
在此前的章节中,我们不止一次的使用到了public
private
protected
等等修饰符;
这是修饰符代表了不同的权限;
2. public
被public
修饰的类(class
)、接口(interface
),可以被其他任何包下的任何类访问!
Student.java
public class Student {
public void hello() {
System.out.println("Hello Public!");
}
}
Main.java
,可以访问Student
中的hello
方法,因为public
修饰了Student
类和hello
方法
public class Main {
public static void main(String[] args) {
Student s = new Student();
s.hello();
}
}
当然,上面说了:"因为public
修饰了Student
类和hello
方法",所以要想访问某个类中的某个方法,除了该类是public修饰外,还需要该方法被public修饰。
也即是说,你要访问某个方法,首先你得有权限访问该方法所在的类!
3. private
被定义成private
的字段或者方法无法被外界访问,不管该类是否被public
修饰;
package test07;
public class Student {
private int age;//无法被外界访问
private void test() {
System.out.println("该方法也无法被外界访问!");
}
}
值得一说的是,Java有内部静态类,内部静态类可以访问该类的private方法
package test07;
public class Student {
private int age;//无法被外界访问
private static int id = 1;
static class h {
public void print() {
System.out.println(Student.id);
// 同样通过"类名.属性(方法)名"来访问!
// 该静态类可以访问父类的id字段
}
}
}
如上,该静态类(h
)可以访问父类(Student
)的id字段,但是请注意:静态类智能访问静态方法或属性,所以对于父类的非静态属性、方法,依然是无法访问的!
4. protected
protected
主要作用于继承关系,被protected
修饰的字段、方法子类可以访问;
5. package
最后,包作用域是指一个类允许访问同一个包的没有public、protected、private修饰的class,以及没有public、protected、private修饰的字段和方法。
class Dog {
void shout() {
System.out.println("狗吠....");
}
}
Main.java
package test07;
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.shout();
}
}
但请注意:包名必须完全一致,包没有父子关系,com.misiai和com.misiai.child是不同的包。
6. 局部变量
局部变量根据定义形式的不同,又可以分为如下三种:
1、形参:在定义方法签名时定义的变量,形参的作用域在整个方法中都有效
2、方法局部变量:在方法体内定义的局部变量,它的作用域是从定义该变量的地方生效,到该方法结束时失效
3、代码块局部变量:这个局部变量的作用域从定义该变量的地方生效,到该代码结束时失效。
一个变量只在一对{}中起作用。
java允许局部变量和成员变量同名,如果方法中局部变量和成员变量同名,局部变量就会覆盖成员变量;
如果需要在这个方法中引用被覆盖成员变量,则可使用this(对于实例变量)或类名(对于类变量)作为调用者来限定访问成员变量。
7. final
Java还提供了一个final修饰符。final与访问权限不冲突,它有很多作用。
1、用final修饰class可以阻止被继承:
package test01;
// 无法被继承:
public final class Hello {
private int n = 0;
protected void hi(int t) {
long i = t;
}
}
2、用final修饰method可以阻止被子类覆写:
package test01;
public class Hello {
// 无法被覆写:
protected final void hi() {
}
}
3、用final修饰field可以阻止被重新赋值:
package test01;
public class Hello {
private final int n = 0;
protected void hi() {
this.n = 1; // error!
}
}
4、用final修饰局部变量可以阻止被重新赋值:
package test01;
public class Hello {
protected void hi(final int t) {
t = 1; // error!
}
}
5、final+static修饰的变量是常量:
public static final int COUNT = 1;