类,构造,this,static

news2024/11/26 19:32:48

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

100

  • 任务要求
  • 参考答案
  • 任务描述
  • 相关知识
    • 什么是类
    • 怎么定义类
    • 创建对象并且使用对象的属性和方法
  • 编程要求
  • 测试说明

任务描述

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

相关知识

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

什么是类

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

举个例子:

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

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

怎么定义类

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

 
  1. class Student{
  2. //声明这个是一个学生类
  3. }

学生类中有年龄,姓名,性别属性,方法为吃饭,睡觉和学习。

创建对象并且使用对象的属性和方法

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

综上我们可以发现创建对象使用的公式就是: 类名 对象名 = new 类名(); 给对象的属性赋值: 对象名.属性名 = 值; 使用对象的属性: 对象名.属性名 调用对象的方法: 对象名.方法名();

编程要求

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

  • 声明一个Dog类,给Dog类添加三个String类型的属性,分别是namecolorvariety ,定义两个方法,分别是,eatrun
  • main方法中创建一个名为wuhuarouDog对象,并设置name五花肉color棕色variety阿拉斯加
  • 使得调用wuhuarou对象的eat方法能输出啃骨头,调用run方法能输出叼着骨头跑

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

测试说明

测试输入:

预期输出:使用中文冒号 名字:五花肉,毛色:棕色,品种:阿拉斯加 啃骨头 叼着骨头跑

package step1;

public class Test {
	public static void main(String[] args) {
		/********** Begin **********/
		//创建Dog对象
		//设置Dog对象的属性
		Dog dog=new Dog();
		dog.name="五花肉";
        dog.color="棕色";
        dog.variety="阿拉斯加";
		//输出小狗的属性
		System.out.println("名字:" + dog.name + ",毛色:" + dog.color + ",品种:" + dog.variety );
		
		//调用方法
        dog.eat();
		dog.run();
		/********** End **********/
		
	}
}

//在这里定义Dog类
/********** Begin **********/
class Dog{
    String name,color,variety;
    public void eat(){
        System.out.println("啃骨头");
       
    } 
    public void run(){
         System.out.println("叼着骨头跑");
    }
}


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

第2关:构造方法

100

  • 任务要求
  • 参考答案
  • 任务描述
  • 相关知识
    • 什么是构造方法
    • 怎么定义和使用构造方法
  • 编程要求
  • 测试说明

任务描述

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

相关知识

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

什么是构造方法

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

举个例子:

输出:

我被调用了

怎么定义和使用构造方法

怎么定义构造方法呢?构造方法和我们之前学习的方法又有啥区别呢? 请看图:

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

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

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

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

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

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

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

编程要求

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

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

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

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

测试说明

测试输入:张富贵未知 预期输出: 一个人被创建了 姓名:张富贵,性别:未知,被创建了

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

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

  2. 构造方法与对象的方法不同,它是在对象创建时自动调用的;

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

  4. 构造方法无返回值;

  5. 构造方法名必须和类名相同;

  6. 如果定义的类没有声明构造方法,对象在创建时默认使用空的构造方法。

输出:

我被调用了

怎么定义和使用构造方法

怎么定义构造方法呢?构造方法和我们之前学习的方法又有啥区别呢? 请看图:

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

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

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

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

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

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

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

编程要求

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

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

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

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

测试说明

测试输入:张富贵未知 预期输出: 一个人被创建了 姓名:张富贵,性别:未知,被创建了

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

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

  2. 构造方法与对象的方法不同,它是在对象创建时自动调用的;

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

  4. 构造方法无返回值;

  5. 构造方法名必须和类名相同;

  6. 如果定义的类没有声明构造方法,对象在创建时默认使用空的构造方法。

输出:

我被调用了

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 x=new Person();
        Person y=new Person(name,sex);

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

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


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

第4关:This关键字

100

  • 任务要求
  • 参考答案
  • 任务描述
  • 相关知识
    • 什么是成员变量
    • 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:女

测试说明

测试输入: baby45 预期输出: 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=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 **********/
}

第5关:类与对象练习

300

  • 任务要求
  • 参考答案
  • 任务描述
  • 相关知识
    • 包的概念
  • 编程要求
  • 测试说明

任务描述

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

相关知识
包的概念

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

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(),用于查看粉是否符合要求。即:将对象的三个属性打印在控制台上。

测试说明

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

测试输入: 牛肉3true 预期输出: 面码:牛肉,粉的份量:3两,是否带汤:true 面码:牛肉,粉的份量:3两,是否带汤:false 面码:酸辣,粉的份量:2两,是否带汤:true

测试输入: 三鲜1true 预期输出: 面码:三鲜,粉的份量:1两,是否带汤:true 面码:三鲜,粉的份量:1两,是否带汤:false 面码:酸辣,粉的份量:2两,是否带汤:true

