十二、类与对象

本教程介绍了面向对象编程的基础概念,包括类的定义、对象的创建与使用。通过实例讲解了如何创建Dog类,设置其属性和方法,如eat和run。还探讨了构造方法的作用,展示了无参构造和有参构造的使用。进一步,学习了this关键字在对象成员变量中的应用,以及如何通过静态关键字修饰方法和变量。最后,设计了一个WuMingFen类,包含静态方法和变量,以及不同的构造方法。
摘要由CSDN通过智能技术生成

第1关:什么是类,如何创建类


任务描述
本关任务:创建一个类和一个对象,调用这个对象的属性和方法。

相关知识
为了完成本关任务,你需要掌握:1、什么是类和对象; 2、怎么定义类; 3、怎么创建对象并使用对象的属性和方法。

什么是类
类:类是一个模板,它描述一类对象的行为和属性。
对象:对象是类的一个实例,有 属性 和 行为 。

举个例子:

人是一个 “类”,小明就是人的 “对象” ,女生/男生是一个类,你的女朋友/男朋友就是一个对象,这个对象的属性有:名字,性别,年龄;行为有:吃饭、睡觉、学习等。

在Java中对象的状态就是属性,行为通过方法体现,即Java中的对象一般由属性和行为组成。

怎么定义类
需要使用class,声明这个类的名字。
举例说明:

class Student{
//声明这个是一个学生类
}

学生类中有年龄,姓名,性别属性,方法为吃饭,睡觉和学习。
在这里插入图片描述

创建对象并且使用对象的属性和方法
在这里插入图片描述

输出:

我叫:小明今年:12
小明正在吃饭
睡觉
学习

综上我们可以发现创建对象使用的公式就是:

类名 对象名 = new 类名();

给对象的属性赋值:

对象名.属性名 = 值;

使用对象的属性:

对象名.属性名

调用对象的方法:

对象名.方法名();

编程要求
根据提示,在右侧编辑器Begin-End处补充代码:

声明一个Dog类,给Dog类添加三个String类型的属性,分别是name,color,variety ,定义两个方法,分别是,eat,run

在main方法中创建一个名为wuhuarouDog对象,并设置name为五花肉,color为棕色,variety为阿拉斯加。

使得调用wuhuarou对象的eat方法能输出啃骨头,调用run方法能输出叼着骨头跑。

具体输出要求请看测试说明。

测试说明
测试输入:

预期输出:使用中文冒号

名字:五花肉,毛色:棕色,品种:阿拉斯加
啃骨头
叼着骨头跑

代码实现

package step1;
public class Test {
	public static void main(String[] args) {
		/********** Begin **********/
		Dog wuhuarou=new Dog();
		wuhuarou.name="五花肉";
		wuhuarou.color="棕色";
		wuhuarou.variety="阿拉斯加";//设置Dog对象的属性
		//输出小狗的属性
		System.out.println("名字:" + wuhuarou.name    + ",毛色:" + wuhuarou.color   + ",品种:" +wuhuarou.variety );
		//调用方法
         wuhuarou.eat();
		 wuhuarou.run();
		/********** End **********/
	}
}
//在这里定义Dog类
/********** Begin **********/
  class Dog{
	  String name;
	  String color;
	  String variety;
	 void  eat(){
		  System.out.println("啃骨头");
	  }
	  void run(){
		  System.out.println("叼着骨头跑");
	  }
  }
/********** End **********/

第2关:构造方法


任务描述
本关任务:创建对象给对象定义无参构造方法和有参构造方法。

相关知识
为了完成本关任务,你需要掌握:1.什么是构造方法,2.如何定义和调用构造方法。

什么是构造方法
构造方法:对象被创建的时候会调用的方法,对象在被创建的时候,也就是被new的时候,会自动调用构造方法。

举个例子:
在这里插入图片描述

输出:

我被调用了

怎么定义和使用构造方法
怎么定义构造方法呢?构造方法和我们之前学习的方法又有啥区别呢?
请看图:
在这里插入图片描述

看出区别来了吗?
好,我来总结一下,看你是否能在上图中找出相对应的代码:

构造方法可以有参数,也可以无参数;

构造方法无返回值,也不需要声明void关键字;

构造方法名必须和类名相同。

接下来我在main方法中创建Student对象代码如下:

public static void main(String[] args){
        Student stu = new Student();
        Student stu1 = new Student("张三");
}

你觉得会有输出吗,如果有那么输出结果会是什么呢?如果没有那你觉得原因是什么呢?

编程要求
根据提示,在右侧编辑器Begin-End处补充代码:

创建一个Person类,给Person类定义一个无参构造方法和一个有参构造方法,有参构造方法定义两个String类型参数namesexmain方法中调用无参构造和有参构造方法;

调用无参构造方法输出:一个人被创建了;

