1.访问权限

Java的类、接口、字段和方法都可以设置访问权限

  • 访问权限是指在一个类的内部,能否引用另一个类以及访问它的字段和方法
  • 访问权限有public、protected、private和package四种

2.public

定义为public 的class、interface、field、method可以被其他类访问

//包含public 接口、类、field、method的例子
public interface Person{
void run();
}
public class Student implements Person{
public String name;
public int age;
public Student(String name){
this.name = name;
}
public void run(){
System.out.println(this.name+" 跑 啊 跑");
}
}
public class Hello{
public static void main(String[] args){
Student s = new Student("张三");
s.run();
System.out.println(s.age);
}
}

3.private

3.1private修饰的field、method

  • 定义为private的field、method无法被其他类访问

  • 但是在类的内部,其他方法是可以调用field和method的
  • private访问权限限定在类的内部,与方法声明顺序无关。
  • 推荐:把public放在前面,private放在后面。public对外提供了功能,阅读代码时,首要关心public代码。
//关于private field、method的例子
public class Student {
private String name;
private int age;
public void info(){
this.run();
System.out.println(this.name);
}
private void run(){
System.out.println("Student: " +name + " is running");
System.out.println("name is "+age + " years old.");
}
}
public class Hello{
public static void main(String[] args){
Student s = new Student();
s.info();
}
}


## 3.2private 修饰的内置class
* 定义为private的class无法被其他类访问
* 访问private class被限定在外层class的内部
* 定义在一个class内部的class成为内部类inner class
* 不能对最外层的类用private修饰

```#java
public class Student {
private String name;
private int age;
public void info(){
School s = new School("飞扬学院");
System.out.printf("My name is %s.\nI am %d years old. \n%s",this.name,this.age,s.info());
}
private class School{
public School(String school){
this.school = school;
}
private String school;
public String info(){
return "I am student of " + this.school;
}
}
}
public class Hello{
public static void main(String[] args){
Student s = new Student();
s.info();
}
}
```

4.protected作用于继承关系

  • 定义为protected的字段和方法可以被子类访问
  • 不能对最外层的类使用protected修饰


```#java
public class Student {
protected String name;
protected int age;
protected void info(){
System.out.printf("My name is %s.\nI am %d years old",this.name,this.age);
}
}
public static void main(String[] args){
Student s = new Student();
s.info();
}
}
```
# 5.作用域
* 包作用域是指一个类允许访问同一个package的
* 没有public、private修饰的class
* 没有public、protected、private修饰的字段和方法
```#java
package abc;
class Student {
String name;
int age;
void info(){
System.out.printf("My name is %s.\nI am %d years old",this.name,this.age);
}
}
package abc;
class Hello{
public static void main(String[] args){
Student s = new Student();
s.info();
}
}
```

如果不确定是否需要public,就不声明为public,即尽可能少的暴露对外方法。

6.局部变量

在方法内部定义的变量成为局部变量

局部变量作用域从变量声明处开始到对应的块结束

class Hello{
void hi(String name){
//方法hi的作用域到方法结束
//name作用域从到方法结束
String s = name.toLowerCase();
//s的作用域到方法结束
int len = s.length();
//len到方法结束
if (len <10){
int p = 10 -len;//到if语句结束
for(int i = 0;i < 10;i++){
//i到循环结束
System.out.println();
}
}
}
}

一个Java文件中,只能定义一个public class,但可以定义多个非public class ,并把它们保存在同一个Java文件中

public class Hello{
public static void main(String[] args){
Say s = new Say("Tom");
Run r = new Run(5);
System.out.println(s.say());
System.out.println(r.run()); }
}
class Say{
private final String name;
public Say(String name){
this.name = name;
}
public String say(){
return "Hello,"+name+"!";
}
}
class Run{
private final int distance;
public Run(int distance){
this.distance = distance;
}
String run(){
return "I can run "+this.distance+" Km.";
}
}

最佳实践

  • 尽可能把局部变量的作用域缩小
  • 尽可能延后声明局部变量

