------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
构造方法,构造器(constructor)
用于给对象的数据进行初始化,每个类都有构造方法。构造方法可以重载。
默认构造方法:如果没有定义,系统会给出默认的无参的空构造方法
构造方法的格式:
方法名与类名相同;没有返回值类型;没有具体的返回值,不需要写return
构造方法的运行和作用:
创建对象时,仅执行一次;创建对象时,对成员变量初始化赋值
this 关键字的使用
一个构造方法可以通过this关键字调用另外一个重载的构造方法
this语句: 格式 this(参数列表); // 调用其他构造方法
注意:this 语句只能写在构造方法里面,且必须是第一行
类的初始化过程
加载 Student.class 文件进内存(方法区)
在栈内存为引用变量 stu 开辟空间
在堆内存为学生对象开辟空间
对学生对象的成员变量进行默认初始化
对学生对象的成员变量进行显示初始化
通过构造方法对学生对象的成员变量赋值
学生对象初始化完毕,把对象地址赋值给 stu 变量
static 关键字 成员修饰符,修饰成员,不能修饰局部
静态成员可以被类名直接调用 类名.静态成员,非静态成员只能被对象调用
修饰成员变量 静态成员变量
用 static 修饰的成员变量不属于对象的数据结构
static 变量是属于类的变量,可以通过类名来引用 static 成员
static 成员变量和类的信息一起存储在方法区,而不是在堆中,
一个类的 static 成员变量只有“一份”,无论该类创建了多少对象
修饰方法
static 修饰的方法不需要针对某些对象进行操作,其运行结果仅仅与输入的参数有关,调用时直接用类名引用。
double c = Math.sqrt(3.0 * 3.0 +4.0 * 4.0);
// 该方法在调用时,没有隐式的传递对象引用,因此在 static 方法中不可以使用 this 关键字
由于 static 在调用时没有具体的对象,因此在 static 方法中不能对非 static 成员(对象成员)进行访问。static 方法的作用在于提供一些“工具方法”和“工厂方法”等。
修饰代码块
static 块:属于类的代码块,在类加载期间执行的代码块,只执行一次,可以用来在软件中加载静态资源。
静态成员变量和非静态成员变量的区别:
内存位置:
静态成员变量,存储到方法区的静态区
非静态成员变量,存储到堆内存
生命周期:
静态成员变量,随着类的加载而加载,随着类的死亡而死亡,生命最长
非静态成员变量,随着对象的加载而加载,随着对象的死亡而死亡,生命相对较长
调用方式:
静态成员变量,不属于对象,属于自己的类,类变量通过类名直接调用
非静态成员变量,属于对象,只能对象调用
*作用上:
静态成员变量,是所有对象的共享数据
非静态成员变量,是对象的特有数据
class Person{
Stringname= "呵呵";
static String country = "China";
publicvoid show() {
System.out.println(name + country);
}
publicstaticvoid function() {
// 错误:无法从静态上下文中引用非静态变量à生命周期不一样
/*
* 静态方法中,使用了非静态变量,静态不能直接调用非静态
* 因为静态成员优先于非静态成员进入内存
*/
// System.out.println(name + country + "in static function");
}
publicstaticvoid method(){
// this 表示本类对象,静态方法中,不能写 this, super
// System.out.println(super);
//System.out.println(this);
// super.hashCode();
}
}
publicclassPersonDemo {
publicstaticvoid main(String[] args) {
Person.function();
}
}
类的成员变量、局部变量、实例成员变量、类成员变量
类的成员变量:定义在类中的变量
局部变量:定义在方法或语句中的变量
实例成员变量:非静态成员变量,对象调用
类成员变量:静态成员变量,类名调用
代码块:局部代码块,构造代码块,静态代码块,同步代码块(多线程)
局部代码块:在方法中出现,限制变量生命周期
构造代码块:定义在类中方法外,多个构造方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行。
静态代码块:定义在类中方法外,static 修饰符。用于给类进行初始化,在加载的时候只执行一次。
静态代码块,构造代码块,构造方法的执行顺序:
静态代码块,构造代码块,构造方法
class Person
{
Person(){
System.out.println("构造方法");
}
{
System.out.println("构造代码块");
}
static{
System.out.println("静态代码块");
}
public static void a(){}
}
class Code
{
public static void main(String[]args)
{
Person.a(); // 静态代码块执行
new Person(); // 构造代码块和构造方法执行
}
}