调用有参构造方法应根据输入的数据输出对应的结果,如输入:张三,男,则输出:姓名:张三,性别:男,被创建了。

测试说明
测试输入:张富贵,未知
预期输出:

一个人被创建了
姓名:张富贵,性别:未知,被创建了

总结:
对象的构造方法:
对象在被创建的时候,也就是被new的时候,会自动调用构造方法。

在构造方法中可以做对象初始化操作,有如下特征;

1、构造方法与对象的方法不同,它是在对象创建时自动调用的;
2、构造方法可以有参数,也可以无参数;
3、构造方法无返回值;
4、构造方法名必须和类名相同;
5、如果定义的类没有声明构造方法,对象在创建时默认使用空的构造方法。

代码实现

package step2;

import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String name = sc.next();
		String sex = sc.next();
		/********** Begin **********/
		//分别使用两种构造器来创建Person对象  
		Person a=new Person();
        Person b=new Person(name,sex);
		
	}
}

//创建Person对象,并创建两种构造方法
/********** Begin **********/
class Person{
		  public Person(){
			   System.out.println("一个人被创建了");
		  }
		  public Person(String name,String sex){
			  	System.out.print("姓名:"+name+",性别:"+sex+",被创建了");
		  }
	  }

/********** End **********/

第3关:This关键字


任务描述
本关任务:使用this关键字,设置对象的成员变量。

相关知识
我们先来看一段代码:

在这里插入图片描述

输出结果:

传入的name:李四age:10
student属性name:张三age:18

上述结果我们可以发现一个问题,在构造方法中nameage并没有设置成功,stu对象的name属性和age属性的值还是默认定义好的张三和18。

怎么解决这个问题呢?你需要学习两个知识点:1.什么是成员变量; 2.this关键字。

什么是成员变量
成员变量就是对象的属性:
在这里插入图片描述

this关键字
关于this关键字,你只需要记住它就是指自身,this即代表自己,this.属性访问的是自己的属性、this()访问的就是自己的无参构造方法。

例1:this.属性
在这里插入图片描述

例2:this.属性,this()

在这里插入图片描述

输出:

I am
张三

可以发现,如果我们把上述this.name = name改为 name = name,那么最终的结果就变成了:

I am
null

this()调用的是Person自己的无参构造方法,this.name访问的是Person对象自身的name,而方法参数中的name则表示方法传入的值。

学会了this关键字的用法,那本关最开始遇到的问题是不是就有解了呢?

编程要求
右侧编辑器中已经编写好了代码,但是输出结果不能让我们满意,请根据所学知识修改代码,使其能输出如下结果:

name:baby
age:45
sex:女

测试说明
测试输入:

baby,45,女

预期输出:

name:baby
age:45
sex:女

代码实现

package step3;

import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String name = sc.next();
		int age = sc.nextInt();
		String sex = sc.next();
		Person p = new Person(name,age,sex);
		p.display();
	}
}

class Person{
	String name = "张三";
	int age = 18; 
	String sex = "男";
	/********** Begin **********/

	public Person(String name,int age,String sex){
		this(age);
		this.name = name;
		this.sex = sex;
	}
	
	public Person(int age){
		this.age = age;
	}
	
	public void display(){
		String name = "李四";
		int age = 11;
		String sex = "男";
		System.out.println("name:" + this.name);
		System.out.println("age:" + this.age);
		System.out.println("sex:" + this.sex);
	}


	/********** End **********/
}

第4关:类与对象练习


任务描述
本关任务:为“无名的粉”写一个类,编写该类的构造方法和成员变量。

相关知识
包的概念
在之前我们定义类和定义方法都是在一个文件中编写的,但是在实际开发过程中我们肯定不能使用一个文件去编写所有的代码。
怎么解决这个问题呢?

Duang,包,登场了,包就像我们windows系统中的文件夹一样,只不过包是专门存放代码文件的。

包的主要作用就是给代码文件分类。

在这里插入图片描述

如果一个类被定义在某一个包下那么在定义类的时候需要声明包名,否则程序会报错。

如:

在这里插入图片描述

编程要求
我已经帮你创建好了两个文件一个是WuMingFen.java,另一个是Test.java,你需要切换文件在两个文件中编写代码来完成本关任务。

为“无名的粉”写一个类:class WuMingFen 要求:

有三个属性:面码:String theMa 粉的分量(两):int quantity 是否带汤:boolean likeSoup

写一个构造方法,以便于简化初始化过程,如:

WuMingFen f1 = new WuMingFen("牛肉",3,true);;

重载构造方法,使得初始化过程可以多样化:

  WuMingFen f2 = new WuMingFen("牛肉",2);;

如何使得下列语句构造出来的粉对象是酸辣面码、2两、带汤的?

 WuMingFen f3 = new WuMingFen();;

写一个普通方法:check(),用于查看粉是否符合要求。即:将对象的三个属性打印在控制台上。

