重新开始学Java——访问权限修饰符与变量

在Oracle中的学习文档中描述了两种访问权限修饰符:

At the top level—public, or package-private (no explicit modifier).
At the member level—public, private, protected, or package-private (no explicit modifier).

但是我们发现,这里所描述的修饰符一共就只有四种:

public 
package-private(no explicit modifier )
protected
private

而且在学习文档中也说明了他们的访问权限。但是先明确访问权限修饰符的本质就是要限制某些访问情况(在没有学习反射的情况下)。如下所示:

而且也说明了什么情况下是可以访问的。

The first data column indicates whether the class itself has access to the member defined by the access level. As you can see, a class always has access to its own members. The second column indicates whether classes in the same package as the class (regardless of their parentage) have access to the member. The third column indicates whether subclasses of the class declared outside this package have access to the member. The fourth column indicates whether all classes have access to the member.

翻译过来就是说:第一个数据列指示类本身是否有权访问由访问级别定义的成员。如您所见,类总是能够访问它自己的成员。第二列表示与类相同包中的类(不管它们的出身如何)是否能够访问成员。第三列表示在此包之外声明的类的子类是否可以访问该成员。第四列表示所有类是否都可以访问成员。

简单描述就是说:在自己的类中,可以访问这些修饰符所修饰的所有东西,当在同一个包中的时候,只能访问public、protected和没有修饰符修饰的东西,子类只能访问public和protected修饰的东西,所有类都可以访问的只能是public修饰的东西。

但是关于访问修饰符我们应该如何选择呢?官方也给出了一定的建议(不一定试用)

If other programmers use your class, you want to ensure that errors from misuse cannot happen. Access levels can help you do this.

	Use the most restrictive access level that makes sense for a particular member. Use private unless you have a good reason not to.
	Avoid public fields except for constants. (Many of the examples in the tutorial use public fields. This may help to illustrate some points concisely, but is not recommended for production code.) Public fields tend to link you to a particular implementation and limit your flexibility in changing your code.

个人建议:还是按照Java规范走比较好,或者是采用封装的特性也是可以的。

变量

	变量( Variable) 是计算机存储器中的一块命名的空间。可以在里面存储一个值( Value) , 存储的值是可以随时变的,正因为变量的值可以随时变所以才叫变量。

Java 语言变量的分类

根据定义变量的位置不同, 可以分为:
	成员变量 - 定义在类体括号内, 也就是前面提到的属性
	实例属性 - 没有被 static 修饰的属性
	类属性(静态属性) - 被 static 修饰的属性
	局部变量 - 在一个方法内部、 或者代码块中定义的变量

无论是成员变量还是局部变量, 都遵循相同的命名规则:

必须是合法的标识符(参见 CoreJava_Base 部分)
习惯上, 首单词全小写, 第二个单词起每个单词首字母大写

变量的作用域:

	成员变量的作用域
		类属性(类变量, 被 static 修饰的属性), 作用域最大
		其作用范围是整个类, 只要类存在类属性就存在
	同一个类的不同实例可以共享类属性
		即使类的实例全部消失了, 类属性依然存在, 依然可以通过类名访问
		
		
	实例属性(实例变量, 没有被 static 修饰)
		其作用范围是整个类体括号内
			实例属性随实例存在而存在, 实例消失实例属性也消失
	局部变量的作用域 :局部变量的作用域最小
		其作用域就是定义它(声明它)的语句块括号内
		如果是做形参, 其作用域就是当前方法内(整个方法内部)
		如果是方法内部的局部变量, 其作用域是定义它的代码块括号内
	代码块局部变量, 作用域在代码块内部
	
	所有的变量, 都必须先声明后使用

核心

核心:
	变量:没有被 final 修饰,成员变量分为静态和非静态的;有局部变量之分。
	常量:被 final 修饰,通常 管 public static final 修饰的成员叫常量
	但是也要注意,只要被 final 修饰就不能更改,因此都可以看做常量。

例子:

/**
 * 变量可以分为:
 * 成员变量:直接书写在类体 括号内的那些变量 ,比如 name school
 * 没有static关键字修饰的成员变量,是 实例成员(实例属性/实例变量)
 * 但凡是 实例成员 都必须先创建一个实例后,才能使 用:
 * Bear b = new Bear();
 * b.name="xiongda ";
 *
 * 被static 关键字修饰的成员变量,是静态属性(类属性/静态 变量/静态成员)
 * 静态成员(类属性)不需要创建任何实例即可使用:
 * Bear.school = "大熊IT学院";
 *
 * 局部变量:不是直接书写在类体括号内的那些变量,都是 局部变量
 */
public class Bear {
    // 这个 name 直接属于这个 类的。
    // 成员(member)表示这个属性是该类的一个组成成员
    // 成员变量 variable;非静态的,与具体的实例相关(实例成员、实例属性)
    public String name;
    //成员变量;静态的,与类相关的,不需要创建类的实例,静态属性(类属性)
    public static String school;
    // 方法的参数(比如 food) 都是局部变量
    public void eat(String food){
        int i = 100; // 局部变量
    }
}

关于final的例子:

public class Tiger {
	// 被 final 修饰的变量 的 值 不能被再次修改
	public final String TYPE = "虎"; // 不可更改的成员变量:常量(它是一个成员)
	public String name;
	// 静态常量 (可以通过类名去直接访问、取值不能被修改)
	public static final String school = "老虎学院";// 不可更改的成员变量:常量(它是一个成员)
	public static void main(String[] args) {
		System.out.println(Tiger.school);
		//Tiger.school = "病猫学院";
		Tiger t = new Tiger();
		t.name = "翠花";
		// t.TYPE = "猫";
		final int i = 100; // 不可更改的变量:常量(局部的)
		System.out.println(i);
		// i =200; //The final local variable i cannot be assigned
	}
}

具体final可以修饰什么东西,后边的文章会有详细的描述。

转载于:https://my.oschina.net/lujiapeng/blog/2250127

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值