鼠标悬停即可切换文件:

 

/********** Begin **********/
//在这里添加包名  step4
package step4;
//创建类 添加属性和方法
class WuMingFen{
    String theMa;
    int quantity;
    boolean likeSoup;
    WuMingFen(String ma,int q,boolean l){
        theMa=ma;
        quantity=q;
        likeSoup=l;
    }
    WuMingFen(String ma,int q){
        quantity=q;
        theMa=ma;
        likeSoup=false;
    }
    WuMingFen(){
        theMa="酸辣";
        quantity=2;
        likeSoup=true;
    }
    public void check(){
        System.out.println("面码:"+theMa+",粉的份量:"+quantity+"两,是否带汤:"+likeSoup);
    }
}



/********** End **********/	
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
        WuMingFen f1=new WuMingFen(theMa,quantity,likeSoup);
		//使用两个参数的构造方法创建WuMingFen对象  取名 f2
        WuMingFen f2=new WuMingFen(theMa,quantity);
		//使用无参构造方法创建WuMingFen对象  取名 f3
        WuMingFen f3=new WuMingFen();
		//分别调用三个类的 check方法
        f1.check();
        f2.check();
        f3.check();
		
		/********** End **********/	
	}
}

特别注意一点,在类中写方法时候一定不能忘记它的放回类型以及它的权限

即public和void

第6关:static关键字

100

  • 任务要求
  • 参考答案
  • 任务描述
  • 相关知识
    • 什么是static关键字
    • static关键字的作用
  • 编程要求

任务描述

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

相关知识

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

什么是static关键字

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

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

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

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

static关键字的作用

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

1.修饰变量 不使用static关键字访问对象的属性:

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

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

输出:

李四 李四 李四

2.修饰方法

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

注意:

  1. 静态方法不能使用类的非静态变量;
  2. 静态方法可以直接调用静态方法,但是调用普通方法只能通过对象的实例才能调用。

3.静态代码块

我们先来看一段静态代码块的运行效果:

输出结果:

我被调用了

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

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

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

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

编程要求

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

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

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 **********/
}

特别注意:

在main函数中的那个name变量前面必须有static修饰,因为static方法不可以直接使用成员变量,必须通过对象,所以要不通过对象就需要将它设置为static即类变量

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1578420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

34-5 CSRF漏洞 - CSRF分类

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 1)GET 类型 传参: 参数连接在URL后面 POC构造及执行流程: 构造URL,诱导受害者访问点击利用利用标签进行攻击: 构造虚假URL,在链接上添加payload抓包获取数据包,通过CSRF POC…

解决Xshell连接Linux虚拟机速度慢问题

我们频繁更换网络环境时,可能会发现xshell连接Linux虚拟机的速度变得很慢 为什么呢? 因为ssh的服务端在连接时会自动检测dns环境是否一致导致的 我们把它修改为不检测即可 修改文件位置: vi /etc/ssh/sshd_config 把 #UseDNS yes 修改…

Redis7(二)数据类型及其用法

一、概述 命令不区分大小写&#xff0c;key区分大小写 数据类型针对value String List Set Hash ZSet bitmap GEO HyperLogLog Stream bitfield 二、String <K,V> 1、设值/取值 getrange key index1 index2 getrange key 0 -1//获取所有的值 SETRANGE KEY_N…

代码随想录第34天| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

1005.K次取反后最大化的数组和 1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 贪心算法&#xff0c;这不就是常识&#xff1f;还能叫贪心&#xff1f;LeetCode&#xff1a;1005.K次取反后最大化的数组和_哔哩哔…

如何选择苹果iOS系统的企业签名分发平台

哈喽&#xff0c;大家好呀&#xff0c;淼淼有和大家见面啦&#xff0c;前两期讲了分发内测的一些相关知识&#xff0c;这一期咱们来聊聊企业签名分发平台的相关知识。最近移动应用市场的竞争一天比一天要激烈&#xff0c;许多做开发的小伙伴们都在为此发愁&#xff0c;愁着该怎…

不要再使用 @Builder 注解了!有深坑呀!

曾经&#xff0c;我在《千万不要再随便使用 lombok 的 Builder 了&#xff01;》 一文中提到 Builder 注解的其中一个大坑会导致默认值失效&#xff01; 最近阅读了 《Oh !! Stop using Builder》 发现 Builder 的问题还不止一个&#xff0c;Builder 会让人误以为是遵循构建器…

java的封装

在Java中&#xff0c;封装是面向对象编程中的一种重要概念&#xff0c;它指的是将数据和方法打包在一个单一的单位&#xff08;类&#xff09;中&#xff0c;并对外部隐藏对象的内部细节。封装通过将类的成员变量声明为私有的&#xff0c;并提供公共的方法来访问和修改这些变量…

数据库关系模式三元及以上分解无损连接判断(表格法)