测试说明
我会对你编写的代码进行测试:

测试输入:

牛肉,3,true

预期输出:

面码:牛肉,粉的份量:3两,是否带汤:true
面码:牛肉,粉的份量:3两,是否带汤:false
面码:酸辣,粉的份量:2两,是否带汤:true

测试输入:

三鲜,1,true

预期输出:

面码:三鲜,粉的份量:1两,是否带汤:true
面码:三鲜,粉的份量:1两,是否带汤:false
面码:酸辣,粉的份量:2两,是否带汤:true

鼠标悬停即可切换文件:

在这里插入图片描述

代码实现

package step4;
import java.util.Scanner;
public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String theMa = sc.next();
		int quantity = sc.nextInt();
		boolean likeSoup = sc.nextBoolean();
		/********** Begin **********/
		WuMingFen f1=new WuMingFen(theMa,quantity,likeSoup);
		//使用三个参数的构造方法创建WuMingFen对象  取名 f1
		WuMingFen f2=new WuMingFen(theMa,quantity,false);//使用两个参数的构造方法创建WuMingFen对象  取名 f2
		WuMingFen f3=new WuMingFen(); //使用无参构造方法创建WuMingFen对象  取名 f3
		//分别调用三个类的 check方法
	    f1.check();
		f2.check();
		f3.check();
		/********** End **********/	
	}
}
/********** Begin **********/
//在这里添加包名  step4
    class WuMingFen{
		String theMa="酸辣";
		int quantity=2;
		boolean likeSoup=true;
   public WuMingFen(){  
    }
  public WuMingFen(String a,int b, boolean c){
        theMa=a;
		quantity=b;
		likeSoup=c;	
	}
	public WuMingFen(String a,int b){
				 theMa=a;
				quantity=b;
			}	
	public void check(){
		 System.out.print("面码:"+theMa+",粉的份量:"+quantity+"两,是否带汤:"+likeSoup);
		System.out.println();
			}
}
/********** End **********/	

第5关:static关键字


任务描述
本关任务:使用static关键词设置方法和变量的属性。

相关知识
为了完成本关任务,你需要掌握:1.static关键字有什么作用,2.怎么使用static关键字。

什么是static关键字
static关键字我们经常接触,不过我们一直没有讨论过它到底是什么,有什么具体的作用,那static关键字是什么呢,有啥用呢?

static是静态的意思,是一个修饰符,就像是一个形容词,是用来形容类,变量,方法的。

static修饰变量,这个变量就变成了静态变量,修饰方法这个方法就成了静态方法,

static关键字方便在没有创建对象的情况下来进行调用(方法/变量)。

static关键字的作用
static关键字你可以理解为是一个形容词,一般是用来形容类、方法、变量,代码块,还有一个作用是用来静态导包,本关我们只讨论它的三个用法。

1.修饰变量
不使用static关键字访问对象的属性:
在这里插入图片描述

使用static关键字访问对象的属性:

在这里插入图片描述

注意:如果一个类的成员变量被static修饰了,那么所有该类的对象都共享这个变量。无论这个类实例化多少对象,它的静态变量只有一份拷贝。
如:
在这里插入图片描述

输出:

李四
李四
李四

2.修饰方法

用static关键字修饰的方法叫做静态方法。静态方法我们已经用过,它有一个特点相信你已经很熟悉,那就是不需要创建对象就可以直接使用。
如:
在这里插入图片描述

注意

静态方法不能使用类的非静态变量;
在这里插入图片描述

静态方法可以直接调用静态方法,但是调用普通方法只能通过对象的实例才能调用。
在这里插入图片描述

3.静态代码块

我们先来看一段静态代码块的运行效果:
在这里插入图片描述

输出结果:

我被调用了

上图中static{ }就是一个静态代码块。

我们在main方法中没有编写任何代码,可是运行的时候,程序还是会输出我被调用了,由此我们可以发现静态代码块是不需要依赖main方法就可以独立运行的。

关于静态代码块你只需要记住一句话:在类被加载的时候运行且只运行一次。

静态代码块中变量和方法的调用也遵守我们之前所说的规则,即只能直接调用静态的属性和方法。

编程要求
现在编辑器中代码有异常,请利用本关所学知识修改右侧代码使其能输出如下结果:

hello educoder
我叫楚留香
我喜欢在educoder上学习java

注意: 在Java中是不能用static关键字修饰局部变量的,为什么? 因为这个是老大说的,我们做小弟的不能不听呀。

代码实现

package step5;
public class Test {
	/********** Begin **********/
	static String name = "楚留香";
	static{
		System.out.println("hello educoder");
	}	
	public static void main(String[] args) {
		System.out.println("我叫" + name);
		study();
	}
	public static void study(){
		System.out.println("我喜欢在educoder上学习java");
	}
	/********** End **********/
}
  • 13
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请你吃茶去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值