欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java的访问修饰符与变量的作用域讲解

程序员文章站 2024-03-05 20:59:19
java访问修饰符(访问控制符) java 通过修饰符来控制类、属性和方法的访问权限和其他功能,通常放在语句的最前端。例如: public class cl...

java访问修饰符(访问控制符)
java 通过修饰符来控制类、属性和方法的访问权限和其他功能,通常放在语句的最前端。例如:

public class classname {
  // body of class
}
private boolean myflag;
static final double weeks = 9.5;
protected static final int boxwidth = 42;
public static void main(string[] arguments) {
  // body of method
}

java 的修饰符很多,分为访问修饰符和非访问修饰符。本节仅介绍访问修饰符,非访问修饰符会在后续介绍。

访问修饰符也叫访问控制符,是指能够控制类、成员变量、方法的使用权限的关键字。

在面向对象编程中,访问控制符是一个很重要的概念,可以使用它来保护对类、变量、方法和构造方法的访问。

java支持四种不同的访问权限:
Java的访问修饰符与变量的作用域讲解
public:公有的

被声明为public的类、方法、构造方法和接口能够被任何其他类访问。

如果几个相互访问的public类分布在不用的包中,则需要导入相应public类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。

下面的方法使用了公有访问控制:

public static void main(string[] arguments) {
  // body of method
}

java程序的main() 方法必须设置成公有的,否则,java解释器将不能运行该类。
protected:受保护的

被声明为protected的变量、方法和构造方法能被同一个包中的任何其他类访问,也能够被不同包中的子类访问。

protected访问修饰符不能修饰类和接口,方法和成员变量能够声明为protected,但是接口的成员变量和成员方法不能声明为protected。

子类能访问protected修饰符声明的方法和变量,这样就能保护不相关的类使用这些方法和变量。

下面的父类使用了protected访问修饰符,子类重载了父类的bark()方法。

public class dog{
  protected void bark() {
    system.out.println("汪汪,不要过来");
  }
}
class teddy extends dog{ // 泰迪
  void bark() {
    system.out.println("汪汪,我好怕,不要跟着我");
  }
}

如果把bark()方法声明为private,那么除了dog之外的类将不能访问该方法。如果把bark()声明为public,那么所有的类都能够访问该方法。如果我们只想让该方法对其所在类的子类可见,则将该方法声明为protected。
private:私有的

私有访问修饰符是最严格的访问级别,所以被声明为private的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为private。

声明为私有访问类型的变量只能通过类中公共的getter/setter方法被外部类访问。

private访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。

下面的类使用了私有访问修饰符:

public class dog{
  private string name;
  private int age;
  public string getname() {
    return name;
  }
  public void setname(string name) {
    this.name = name;
  }
  public int getage() {
    return age;
  }
  public void setage(int age) {
    this.age = age;
  }
}

例子中,dog类中的name、age变量为私有变量,所以其他类不能直接得到和设置该变量的值。为了使其他类能够操作该变量,定义了两对public方法,getname()/setname() 和 getage()/setage(),它们用来获取和设置私有变量的值。

this 是java中的一个关键字,本章会讲到,你可以点击 java this关键字详解 预览。

在类中定义访问私有变量的方法,习惯上是这样命名的:在变量名称前面加“get”或“set”,并将变量的首字母大写。例如,获取私有变量 name 的方法为 getname(),设置 name 的方法为 setname()。这些方法经常使用,也有了特定的称呼,称为 getter 和 setter 方法。
默认的:不使用任何关键字

不使用任何修饰符声明的属性和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为public static final,而接口里的方法默认情况下访问权限为public。

如下例所示,类、变量和方法的定义没有使用任何修饰符:

class dog{
  string name;
  int age;
 
  void bark(){ // 汪汪叫
    system.out.println("汪汪,不要过来");
  }
  void hungry(){ // 饥饿
    system.out.println("主人,我饿了");
  }
}

访问控制和继承

请注意以下方法继承(不了解继承概念的读者可以跳过这里,或者点击 java继承和多态 预览)的规则:
父类中声明为public的方法在子类中也必须为public。
父类中声明为protected的方法在子类中要么声明为protected,要么声明为public。不能声明为private。
父类中默认修饰符声明的方法,能够在子类中声明为private。
父类中声明为private的方法,不能够被继承。
如何使用访问控制符

访问控制符可以让我们很方便的控制代码的权限:
当需要让自己编写的类被所有的其他类访问时,就可以将类的访问控制符声明为 public。
当需要让自己的类只能被自己的包中的类访问时,就可以省略访问控制符。
当需要控制一个类中的成员数据时,可以将这个类中的成员数据访问控制符设置为 public、protected,或者省略。

java变量的作用域
在java中,变量的作用域分为四个级别:类级、对象实例级、方法级、块级。

类级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以与 c/c++ 中的 static 变量对比学习。类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化。

对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问。

方法级变量就是在方法内部定义的变量,就是局部变量。

块级变量就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如 if、for 语句的块。块是指由大括号包围的代码,例如:

{
  int age = 3;
  string name = "www.weixueyuan.net";
  // 正确,在块内部可以访问 age 和 name 变量
  system.out.println( name + "已经" + age + "岁了");
}
// 错误,在块外部无法访问 age 和 name 变量
system.out.println( name + "已经" + age + "岁了");

说明:
方法内部除了能访问方法级的变量,还可以访问类级和实例级的变量。
块内部能够访问类级、实例级变量,如果块被包含在方法内部,它还可以访问方法级的变量。
方法级和块级的变量必须被显示地初始化,否则不能访问。

演示代码:

public class demo{
public static string name = "微学苑"; // 类级变量
public int i; // 对象实例级变量
// 属性块,在类初始化属性时候运行
{
int j = 2;// 块级变量
}
public void test1() {
int j = 3; // 方法级变量
if(j == 3) {
int k = 5; // 块级变量
}
// 这里不能访问块级变量,块级变量只能在块内部访问
system.out.println("name=" + name + ", i=" + i + ", j=" + j);
}
public static void main(string[] args) {
// 不创建对象,直接通过类名访问类级变量
system.out.println(demo.name);

// 创建对象并访问它的方法
demo t = new demo();
t.test1();
}
}

运行结果:

微学苑
name=微学苑, i=0, j=3