块 block:{}
{ } 的定义位置
名称 | 定义位置 | 作用 | 执行时机 |
普通语句块|局部代码块 | 局部位置(方法内) |
| 跟随方法的调用而执行 |
构造块|成员代码块 | 成员位置(类中方法外) | 做成员的初始,先于构造器的统一初始 | 创建对象跟随new一起执行 |
静态块:static{} | 成员位置 | 1.初始加载配置 2.静态成员初始化 | 类第一次加载 |
public class Test{
/*代码块*/
{} // 局部代码块,每次创建对象都会自动调用一次
static{} //静态块,类只要加载 就会被自动有且只调用一次
/* 属性 变量 成员变量 */
int n1; // 对象才能访问
final int n2 = 10; // 对象才能访问
static int m1; // 类变量 直接访问
static final int m2 = 20; // 类变量 直接访问
/* 构造器 */
public Test(){}
/* 方法 */
public static void m(){} // 静态方法
public void f(){} // 非静态方法
}
注意:
统一作用域范围内,变量不能同名
构造块会被编译到要执行的构造器内部,构造器代码的上面,先于构造器代码的执行
静态块在第一次加载完成之后执行,并且只执行一次
如果存在多个块,从上到下依次执行
public class Class_Block {
//成员
static int i = 10;
//静态块,类被加载就会最先执行
static{
System.out.println("静态块1");
}
static{
System.out.println("静态块2");
}
static{
System.out.println("静态块3");
}
//构造器
public Class_Block(){
System.out.println("空构造...");
}
public Class_Block(boolean flag){
System.out.println("带参构造...");
}
//构造块|成员代码块
{
System.out.println("构造块1");
}
{
System.out.println("构造块2");
}
{
System.out.println("构造块3");
}
public static void main(String[] args) {
System.out.println("我是main方法");
//局部
int i =1;
//普通语句块|局部代码块,在方法中,当方法执行被调用
{
i =2;//i可以赋值但不能重新定义
System.out.println(i); //2
}
System.out.println(i); //2
new Class_Block();//此时构造块(成员代码块)执行,然后构造器执行
}
}
//输出结果
静态块1
静态块2
静态块3
我是main方法
2
2
构造块1
构造块2
构造块3
空构造...
包及导包
包:
包机制 : 文件夹
提供了多重命名空间
为什么需要创建包:管理众多的资源
为什么在创建类的时候需要给当前类指定包? 区分不同的类,管理不同的类。
定义 :公司域名倒着写+功能名字|模块名字
位置 :包信息存在java文件的首行
package com.xxxx.xxx.xxx; 通过package指定当前类所属的包 这行代码一定是一个Java文件/类的首行
如何创建一个包?
一般命名规则: 公司域名倒着写 com.xxx
项目名称: 学生管理系统 .ss
模块名称: 学生模块 .student
子模块名称...
com.xxx.ss.student.view.....
导包:
1、导包就是为了使用类,在使用类的时候需要通过包名.类名去确定。
不需要导包的类型:
Java.lang
同包下的类型
2、需要通过import进行导包
import 包名.类名;
import 包名.*; --> 模糊导入,模糊匹配当前包下的所有类型,只会影响编译效率,不会影响运行效率
import static 包名.类名.静态变量|方法; 只导入静态内容
注意 :
先建包再建类
import java.util.*;//模糊导入
//import static java.lang.Math.PI;
//import static java.lang.Math.round;
import static java.lang.Math.*;//模糊导入
public class PackageImport {
public static void main(String[] args) {
System.out.println(Math.PI);//没导之前
System.out.println(PI);//只后
System.out.println(Math.round(1.49));//没导之前
System.out.println(round(1.49));//之后
}
}