构造方法 代码块 & 包的基本知识
文章目录
1.构造方法
作用:对成员变量进行快速初始化
1.1构造方法格式
[访问权限修饰符] 方法名(参数列表) {
方法体;
(this.Xxx = Xxx;)
}
1.2构造方法特点
- 构造方法没有返回值,没有void
- 是特殊的方法,给当前类初始化,方法名与类名一致
- 可以重载
- 如果没有写构造方法,系统默认会写一个无参构造方法
- 当我们写了有参构造方法,系统会删除默认写的无参构造方法(外界访问无参构造方法是会有:构造方法未定义的报错)
- 建议写上无参构造方法(框架底层利用放射创建对象,注入spring容器中,反射获取的是无参构造方法)
2.代码块
2.1局部代码块
限定局部变量的作用域
public void show() {
// 局部代码块
{
int x = 100;
System.out.println(x);
}
// 局部代码块
{
int x = 200;
System.out.println(x);
}
synchronized(new Object()) {
}
}
2.2构造代码块
-
可以抽取多个构造代码块的共性代码,简化程序
-
在构造方法前执行
-
每次创建对象都会执行
// 构造代码块 { System.out.println("我是构造代码块1"); // System.out.println(add()); } //在成员变量的位置
2.3静态代码块
-
static修饰的代码块
-
不管创建多少次对象,只执行一次
-
执行时机:类中任意成员被访问,静态代码块必然执行(在类被调用时执行,先于类中成员)
-
可以初始化静态成员
class CodeBlock { int a; int b; static int c; static { System.out.println("我是静态代码块1"); c = 100; } } //因为静态成员属于类,与对象无关,所以可以用静态代码块初始化
-
由于在创建对象之前执行,并且只执行一次,所以通常会把预加载的代码放到静态代码块中(e.g. :数据库的连接, Xml,JSON等配置文件的读取)
2.4同步代码块
2.5代码块实例
//结果:
//主方法...
//我是 CodeBlock 类的静态代码块1
//我是 CodeBlock 类的静态代码块2
//我是 CodeBlock 类的静态代码块3
//创建对象之前做的准备工作1:
//创建对象之前做的准备工作2:
//创建对象之前做的准备工作3:
//无参
//创建对象之前做的准备工作1:
//创建对象之前做的准备工作2:
//创建对象之前做的准备工作3:
//带1参
//先执行的是Practice05,所以main内的静态代码块执行
//之后调用class CodeBlock,其内的静态代码块被调用
//之后是构造代码块,又因为构造代码块每次创建对象都会调用,所以调用了两次
public class Practice05 {
public static void main(String[] args) {
CodeBlock cb = new CodeBlock();
CodeBlock cb2 = new CodeBlock(10);
}
static {
System.out.println("主方法...");
}
}
class CodeBlock {
int num;
int num2;
static int num3;
// 1.构造代码块
{
System.out.println("创建对象之前做的准备工作1: ");
}
{
System.out.println("创建对象之前做的准备工作2: ");
}
{
System.out.println("创建对象之前做的准备工作3: ");
}
// 构造方法
public CodeBlock() {
System.out.println("无参");
}
public CodeBlock(int num) {
System.out.println("带1参");
this.num = num;
}
public CodeBlock(int num, int num2) {
System.out.println("带2参");
this.num = num;
this.num2 = num2;
}
// 3. 静态代码块
static {
System.out.println("我是 CodeBlock 类的静态代码块1");
}
static {
System.out.println("我是 CodeBlock 类的静态代码块2");
}
static {
System.out.println("我是 CodeBlock 类的静态代码块3");
}
}
3.包 & 导包
包的本质就是文件夹;实现可对java文件的管理;解决了同包下重名问题
3.1包的特点
-
同包下的类不需要导包
-
java.lang包下的所有类都不需要导入,系统会帮我们导入
-
如果一个类没有声明包,意味着这个类将是孤立的类,其他包都无法访问默认包下的所有类,一般先建包再建类
-
如果在同一个类下使用两个不同包下的同名类的时候,需要使用类路径
com.sxt.thisdemo.Student s = new com.sxt.thisdemo.Student(); com.sxt.packagedemo.Student s2 = new com.sxt.packagedemo.Student();
-
包的声明必须出现在Java文件的第一句,仅且只有一句
-
在书写类名的时候不要和系统的类重名
-
如果需要导入一个包下所有的类,可以使用**通配符 ***
import java.util.*;
-
JDK常见一些包:
包名: 作用 java.lang 包含一些Java语言核心类,如String、Math、Integer、System和Thread,提供常用功能。 java.net 包含执行与网络相关的操作的类。 java.awt 包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。 java.io 包含能提供多种输入/输出功能的类。 java.util 包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。