7.final

  • final与访问权限不冲突
  • 用final修饰class可以阻止被继承

  • 用final修饰method可以阻止被子类覆写

  • 用final修饰field可以阻止被重新赋值,即只允许在初始化的时候赋值

  • 用final修饰局部变量可以阻止其被重新赋值

8.总结:

Java内建的访问权限包括 public、protected、private和package

Java在方法内部定义的变量是局部变量

局部变量的作用域从变量声明开始,到一个块结束

final修饰符不是访问权限

一个Java文件只能包含一个public class,但可以包含多个非public class

廖雪峰Java2面向对象编程-5包和classpath-3作用域的更多相关文章

  1. 廖雪峰Java2面向对象编程-5包和classpath-4classpath和jar

    1.classpath 1.1classpath定义 classpath是一个环境变量 classpath指示JVM如何搜索class classpath设置的搜索路径与操作系统相关 * window ...

  2. 廖雪峰Java2面向对象编程-5包和classpath-1包package

    1.package的意义 如下,存在多个相同类名的文件.当引用Person类,将无法确定引用小红,还是小明的Person类,即同名类的冲突. 小明的Person类:Person 小红的Person类: ...

  3. 廖雪峰Java2面向对象编程-5包和classpath-1静态字段和方法

    1.静态字段 1.1定义:用static修饰的字段称为静态字段 普通字段在每个实例中都有自己的一个独立的空间 静态字段只有1个共享空间,所有实例都共享该字段. public class Person{ ...

  4. 廖雪峰Java2面向对象编程-3继承和多态-1继承

    1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通 ...

  5. 廖雪峰Java2面向对象编程-1面向对象-1面向对象基础

    1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Pe ...

  6. 廖雪峰Java2面向对象编程-4抽象类和接口-2接口

    1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...

  7. 廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类

    每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方 ...

  8. 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类

    1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ...

  9. 廖雪峰Java2面向对象编程-6Java核心类-5枚举类

    直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON ...

随机推荐

  1. 一个简易的drf的项目例子

    luffy_city 1.项目介绍 今日内容:(路飞项目) contentType组件: 路飞学成项目,有课程,学位课(不同的课程字段不一样),价格策略 问题, 如何设计表结构,来表示这种规则 为专题 ...

  2. Thymeleaf基本用法

    1.Thymeleaf简介 官方网站:https://www.thymeleaf.org/index.html Thymeleaf是用来开发Web和独立环境项目的现代服务器端Java模板引擎. 2.特 ...

  3. 网站基于vs,复选框,单选款

    前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.a ...

  4. LG3978 【[TJOI2015]概率论】

    前置:卡特兰数 记\(C_n\)为\(n\)个节点的二叉树的个数,\(C_0=1\),对于\(n \geq 1\),取一个根节点,枚举其左子树大小,有 \[C_n=\sum_{i=0}^{n-1}C_ ...

  5. c++简单的ATL COM开发和调用实例

    1.打开VS2010.新建ATL COM 项目.步骤:"文件" -->"新建" -->"项目",选择"Visual C ...

  6. Unity3D用户手册 学习

  7. 机器学习 - 开发环境安装pycharm + pyspark + spark集成篇

    AS WE ALL KNOW,学机器学习的一般都是从python+sklearn开始学,适用于数据量不大的场景(这里就别计较“不大”具体指标是啥了,哈哈) 数据量大了,就需要用到其他技术了,如:spa ...

  8. 逻辑回归原理(python代码实现)

    Logistic Regression Classifier逻辑回归主要思想就是用最大似然概率方法构建出方程,为最大化方程,利用牛顿梯度上升求解方程参数. 优点:计算代价不高,易于理解和实现. 缺点: ...

  9. NoHttpResponseException

    采用JMeter2.13做Http性能测试时,在高并发请求的情况下,服务器端并无异常,但是Jmeter端报错NoHttpResponseException (the target server fai ...

  10. Qt 中的事件处理(一)

    1.图形界面应用程序的消息处理模型 特点: 基于操作系统才能运行 GUI应用程序提供的功能必须由用户触发 用户操作界面时操作系统是第一个感知的 系统内核的消息通过事件处理转变成QT的信号 2. Qt中 ...