前言
Java是一门面向对象的编程语言,通过类和对象的概念可以对现实事物进行抽象和封装。本文将带领大家逐步理解Java面向对象编程的关键要点,并通过示例代码加深理解。学完本文,你将能够熟练使用Java类和对象表示现实世界中的概念,为后续的Java学习奠定坚实基础。
类和对象
类是对一群具有相同属性和行为的对象的抽象,对象是类的实例。我们通过四个例子来理解类和对象的概念:
Dog 类
Dog类用于表示狗,它包含名字、健康值、亲密度等属性,以及吃食物、打印信息等行为。我们可以创建多个Dog对象,每个对象都代表一只狗,并拥有独立的属性值。
package cn.qq.xiangmu.entity;
public class Dog {
private String name;
private int health;
private int love;
private String strain;
// 个人建议,没有什么特殊要求时,提供无参和满参构造函数即可
// 默认系统会提供一个无参的公有的没有什么内容的构造函数
public Dog() {
//this("匿名", 50, 50, "土狗"); // 构造函数的调用,必须在函数体的第一行。不允许递归死循环调用。实际开发很少使用!
}
// 如果自定义了有参构造函数,系统就不再提供无参构造函数
public Dog(String name, int health, int love, String strain) {
//this(); // 构造函数的调用,必须在函数体的第一行。不允许递归死循环调用。实际开发很少使用!
this.name = name;
this.health = health;
this.love = love;
this.strain = strain;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
if (health < 0) health = 0;
if (health > 100) health = 100;
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public void print() {
System.out.println("宠物的自白");
System.out.println("我的名字叫"+name+",健康值是"+health+",和主人的亲密度是"+love+",我是一只"+strain);
}
}
Dog
类表示一只狗,包括名称、健康值、亲密度和品种等属性。- 通过构造函数,可以初始化这些属性。
- 提供了 getter 和 setter 方法,以便访问和修改这些属性。
print
方法用于打印狗的信息。
Penguin 类
Penguin类用于表示企鹅,属性和行为与Dog类类似,区别在于添加了表示性别的属性。多个Penguin对象可用于代表不同的企鹅。
package cn.qq.xiangmu.entity;
public class Penguin {
// 常量的定义 可以参考 Integer.MAX_VALUE
public static final String SEX_MALE = "Q仔";
public static final String SEX_FEMALE = "Q妹";
private String name;
private int health;
private int love;
private String sex;
public Penguin() {
}
public Penguin(String name, int health, int love, String sex) {
this.name = name;
this.health = health;
this.love = love;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
if (health < 0) health = 0;
if (health > 100) health = 100;
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void print() {
System.out.println("宠物的自白");
System.out.println("我的名字叫"+name+",健康值是"+health+",和主人的亲密度是"+love+",性别是"+sex);
}
}
Penguin
类表示一只企鹅,包括名称、健康值、亲密度和性别等属性。- 通过构造函数,可以初始化这些属性。
- 提供了 getter 和 setter 方法,以便访问和修改这些属性。
print
方法用于打印企鹅的信息。- 类中定义了常量字段
SEX_MALE
和SEX_FEMALE
用于表示企鹅的性别。
Xxx 类
package cn.qq.xiangmu.entity;
public class Xxx {
public int a1 = 1;
public static int a2 = 2;
public Xxx() {
System.out.println("Xxx()构造函数");
}
public Xxx(int a1) {
System.out.println("Xxx(int)构造函数");
this.a1 = a1;
}
public void f1() {
System.out.println("f1(): " + this.a1 + Xxx.a2);
Xxx.f2();
}
public static void f2() {
System.out.println("f2(): " + Xxx.a2);
}
}
Xxx
类包含了一个实例变量a1
和一个静态变量a2
。- 通过构造函数,可以创建
Xxx
类的实例并初始化实例变量。 f1
方法是实例方法,用于打印实例变量a1
和静态变量a2
的值。f2
方法是静态方法,用于打印静态变量a2
的值。
Yyy 类
package cn.qq.xiangmu.entity;
public class Yyy {
int a1;
public static int a2;
public Yyy() {
a1 = 10;
}
{
// 代码块 构造了n次对象前,默认就会自动调用n次
a1++;
}
static {
// 静态代码块 该类有访问就唯一调用一次
a2++;
}
public void f1() {
System.out.println(a1);
}
}
Yyy
类包含了一个实例变量a1
和一个静态变量a2
。- 构造函数初始化实例变量
a1
。 - 类中包括实例初始化块,这些块在创建对象之前自动执行。
- 类还包括静态初始化块,这些块在类加载时执行,仅执行一次。
f1
方法用于打印实例变量a1
的值。
测试类
Demo01 类
package cn.qq.xiangmu.test;
import cn.qq.xiangmu.entity.*;
public class Demo01 {
public static void main(String[] args) {
Dog dog = new Dog("欧欧", 100, 0, "德国牧羊犬");
System.out.println(Penguin.SEX_FEMALE);
Penguin penguin = new Penguin("美美", 90, 10, Penguin.SEX_FEMALE);
dog.print();
penguin.print();
}
}
- 包含一个
main
方法,演示了如何使用Dog
和Penguin
类创建实例并打印它们的信息。
Demo02 类
package cn.qq.xiangmu.test;
import cn.qq.xiangmu.entity.Xxx;
public class Demo02 {
public static void main(String[] args) {
Xxx xxx1 = new Xxx(1111);
Xxx xxx2 = new Xxx(11111);
System.out.println(xxx1.a1);
System.out.println(xxx2.a1);
xxx1.f1();
xxx2.f1();
Xxx.a2 = 22;
Xxx.f2();
}
}
- 包含一个
main
方法,演示了如何使用Xxx
类创建实例、调用方法以及修改静态变量。
Demo03 类
package cn.qq.xiangmu.test;
import cn.qq.xiangmu.entity.Yyy;
public class Demo03 {
public static void main(String[] args) {
System.out.println(Yyy.a2);
System.out.println(Yyy.a2);
}
}
- 包含一个
main
方法,演示了如何使用Yyy
类访问其静态变量a2
。
总结
通过这份学习笔记,我们全面了解了Java类的各个组成部分,包括:
- 实例变量和静态变量的区别
- 构造函数的作用
- 实例方法和静态方法的区别
- 实例初始化块和静态初始化块的执行时机
并通过测试类验证了这些概念在实际编程中的用法。这为我们后续学习Java的面向对象特征如继承、多态等奠定了坚实的基础。