一、前言
上文讲述了控制语句和数组的相关训练,本文将进入类和对象、实例成员和类成员的理解和练习,初学java还有很多不足,大家在阅读过程中发现有可以改进的地方欢迎私信或者评论区与我讨论。话不多说,我们进入正题~
二、类和对象
我们简单了解一下类和对象的概念:
• 类:它是Java中的蓝图或模板,用于定义一组具有相似特性和行为的对象。类中定义了对象的属性(字段)和方法(函数)。
类的定义通常包括类名、字段、构造函数、方法,以下做简要介绍:
类名:类的名称必须遵循Java的命名规则;
字段:类的属性,通常是私有的;
构造函数:用于初始化对象的状态;
方法:定义对象的行为。
• 对象:它是类的实例。当我们使用类创建一个对象时,实际上是在内存中创建了一个新的空间,用于存储该类的字段,并且可以调用该类的方法。
在Java中,类和对象是面向对象编程的核心概念,大家根据自己的需求适当拓展,接下来进入基础实训~
(一)类的封装
1.实验目的
学会使用类来封装对象的属性和功能。
2.实验要求
定义一个用户类User,要求如下:
(1)有2个私有成员变量:userName和password;
(2)有1个类变量num用于存放已经创建的用户人数,要求每创建一个用户对象,用户人数加
(3)有3个构造方法:1个无参,1 个有1个参数,1 个有2个参数的;
(4)为userName和password这两个私有成员变量添加set和get方法;
(5)编写一个用来显示对象信息的成员方法printInfo();
(6)测试User类的使用。
3.解题步骤
1)定义类
Ⅰ.定义一个名为User的公共类。
2)定义私有成员变量
Ⅰ.定义两个私有成员变量userName和password,用于存储用户的用户名和密码。
Ⅱ.定义一个静态变量num,用于记录创建的User对象的数量。
3)定义构造函数
Ⅰ.无参构造函数:初始化用户名和密码为空字符串,并增加用户计数。
Ⅱ.一个参数的构造函数:初始化用户名,并增加用户计数。
Ⅲ.两个参数的构造函数:初始化用户名和密码,并增加用户计数。
4)定义访问器和修改器方法
Ⅰ.定义getUserName和setUserName方法来获取和设置用户名。
Ⅱ.定义getPassword和setPassword方法来获取和设置密码。
5)定义其他方法
Ⅰ.定义printInfo方法来显示用户的信息。
Ⅱ.定义静态方法getNum来获取总的用户数量。
6)编写main方法
Ⅰ.在main方法中创建User对象,并调用相关方法来展示对象的功能。
4.解题关键点
1)懂得封装
Ⅰ.使用私有成员变量来隐藏类的内部状态。
Ⅱ.提供公共的访问器(getter)和修改器(setter)方法来访问和修改私有成员变量。
2)提供构造函数
Ⅰ.提供不同参数的构造函数,以满足不同的初始化需求。
3)使用静态成员变量
Ⅰ.使用静态成员变量num来记录创建的User对象的数量。
Ⅱ.每当创建一个新对象时,静态变量num都会递增。
4)实现方法
Ⅰ.printInfo方法用于显示用户的信息。
Ⅱ.getNum静态方法用于返回总的用户数量。
5)测试User类
Ⅰ.在main方法中创建不同的User对象,并调用它们的方法来验证类的功能。
5.源代码
public class User {
private String userName; // 2个私有成员变量
private String password;
private static int num = 0;
// 构造方法
// 无参
public User() {
this.userName = "";
this.password = "";
num++;
}
// 有1个参数
public User(String userName) {
this.userName = userName;
this.password = "";
num++;
}
// 有2个参数
public User(String userName, String password) {
this.userName = userName;
this.password = password;
num++;
}
// 获取用户名
public String getUserName() {
return userName;
}
// 设置用户名
public void setUserName(String userName) {
this.userName = userName;
}
// 获取密码
public String getPassword() {
return password;
}
// 设置密码
public void setPassword(String password) {
this.password = password;
}
// 显示对象信息
public void printInfo() {
System.out.println("User Name: " + userName);
System.out.println("Password: " + password);
}
// 获取总用户人数
public static int getNum() {
return num;
}
// 测试User类的使用
public static void main(String[] args) {
User user1 = new User();
user1.setUserName("用户1");
user1.setPassword("123456");
user1.printInfo();
User user2 = new User("用户2");
user2.setPassword("112233");
user2.printInfo();
User user3 = new User("用户3", "145678");
user3.printInfo();
User user4 = new User("用户4", "123789");
user4.printInfo();
System.out.println("用户总数: " + User.getNum());
}
}
4.程序运行结果
(二)类的组合
1.实验目的
理解类的组合思想,并掌握如何在一个类中使用另一个类的对象作为成员变量,同时学习如何通过引用传递来实现类之间的关联。
2.实验要求
使用类和对象来表示圆形(Circle)和圆锥形(Circular),具体如下:
1)创建对象:
Ⅰ.创建一个Circle对象circle。
Ⅱ.创建一个Circular对象circular。
2)设置属性:
Ⅰ.设置circle的半径为10。
Ⅱ.设置circular的高度为5。
Ⅲ.设置circular的底面圆形为circle。
3)输出信息:
Ⅰ.输出circle对象的引用。
Ⅱ.输出circular对象的bottom引用。
Ⅲ.输出circular的体积。
Ⅳ.修改circle的半径为20,并输出底面圆形的半径,以验证circular的底面圆形是否受到影响。
Ⅴ.重新创建Circle对象circle,并输出新的circle对象的引用。
Ⅵ.输出circular对象的bottom引用,以验证重新创建circle对象是否影响到了circular的底面圆形。
3.解题步骤
实验要求那里讲得相对清晰了,注意代码书写的先后顺序就好,这里不再赘述。
4.源代码
public class test
{
public static void main(String args[]){
Circle circle = new Circle();
circle.setRadius(10);
Circular circular = new Circular();
System.out.println("circle的引用:"+circle);
System.out.println("圆锥的bottom的引用:"+circular.bottom);
circular.setHeight(5);
circular.setBottom(circle);
System.out.println("circle的引用:"+circle);
System.out.println("圆锥的bottom的引用:"+circular.bottom);
System.out.println("圆锥的体积:"+circular.getVolume());
System.out.println("修改circle的半径,bottom的半径同样变化");
circle.setRadius(20 );
System.out.println("bottom的半径:"+circular.getBottomRadius());
System.out.println("重新创建circle,circle的引用将发生变化");
circle=new Circle();
System.out.println("circle的引用:"+circle);
System.out.println("但是不影响circular的bottom引用");
System.out.println("圆锥的bottom引用:"+circular.bottom);
}
}
5.程序运行结果
三、实例成员和类成员
1.实验目的(这题相对简单~已经给出注释啦)
掌握类变量和实例变量,类方法和实例方法的区别。
2.实验要求
给出部分程序代码如下:
class A
{
【代码1】 //声明一个float型实例变量a
【代码2】 //声明一个float型类变量b,即static变量b
void setA(float a)
{
【代码3】 //将参数a的值赋值给成员变量a
}
void setB(float b)
{
【代码4】 //将参数b的值赋值给成员变量b
}
float getA()
{
return a;
}
float getB()
{
return b;
}
void outPutA()
{
System.out.println(a);
}
static void outPutB()
{
System.out.println(b);
}
}
public class test1
{
public static void main(String args[])
{
【代码5】 //通过类名操作类变量b,并赋值100
【代码6】 //通过类名调用方法outPutB ()
A cat=new A();
A dog=new A();
【代码7】 //cat调用方法setA(int a)将cat的成员a的值设置为200
【代码8】 //cat调用方法setB(int b)将cat的成员b的值设置为400
【代码9】 //dog象调用方法setA(int a)将dog的成员a的值设置为150
【代码10】 //dog调用方法setB(int b)将dog的成员b的值设置为300
【代码11】 //cat调用outPutA ()。
【代码12】 //cat调用outPutB ()。
【代码13】 //dog调用outPutA ()。
【代码14】 //dog调用outPutB ()。
}
}
请按注释要求填空,完成并运行程序 。
3.源代码
class A
{
float a; //声明一个float型实例变量a
static float b; //声明一个float型类变量b,即static变量b
void setA(float a)
{
this.a = a; //将参数a的值赋值给成员变量a
}
void setB(float b)
{
A.b = b; //将参数b的值赋值给成员变量b
}
float getA()
{
return a;
}
float getB()
{
return b;
}
void outPutA()
{
System.out.println(a);
}
static void outPutB()
{
System.out.println(b);
}
}
public class test1
{
public static void main(String args[])
{
A.b = 100; //通过类名操作类变量b,并赋值100
A.outPutB(); //通过类名调用方法outPutB ()
A cat=new A();
A dog=new A();
cat.setA(200); //cat调用方法setA(int a)将cat的成员a的值设置为200
cat.setB(400); //cat调用方法setB(int b)将cat的成员b的值设置为400
dog.setA(150); //dog象调用方法setA(int a)将dog的成员a的值设置为150
dog.setB(300); //dog调用方法setB(int b)将dog的成员b的值设置为300
cat.outPutA(); //cat调用outPutA ()。
cat.outPutB(); //cat调用outPutB ()。
dog.outPutA(); //dog调用outPutA ()。
dog.outPutB(); //dog调用outPutB ()。
}
}
4.程序运行结果
5.实验后提问
(1)将outPutA ( )方法中的System.out.println(a)改写为:System.out.println(a+b),编译是否出错?为什么?
答:编译不会出错,因为b是类变量,通过类名可以直接访问类变量。运行结果如下:
(2)将outPutB( )方法中的System.out.println(b)改写为:System.out.println(a+b),编译是否出错?为什么?
答:编译会出错,报错提示无法从静态上下文中引用非静态变量a,因为在 outPutB()方法中,变量b是一个类变量也称为静态变量和static变量,而变量a是一个实例变量。静态方法只能访问静态成员,无法直接访问实例变量。报错如下:
以上就是博主所做关于类和对象、实例成员和类成员的理解和练习,后续还会更新其他类型,希望能对广大求学者有所帮助!