构造方法
- 当一个类中没有提供任何构造方法,系统默认提供一个无参数的构造方法,这个无参数的构造方法叫做缺省构造器。
- 当一个类中手动的提供了构造方法,那么系统将不在默认提供无参数的构造方法;建议将无参构造方法手动写出来,防止出错。
- 构造方法的名字是类名,且没有返回值
- 实例变量在构造方法执行的过程中才会完成初始化,而不是在类加载的时候
- 如果没有手动赋值,那么会自动赋系统值/默认值
- 语法- this(实际参数列表):
- 通过当前的构造方法去调用本类中另一个构造方法,
- 作用:实现代码复用
- 死记硬背:对于this()的调用只能出现在构造方法的第一行
实例语句块
1.在什么时候执行?
- 只要是构造方法执行,必然在构造方法执行之前,自动执行“实例语句块”中的代码
- 这也是SUN公司为程序员准备一个特殊的时机,叫做对象构造时机
2.有什么用处?
- 多个构造方法有重复的赋值部分,可以这些共同的赋值部分放到实例语句块中。
public class InstanceCode{
//入口
public static void main(String[] args){
System.out.println("main begin");
new InstanceCode;
new InstanceCode("aaa");
}
//实例语句块
{
System.out.println("实例语句块执行!");
}
//Constructor
public InstanceCode(){
System.out.println("无参数构造方法");
}
//Constructor
public InstanceCode(String name){
System.out.println("有参数构造方法");
}
}
封装
封装的代码实现步骤:
- 属性私有化
- 1个属性对外提供两个set和get方法。外部程序只能通过set方法修改,只能通过get方法读取,可以在set方法中设立关卡来保证数据的安全性
- set和get方法写的时候严格按照规范要求来写
静态变量和静态方法
- 所有static关键字修饰的都是类相关的,类级别的
- 所有static修饰的,都是采用"类名."的方式访问,最好不要用"引用."的方式,会让人区分不出来是否是静态的。
- 在同一个类中访问静态变量,可以省略类名
- 静态变量在类加载时就完成初始化,不需要new对象,并且存储在类对应的方法区
- 什么时候变量声明为实例的,声明为静态的?
- 某一属性是类级别的特征,而不是对象级别的特征
- 什么时候定义实例方法和什么时候定义静态方法?
- 此方法一般都是描述了一个行为,如果说该行为必须由对象去触发。那么该方法定义为实例方法
- 静态方法不能调用实例方法,或者读写实例属性,因为未必有对象实例化。
- 但是,实例方法调用静态方法,修改静态变量就没有问题。
3.参考标准:
- 当这个方法体中,直接访问了实例变量,那么这个方法一定是实例方法
- 在开发中,大部分情况下,如果是工具类的话,工具类当中的方法一般都是静态的
静态代码块
-
使用static关键字可以定义: 静态代码块
-
static静态代码块在什么时候执行?
- 类加载时执行,并且只执行一次。
-
静态代码块在类加载时执行,并且在main方法执行之前按照自上而下的顺序执行
-
静态代码块的作用?
- 静态代码块这个语法机制实际上时SUN公司给程序员的一个特殊的时机,这个时机叫做: 类加载时机
- 具体来说,就是在类加载时,记录类加载到JVM中的日志信息(例如时间信息);这个记录日志的代码就写在静态代码块中
public class StaticTest{
//静态代码块
static {
System.out.println("A");
}
//一个类中可以编写多个静态代码块
static {
System.out.println("B");
}
//入口
public static void main(String[] args){
System.out.println("Hello World");
}
//在定义一个
static int i = 100;
static {
System.out.println("i : " + i);
}
}
4.如果静态变量在静态代码块之后定义?
static {
System.out.println("i : " + i);
}
static int i = 100;
- 静态代码块和静态变量都在类加载的时候执行,时间相同只能靠代码的顺序决定。
- 编译错误:非法前向引用
空指针异常
- 以下程序编译可以通过,因为符合语法
- 运行时出现空指针异常
- 空引用访问"实例"相关的数据一定会出现著名的异常---空指针异常: java.lang.NullPointerException
- "实例"相关的数据表示:这个数据访问的时候必须有对象的参与,这种数据就是实例相关的数据
public static void main(Sting[] args){
Students s = new Students();
System.out.println(s.age);
s = NULL;
System.out.println(s.age);
}