访问控制符、代码块、引用传递、包 java (三)

 封装性:

  1、将抽象得到的全部属性和方法相结合在一起,形成一个不可分割的单位——类

  2、隐藏类的实现细节,将对象的属性和实现细节隐藏,不允许外部直接访问,只把接口公开。通过这些接口来访问或者操作隐藏的属性和方法实现。

 访问控制符:

 代码块:

  在java中,使用花括号({ })括起来的代码成为代码块,根据其位置和声明的不同,可分为普通代码块、构造块、静态块和同步代码块。其中同步代码块在购买多线程会讲解。

  普通代码块:

    直接在一个方法或者语句中出现的{}就是普通代码块。——相同类型的代码块执行的顺序为,先定义的代码块先执行,后定义的代码块后执行。

  构造块:

  直接在类中定义的且没有加static关键字的代码块{}为构造块。构造块在创建对象的时候会被调用,每次创建对象都会被调用,且构造块的执行顺序优先于构造函数。

  

public class CodeBlock{
    {
        System.out.println("第一构造块");
    }
    public CodeBlock(){
        System.out.println("构造方法");
    }
    {
         System.out.println("第二构造块");
    }
    
    public static void main(String[] args){
        new CodeBlock();
        new CodeBlock();
        new CodeBlock();
    }
}
View Code

执行结果如图所示

第一构造块
第二构造块
构造方法
第一构造块
第二构造块
构造方法
第一构造块
第二构造块
构造方法

 静态代码块:

  在java类中使用static关键字声明的代码块称为静态代码块。主要用于初始化类,为类的静态属性初始化。

  特点:

  1、静态代码块不能存于任何方法体内;

  2、静态代码块不能直接访问实例变量和实例方法,需要通过类的实例对象来访问。这与静态方法是一样的。

  3、JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。如果多个则先定义的先执行。每个静态代码块都只执行一次。 

例子

class Code{
    {
        System.out.println("Code的构造块");
    }
    static{
        System.out.println("Code的静态代码块");
    }
    public Code(){
        System.out.println("Code的构造方法");
    }
}

public class CodeBlock01 {
    {
        System.out.println("CodeBlock01的构造块");
    }
    static{
        System.out.println("CodeBlock01的静态代码块");
    }
    public CodeBlock01(){
        System.out.println("CodeBlock01的构造方法");
    }
    public static void main(String[] args) {
        System.out.println("CodeBlock01的主方法");
        new Code();
        new Code();
        new CodeBlock01();
        new CodeBlock01();
    }

}
View Code

结果如下

一些小测试题目:

普通代码块

public class ClassTest01{
    public static void main(String args[]){
        int x=5;
        System.out.println(++x);
        {
            int x=7;
            System.out.println(x);
        }
    }
}
View Code

编译会出错,是因为此普通代码块是在main方法内部定义的,在同一个作用域内,一个变量只能定义一次。

综合使用代码块

public class ClassTest02{
    static int i;
    static {
        i+=10;
    }
    public ClassTest02(){
        System.out.println("构造方法: "+i);
    }
    {
        System.out.println("构造块: "+i++);
    }
    public static void main(String[] args){
        System.out.println("主方法:"+(ClassTest02.i++));
        new ClassTest02();
    }
    static {
        i/=10;
    }
}
程序编译的运行结果是( )
A. 主方法:2 构造块:2 构造方法:3
B. 主方法:1 构造块:2 构造方法:3
C. 主方法:1 构造块:3 构造方法:2
D. 主方法:10 构造块:11 构造方法:12
答案见后面
View Code

各个代码块的执行顺序:静态代码块》主方法》构造块》构造方法。

引用传递:

  所有的函数调用本质上都是值的传递。值传递传入的是基本数据类型值的副本;引用传递传入这个引用地址的副本,这个引用地址实际上是一个值。

上面答案是B       123;

原文地址:https://www.cnblogs.com/2589-spark/p/3448477.html