0%

范围修饰符、代码块、内部类

一,范围修饰符

概念:也叫权限修饰符,修饰成员在代码中的可见性

分类:

  1. public:公共的
  2. protected:受保护的
  3. [default]:默认
  4. private:私有的

范围修饰符只能修饰成员

public > protected > [default] > private

1
2
3
4
5
		        public          protected            [default]                private
本类中 √ √ √ √
同包的其他类中 √ √ √ ×
其他包的子类中 √ √ × ×
其他包的其他类 √ × × ×

public:任何位置都能访问

private:只有本类中可以访问

protected:同包中可以访问,子类可以访问(只有其他包中的无关类不能访问)

[default]:只能在同包中访问

二,代码块

2.1 概念和分类

概念:

使用一对大括号括起来的代码段就是一个代码块

分类:

  1. 普通代码块
  2. 静态代码块
  3. 构造代码块
  4. 同步代码块 synchronized

2.2 普通代码块

定义在局部位置的代码块

注:变量只有在定义它的代码块中才可以使用,代码块结束后,代码块中定义的变量就被释放

2.3 静态代码块

格式:

1
2
3
4
5
public class Emp {
static{
// 静态代码块中的语句
}
}

特点:

  1. 静态代码块最优先执行
  2. 静态代码块只执行一次

作用:

  1. 读取配置文件
  2. 对静态属性进行初始化

注:多个静态代码块会根据书写顺序从上到下依次执行

2.4 构造代码块

概念:定义在成员位置上,没有任何修饰符的代码块

1
2
3
4
5
6
7
8
public class Emp {
{
// 构造代码块
}
{
// 构造代码块
}
}

特点:

  1. 优先于构造函数执行,晚于静态代码块
  2. 每次创建对象都会执行

注:对属性进行初始化

三,内部类

3.1 概念的和分类

概念:定义在其他类中的类

分类:

  1. 成员内部类
  2. 静态内部类
  3. 局部内部类
  4. 匿名内部类

3.2 成员内部类

概念:定义在其他类的成员位置上的类

1
2
3
4
class Outer{
class Inner{
}
}

注:

  1. 内部类可以直接访问外部类中的所有成员(包括私有的)

  2. 外部类访问内部类的成员需要在外部类中创建内部类的对象进行访问

  3. 其他类创建内部类的对象:

    1
    外部类.内部类 对象名 = new 外部类().new 内部类();
  4. 内部类和外部类出现同名变量、方法时,内部类访问外部类,可以通过

    1. 创建外部类对象

    2. ```java
      外部类.this.成员名

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12

      #### 3.3 静态内部类

      概念:静态的成员内部类

      ```java
      public class Test {
      }
      class Outer{
      static class Inner{
      }
      }

注:

  1. 静态内部类只能访问外部类中的静态成员,外部类中的非静态成员只能在内部类中创建对象访问

  2. 外部类访问静态内部类中的的成员,必须在外部类中创建内部类的对象访问

  3. 其他类访问静态内部类中的静态成员:

    1
    外部类.静态内部类.静态成员
  4. 其他类创建静态内部类的对象:

    1
    外部类.内部类 对象名 = new 外部类.内部类();

3.4 局部内部类

概念:将一个类定义在其他类的方法中

1
2
3
4
5
6
7
class Outer{
public void f(){
class Inner{

}
}
}

注:

  1. 局部内部类可以直接访问外部类中的成员(包括私有的)
  2. 外部类访问内部类的成员,只能在定义局部内部类的方法中创建这个局部内部类的对象进行调用
  3. 其他类访问局部内部类的成员,只能在其他类中创建外部类的对象,使用外部类的对象调用定义了这个局部内部类的方法

3.5 匿名内部类

格式:

1
2
3
new 类名/接口名(){
// 重写
};

作用:创建子类/实现类的对象

注:使用匿名内部类创建子类对象,无法再调用子类的特有内容

3.6 补充

  1. 成员内部类和静态内部类编译后的文件名:外部类$内部类.class

  2. 局部内部类编译后的文件名:外部类$序号内部类.class

    序号从1开始,根据局部内部类所在方法的调用顺序排序

  3. 匿名内部类编译后的文件名:其他类$序号.class