前言
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类的机制。它提供了命名空间的概念,可以防止类名冲突。通过将相关的类放入同一个包中,可以更好地组织代码,并且有助于代码的可读性和可维护性。
这些主题都是Java面向对象编程中的重要概念,深入理解它们将有助于你在实际开发中设计和构建高质量的Java应用程序。
总结
通过这份学习笔记,我们全面了解了Java类的各个组成部分,包括:
- 实例变量和静态变量的区别
- 构造函数的作用
- 实例方法和静态方法的区别
- 实例初始化块和静态初始化块的执行时机
并通过测试类验证了这些概念在实际编程中的用法。这为我们后续学习Java的面向对象特征如继承、多态等奠定了坚实的基础。
在这篇文章中,我们学习了Java中面向对象编程的关键要点,包括类和对象的概念、属性和行为的抽象以及如何使用示例代码加深理解。通过对四个例子(Dog、Penguin、Xxx、Yyy)的介绍和代码演示,我们对类和对象有了更深入的理解。
Dog
类用于表示狗的属性和行为,包括名字、健康值、亲密度和品种等。我们可以创建多个Dog
对象来代表不同的狗。Penguin
类用于表示企鹅的属性和行为,与Dog
类类似,但添加了性别属性。也可以创建多个Penguin
对象来代表不同的企鹅。Xxx
类包含实例变量和静态变量,通过构造函数初始化实例变量,并提供了实例方法和静态方法来访问这些变量。Yyy
类也包含实例变量和静态变量,但同时还包括了实例初始化块和静态初始化块。实例初始化块在创建对象之前自动执行,而静态初始化块在类加载时执行,仅执行一次。
我们还介绍了测试类 Demo01
、Demo02
和 Demo03
的使用方法,展示了如何创建实例、调用方法以及修改静态变量。
通过学习这些内容,我们深入理解了类的各个组成部分,包括实例变量、静态变量、构造函数、实例方法、静态方法以及初始化块的执行时机。这为后续学习Java中的面向对象特性如继承、多态等打下了坚实的基础。