例题 1.首先构造初始表&#xff0c;如下表所示。 A B C D E ABC a1 a2 a3 b14 b15 CD b21 b22 a3 a4 b15 DE b31 b32 b33 a4 a5 2.遍历函数依赖&#xff0c;对AB→C&#xff0c;因各元组的第一、二列没有相同的分量&#xff0c;所以表不改变。 3.由C→D…

【日常记录】【JS】getComputedStyle 获取DOM的最终样式值

文章目录 1、介绍2、getComputedStyle3、链接 1、介绍 Window.getComputedStyle()方法返回一个对象&#xff0c;该对象在应用活动样式表并解析这些值可能包含的任何基本计算后报告元素的所有 CSS 属性的值。私有的 CSS 属性值可以通过对象提供的 API 或通过简单地使用 CSS 属性…

指针的深入理解(六)

指针的深入理解&#xff08;六&#xff09; 个人主页&#xff1a;大白的编程日记 感谢遇见&#xff0c;我们一起学习进步&#xff01; 文章目录 指针的深入理解&#xff08;六&#xff09;前言一. sizeof和strlen1.1sizeof1.2strlen1.3sizeof和strlen对比 二.数组名和指针加减…

javaWeb物流信息网的设计与实现

摘要 本文讲述了基于JSP物流信息网的设计与实现。该系统使用java语言开发&#xff0c;使系统具有更好的平台性和可扩展性。 该系统实现了用户登录、注册、查询快递信息、快递公司注册成为合作伙伴以及系统管理员对信息进行管理等功能。系统的主要界面会将所有的服务排列好&…

Typora段内公式

文件——>偏好设置——>Markdown——>内联公式 $$ 输入公式 $$

【grpc】二、grpc入门,基本使用方法

上篇介绍了使用protobuf生成grpc相关代码&#xff0c;并实现了服务端方法&#xff0c;本篇介绍下具体的使用。 一、服务端 // server.gopackage mainimport ("google.golang.org/grpc""grpcDemo/calc""net" )func startServer(addr string) {//…

【C语言】函数相关选择题

前言 关于函数相关的选择题。 题目一&#xff1a; C语言规定&#xff0c;在一个源程序中&#xff0c;main函数的位置&#xff08; &#xff09; A .必须在最开始 B .必须在库函数的后面 C .可以任意 D .必须在最后 题解&#xff1a;选择C。 main函数为C语言中整个工程的程序入…

快速理解vim编辑器和软硬连接

刚开始学习linux基础命令时最难搞懂的应该就是vi和ln命令了&#x1f62d;&#xff0c;写这篇文章主要想和大家分享一下我对这两个命令的理解&#xff0c;希望能更快的帮助到那些还没搞懂的同学&#x1f61c; 首先我们要知道vim编辑器主要分为三个工作模式&#xff0c;分别是图上…

python中的split()用法

在Python中&#xff0c;split() 是一个字符串方法&#xff0c;用于将字符串按照指定的分隔符分割成一个列表。如果没有提供分隔符&#xff0c;那么它会默认按照任何空白字符&#xff08;如空格、换行符、制表符等&#xff09;进行分割。 这里是 split() 方法的一些基本用法&am…

K8s学习九(配置与存储_存储)

存储管理 Volumes HostPath 将节点上的文件或目录挂载到 Pod 上&#xff0c;此时该目录会变成持久化存储目录&#xff0c;即使 Pod 被删除后重启&#xff0c;也可以重新加载到该目录&#xff0c;该目录下的文件不会丢失 效果就是容器里的数据和主机里的数据进行共享 配置文…

Hadoop安装部署-SecondaryNameNode备份版

Hadoop分布式文件系统支持NameNode节点的高可用性&#xff0c;本文主要描述Secondary NameNode数据备份版本的安装部署。 如上所示&#xff0c;NameNode主节点同步数据到NameNode备份节点&#xff0c;当NameNode主节点发生故障变得不可用时&#xff0c; NameNode主节点重新启动…

【多线程】多线程下使用集合类

一.Java中线程安全的集合类 Java中提供了多种线程安全的集合类&#xff0c;它们可以在多线程环境下安全地被多个线程同时访问而无需外部同步。以下是一些常见的线程安全集合类&#xff1a; Vector: 类似于 ArrayList 的动态数组&#xff0c;但是所有方法都是同步的&#xff0…

ThinkPhp8 框架使用 mysql find_in_set 函数

前言: 使用mysql 存储一些标签时 会使用逗号拼接的存储方法 比如 1,2,3,11 一般情况下 查询 1 可能会用到 like %1% 但这样查询的不够准确 因为11也会被查询到 如果每次都多一个逗号 1,2,3,11, 查询时 like %1,% 这样存储有点不太符合程序设计 解决方案 ----------- 官网…