一、类
1.概述
类是对现实生活中一类具有共同特征的事物的抽象。它描述一类对象的状态和行为。
例如,汽车可以作为一个类,它具有颜色、品牌等属性,有行驶和刹车等行为。
Java中的类一般包含变量、常量、程序块、方法等:
public class Car {
String color;
String brand;
BigDecimal price;
void run() {
}
void brake() {
}
}
一个car类,包含了三个变量,两个方法
2.方法
Java的方法是语句的集合,方法中的语句放在一起执行一个功能
-
方法是解决一类问题的步骤的有序组合
-
方法包含于类或对象中
-
方法在程序中被创建,在其他地方被引用
方法包含方法头方法体;
方法头的组成:修饰符 返回值类型 方法名 形参
例如:public String run(String carName)
- 修饰符:是可选的,没有时会有默认值,存在访问控制修饰符和非访问控制修饰符两种
- 返回值类型:声明该方法执行完成后返回的结果类型,void 代表该方法没有返回结果
- 方法名:方法的实际名称。方法名和参数表共同构成方法签名。
- 形参:当方法被调用时,可能会传递值给参数,参与方法内的逻辑判断或运算等,形参类似一个占位符,参数列表指形参的类型,顺序和参数个数,一个方法的参数列表可以为空
- 方法体:方法包含的具体语句,定义该方法的功能。
方法表示类所具有的行为。
2.1.main方法
类的主方法
main方法是被JVM(Java虚拟机)调用的,main方法为一个程序的执行入口,当一段程序被执行时,main方法第一个执行。
main()方法的方法头是固定不变的:public static void main(String[] args);
2.2.构造方法
构造方法,是Java中一种特殊的方法,其方法名与类名相同,构造方法在对象建立时就运行,且只会运行一次,所以其主要用来初始化成员属性和成员方法的,每个类都有构造方法,如果没有手动编写构造方法,java会自动在该类中添加一个默认的空参数的构造方法。
一个类中可以有多个构造方法,但是其参数列表不可相同(重载的形式);
2.3.静态方法
使用static修饰的方法;
静态方法中,只可以访问静态变量;
在非静态方法中,不可以调用静态方法;
在静态方法中,不能使用super和this关键字;
在当前类的静态方法中,可以通过方法名直接调用其他静态方法;
在非静态方法中,需要通过对象.方法名来调用;
在其他类中可以直接通过类名来调用,即类名.方法名;
静态方法和普通方法的区别:
1.调用方式不同
2.静态方法会被分配一块固定的内存空间,普通方法是会随着对象的调用而加载,使用完后释放内存,动态的分配内存空间。所以普通方法更节省内存,而静态方法运行更快。所以当一段程序中存在过多静态方法时,会长时间占用大量内存。
3.代码块
在Java中,使用”{}”括起来的代码称为代码块;
方法属于普通代码块;
3.1.构造块
用{}括起来的代码段,构造块在创建对象时会被调用,每次创建对象时都会被调用,并且优先于类构造函数执行。
3.2.静态块
用static{}括起来的代码段,只会被执行一次第一次加载此类时执行,静态块优先于构造块执行。
3.3.同步代码块
使用synchronized(obj){}括起来的代码块,主要用于多线程环境下(后续学习-TODO;)
简单示例
public class Car {
//变量 color和brand
String color;
String brand;
//带String类型参数的构造方法
Car(String color) {
System.out.println("带String类型参数的构造方法,初始化汽车颜色");
this.color = color;
}
//不带参数的构造方法
Car() {
System.out.println("不带参数的构造方法,初始化汽车品牌");
this.brand = "奥迪";
}
//构造块
{
System.out.println("构造块内的程序执行了");
}
//静态块
static {
System.out.println("静态构造块内的程序执行了");
}
//返回String类型的成员方法
public String getColor() {
return this.color;
}
//带参数,无返回值的方法
void run(String carColor) {
System.out.println("一辆" + carColor + "的汽车正在行驶");
}
//静态方法
static void stop(String carColor){
System.out.println("一辆" + carColor + "的汽车停下了");
}
public static void main(String[] args) {
String color;
//实例化一个car对象,此对象创建时,传入一个String参数,所以匹配到带参数的构造方法
Car car = new Car("红色");
//调用getColor方法获取汽车颜色
color = car.getColor();
//调用run方法
car.run(color);
stop(color);
//实例化一个car对象,此对象创建时,没有传入参数,所以匹配到不带参数的构造方法
Car car1 = new Car();
}
}
执行后控制台打印结果:
静态构造块内的程序执行了
构造块内的程序执行了
带String类型参数的构造方法,初始化汽车颜色
一辆红色的汽车正在行驶
一辆红色的汽车停下了
构造块内的程序执行了
不带参数的构造方法,初始化汽车品牌
以上示例中简单实现了不同类型的方法和代码块,通过执行结果可以看出它们之间的执行顺序和执行次数;
二、对象
对象是类的一个实例,有状态和行为
比如,汽车是一个类,五菱宏光S就是一个实例对象,其具有颜色、排量、车速等属性,以及启动、加速、刹车等行为。
对象的声明:声明一个对象,包括对象名称和类型。
对象实例化:使用new关键字创建一个对象,在内存中产生一个实际的类的实例,分配内存空间。
对象初始化:创建对象时,调用类的构造方法,对对象进行初始化。
在Java中创建对象:
public class Car {
String color;
String brand;
//带String类型参数的构造方法
Car(String color, String brand) {
System.out.println("初始化汽车属性");
this.color = color;
this.brand = brand;
}
//行驶方法
void run() {
System.out.println("一辆" + this.color + "的" + this.brand + "汽车正在行驶");
}
public static void main(String[] args) {
//创建一个对象
Car wuLing = new Car("灰色","五菱宏光S");
//创建一个对象
Car audi = new Car("黑色","奥迪Q5");
//创建了两个对象,分别是wuLing和audi,它们都具有颜色和品牌两个属性,都有行驶的行为
System.out.println("一辆" + wuLing.color + "的" + wuLing.brand);
System.out.println("一辆" + audi.color + "的" + audi.brand);
//调用行驶方法
wuLing.run();
audi.run();
}
}
程序执行结果:
初始化汽车属性
初始化汽车属性
一辆灰色的五菱宏光S
一辆黑色的奥迪Q5
一辆灰色的五菱宏光S汽车正在行驶
一辆黑色的奥迪Q5汽车正在行驶
从以上实例可以看出,一个类可以被实例化出多个对象,这些对象都可以具有类所拥有的属性和行为。
从执行结果可以看出,在对象被创建时,类的构造方法就已经执行。类是不占用内存的,对象在创建时分配内存。
三、this关键字
在Java中,this关键字指向当前对象的引用,可以理解为其代表当前对象。也就是哪个对象调用了this所在的方法,this就代表哪个对象。
例如:
public class Car {
String color;
String brand;
//构造方法
Car(String color, String brand) {
System.out.println("初始化汽车属性");
this.color = color;
this.brand = brand;
}
void run() {
System.out.println("一辆" + this.color + "的" + this.brand + "汽车正在行驶");
}
public static void main(String[] args) {
//创建一个对象
Car wuLing = new Car("灰色", "五菱宏光S");
System.out.println("一辆" + wuLing.color + "的" + wuLing.brand);
//调用行驶方法
wuLing.run();
}
}
在以上代码中,定义了一个car类,car类具有两个成员变量,一个构造方法,一个run()方法,在main方法中创建了wuLing对象
-
在创建对象时,调用car的构造方法,构造方法中对this.color和this.brand进行了赋值,因为此时创建的是wuLing对象,所以this代表wuLing,this.color也就代表wuLing对象的color;
-
在wuLing对象创建之后,调用了run方法,run方法中存在this.color和this.brand参数,因为是wuLing对象调用的run方法,所以其中的this代表wuLing,this.color也就代表wuLing对象的color;
简单理解了this关键字之后,再了解一下它具体有哪些用法
-
用于区分成员变量和局部变量
在上述代码中存在构造方法,构造方法带有 color、brand两个形参,而Car类中具有同名的两个成员变量,而使用this关键字,可以标明哪个是成员变量,否则会因为无法区分,而初始化值失败。
Car(String color, String brand) { System.out.println("初始化汽车属性"); this.color = color; this.brand = brand; }
再看下一个例子:
public class Car { String color; String brand; //带String类型参数的构造方法 Car(String color, String brand) { System.out.println("初始化汽车属性"); this.color = color; this.brand = brand; } void run() { System.out.println("一辆" + this.color + "的" + this.brand + "汽车正在行驶"); } void test(){ String color; color = "红色"; System.out.println(color); System.out.println(this.color); this.run(); } public static void main(String[] args) { //创建一个对象 Car wuLing = new Car("灰色", "五菱宏光S"); //调用行驶方法 wuLing.test(); } } 初始化汽车属性 红色 灰色 一辆灰色的五菱宏光S汽车正在行驶
在上述程序中,test方法中声明了一个局部变量color,并赋值为"红色",而类中还具有一个同名的成员变量,在创建对象时初始化为"灰色",通过执行结果可以看出,使用this关键字便可以区分出哪个是成员变量,哪个是局部变量。
而且,既然它代表着当前对象,所以也可以用来调用方法,比如在test方法中执行的this.run();
-
用于在构造方法中调用其他构造方法。
例如:
public class Car { String color; String brand; //带String类型参数的构造方法 Car(String color, String brand) { this(); System.out.println("带参构造方法,初始化汽车属性"); this.color = color; this.brand = brand; } Car(){ System.out.println("无参构造方法"); } public static void main(String[] args) { //创建一个对象 Car wuLing = new Car("灰色", "五菱宏光S"); } } 执行结果: 无参构造方法 带参构造方法,初始化汽车属性
在上述代码中,存在Car(String color, String brand)与Car()两个构造方法,Car(String color, String brand)中的this();语句就代表着执行构造方法Car()。同样Car()构造方法也可以是一个带参的构造方法,比如:Car(参数类型 参数名),将this();改为this(参数); 即可。
需要注意的是:在构造方法中如果使用this();那么它必须放在第一行,否则会编译报错。也就是说this();所调用的构造方法不可影响当前构造方法的初始化结果。