1.2.1类的构造方法
在Java中,构造方法是一种特殊类型的方法,也称构造器(Constructor)。对象的创建就是通过构造方法完成的,每当类实例化一个对象时,类都会自动调用构造方法。
构造方法的定义语法:
[权限修饰符] 方法名(形参列表) {
方法体;
}
例:
public class People {
int age; //属性age
public People(int age) { //构造器,与类同名
this.age = age; //将参数age的值赋给属性age
}
public People() { //无参构造器
this(18);
}
public static void main(String[] args) {
People p1 = new People(); //调用无参构造器
System.out.println("p1的年龄为" + p1.age + "岁"); //输出:p1的年龄为18岁
People p2 = new People(20); //调用自定义的构造器
System.out.println("p2的年龄为" + p2.age + "岁"); //输出:p2的年龄为20岁
}
}
如果类中没有明确定义构造器,编译器会自动创建一个无参默认构造器,一旦定义构造器,默认构造器将被覆盖,除非人为定义。
例:
public class People {
People() {} //无参默认构造器,存在但不显示
}
public class People {
int age;
public People(int age) {} //无参默认构造器被定义的构造器覆盖 不再存在People() {}
}
构造方法没有返回值。
方法名必须和类名一致。
形参列表和成员方法规则一样。
构造器的调用,由系统完成。
1.2.2 静态变量和静态方法
在Java中,由static关键字修饰的变量和方法称为静态变量和静态方法,也称类变量,类方法。jdk8以前,静态对象放在静态域;jdk11以后,静态对象放在堆。
一.静态变量
定义语法:
权限修饰符 static 数据类型 变量名; //推荐
或
static 权限修饰符 数据类型 变量名;
访问静态变量
类名.静态变量名; //推荐
或
对象名.静态变量名;
例:
public class VisitStatic {
public static void main(String[] args) {
//类名.静态变量名
//说明:静态变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问
System.out.println(A.name);
A a = new A();
//对象名.静态变量名
System.out.println(a.name);
}
}
class A {
//静态变量
public static String name = "我叫A";
}
案例:
public class StudentPay {
String name; //缴费总和
static int count = 0; //共享的属性,人数
public StudentPay(String name) {
this.name = name; //记录姓名
count++; //人数递增
}
public static void main(String[] args) {
StudentPay p1 = new StudentPay("张三");
System.out.println("第" + count + "位同学缴费,姓名:" + p1.name);
StudentPay p2 = new StudentPay("李四");
System.out.println("第" + count + "位同学缴费,姓名:" + p2.name );
StudentPay p3 = new StudentPay("王五");
System.out.println("第" + count + "位同学缴费,姓名:" + p3.name);
}
}
静态变量与普通变量的区别:静态变量是该类所有对象共享的,而普通变量是每个对象独享的。
加上static关键字成为类变量或静态变量,否则称为实例变量/普通变量/非静态变量。
局部变量不可以用static关键字声明。
实例变量不能通过类名.变量名进行访问。
静态变量的生命周期是随着类加载开始,随着类消亡而销毁。
二.静态方法
定义语法:
权限修饰符 static 数据返回类型 方法名() {}; //推荐
或
static 权限修饰符 数据返回类型 方法名() {};
访问静态方法
类名.静态方法名;
或
对象名.静态方法名;
静态代码块——当类加载时,首先会执行static代码块中的程序,并且只执行一次。
语法如下:
public class Test {
static {
...//静态代码块中可写入一些初始化代码
}
}
使用场景:当方法中不涉及到任何和对象相关的成员,则可将方法设计成静态方法,提高开发效率。
在静态方法中不可以使用this关键字。
在静态方法中不可以直接调用非静态方法。
主方法必须用static声明。
静态方法中只能访问静态变量或静态方法。
1.2.3 类的主方法
主方法是类的入口点,Java编译器通过主方法来执行程序。
定义语法:
public static void main(String[] args) {
...
}
主方法的形参为数组args[0]~args[n]表示从第1个参数到第n-1个参数,可以使用args.length获取参数的个数。
主方法是静态的。
主方法没有返回值(void)。
1.2.4 对象
在Java中,通过new操作来创建对象。通过1.2.1的阐述,每实例化一个对象就会自动调用一次构造方法。
定义语法:
类名 对象名 = new 类名(); //new 类名() 是对象的实体
类名 对象名 = new 类名("a"); //"a"是构造方法的参数
一.访问对象的属性和行为
public class Cat {
String name; //名字
String color; //颜色
String behavior; //行为
public Cat(String name, String color, String behavior) { //形参列表
this.name = name;
this.color = color;
this.behavior = behavior;
}
public void run() { //跑
System.out.println(behavior);
}
public static void main(String[] args) {
Cat cat = new Cat("猫猫","白色","跑"); //访问对象属性和行为
//当创建对象后,可以使用 对象.类成员 来获取
System.out.println(cat.name + "的颜色是" + cat.color + ",正在" +cat.behavior);
}
}
二.对象的销毁
在Java中,每个对象都有生命周期。
对象引用超过其作用范围,这个对象将被视为垃圾。
{
Test t1 = new Test();
} //当对象t1超过其作用范围将消亡
将对象赋值为null。
{
Test t1 = new Test();
t1 = null; //t1对象将消亡
}
了解:在Java中,提供了一个finalize( )方法,这个是Object类的方法,它被声明为protected,用户可以在自己的类中定义这个方法。如果在类中定义了finalize( )方法,在垃圾回收时会首先调用该方法,在下一次垃圾回收动作时,才真正回收被对象占用的内存。
注意:垃圾回收或finalize( )方法并不保证一定发生。如果Java虚拟机内存损耗殆尽,将不会执行。