首页 > 编程语言 >JAVA零基础小白自学日志——第八天

JAVA零基础小白自学日志——第八天

时间:2024-07-06 20:28:11浏览次数:22  
标签:JAVA weight DogClass 第八天 int two String 日志 构造函数

文章目录


今日提要:封装(其实说白了,封装就是对访问范围的限制,不用因为名字就觉得高大上了)哦,对了,还要顺便讲个构造函数
我在两天的学习里都提到了封装,而且是很严肃的,那你就应该知道这个封装对于Java程序非常重要;
把昨天最后一个狗狗的程序拿过来用作例子吧

1.封装

public class BeginnerTestDog {//创建一个公共类

	public static void main(String[] args) {//main()函数
		
		//依据DogClass创建一个名为one的对象
		DogClass one = new DogClass();
		one.size = 15;//身长
		one.weight = 3;//体重
		one.breed = "泰迪";//品种
		one.name = "黑漆漆";//名字
		one.dogReaction();//调用方法
		
		//依据DogClass创建一个名为two的对象
		DogClass two = new DogClass();
		two.size = 80;
		two.weight = 60;
		two.breed = "金毛";
		two.name = "老牛牛";
		two.dogReaction();
		
	}//end main
}//end class

class DogClass{
	
	int size;//身长
	int weight;//体重
	String breed;//品种
	String name;//名字
	
	void dogReaction() {
		
		String bark = "汪汪汪";
		
		//判断狗的叫声
		if (weight <= 5) {
			bark = "歪歪歪";
		}else if(weight > 5 && weight <= 15) {
			bark = "汪汪汪";
		}else if(weight > 15 && weight <= 30) {
			bark = "汪呜汪呜汪呜";
		}else if(weight > 30) {
			bark = "嗡呜嗡呜嗡呜";
		}//end if
		
		//输出结果
		System.out.println("一只身长 " + size + " 公分,体重 " + weight + " 公斤,名叫 " + name +" 的 "+ breed + " 正在 " + bark + " 的叫着");	
		
	}//end dogReaction	
}//end DogClass

大家可以看得很清楚,上面这个程序我在公共类里为DogClass类的实例变量直接进行了赋值,这仅是为了大家便于观察实例变量和对象的依存关系,首先说明这样的做法对于一个Java程序而言风险极大,应该是重点避免的,一个安全的Java程序,应该做到,类内数据操作的细节,自主完成,不接受外部干涉,外部仅能调用和操作对外开放的方法,禁止一切对对象数据实际表示的访问,应通过方法进行操作和访问。

以上加粗字体翻译成人话就是:类内数据必须设置访问权限,不允许外部直接操作,想要操作必须通过方法进行;

这里涉及到的最重要的原则:变量作用域最小原则
让我们更改一下上面的狗狗程序,来看看不同之处

public class BeginnerTestDog {//创建一个公共类

	public static void main(String[] args) {//main()函数
		
		//依据DogClass创建一个名为one的对象
		DogClass one = new DogClass(15, 3, "泰迪", "黑漆漆");
		//one.DogClass(15, 3, "泰迪", "黑漆漆");
		//one.size = 15;//身长
		//one.weight = 3;//体重
		//one.breed = "泰迪";//品种
		//one.name = "黑漆漆";//名字
		one.dogReaction();//调用方法
		
		//依据DogClass创建一个名为two的对象
		DogClass two = new DogClass(80, 60, "金毛", "老牛牛");
		//two.DogClass(80, 60, "金毛", "老牛牛");
		//two.size = 80;
		//two.weight = 60;
		//two.breed = "金毛";
		//two.name = "老牛牛";
		two.dogReaction();
		
	}//end main
}//end class

class DogClass{
	
	private int size;//身长
	private int weight;//体重
	private String breed;//品种
	private String name;//名字

    DogClass (int tempSize, int tempWeight, String tempBreed, String tempName) {//设置一个构造函数,初始化变量
		
		size = tempSize;
		weight = tempWeight;
		breed = tempBreed;
		name = tempName;
		
	}// end 构造函数	
		
	void dogReaction() {
		
		String bark = "汪汪汪";
		
		//判断狗的叫声
		if (weight <= 5) {
			bark = "歪歪歪";
		}else if(weight > 5 && weight <= 15) {
			bark = "汪汪汪";
		}else if(weight > 15 && weight <= 30) {
			bark = "汪呜汪呜汪呜";
		}else if(weight > 30) {
			bark = "嗡呜嗡呜嗡呜";
		}//end if
		
		//输出结果
		System.out.println("一只身长 " + size + " 公分,体重 " + weight + " 公斤,名叫 " + name +" 的 "+ breed + " 正在 " + bark + " 的叫着");	
		
	}//end dogReaction	
}//end DogClass

看到这里会发现,在实例变量的前面多了一个修饰符“private”,这就是一个访问权限修饰符,这样的修饰符我们共有四个
**“public”、“protected”、“默认空修饰符”、“private”**它们的可见范围是依次缩小的,“public”(公共)最大,谁都能访问,“private”(私有)最小,只有本类可以访问,作为初学者的我们应习惯将实例变量的访问权限设置为“private”,这样能最好的保护类的结构和输出结果不被破坏。
就比如说,如果不控制访问权限范围,而某个类里书写了,“xx.size = 0;”,那么我们将得到一个没有厚度的二维的狗狗(二向箔么?)或者书写了“xx.weight = -20”;那么我们就得到了一个失重的狗狗,不过也好,能飞了,作为一个正常逻辑的程序,这些结果都不是我们想要的,也不是我们书写的初衷,那么设置访问权限私有,就很好的解决了这个问题,你看了眼程序,翻了一个白眼说,我还不是一样能把参数设置成0,有什么区别?那就来说说区别

    DogClass (int tempSize, int tempWeight, String tempBreed, String tempName) {//设置一个构造函数,初始化变量
		if (tempSize > 8 && tempSize < 120) {//设定狗狗身长的范围
			size = tempSize;
		}else {
			System.out.println("你输入的尺寸不符合要求,按照默认值输出");
			size = 9;
		}//end if
		
		weight = tempWeight;
		breed = tempBreed;
		name = tempName;
		
	}// end 构造函数	

看到区别了么?(我耸了耸肩,对你一笑,摊开手说)你的二向箔狗狗没有了…同理也可以让失重的狗狗消失(飞走了不是消失,飞到哪里,都是客观实在,只不过有可能看不到了而已,这是有区别的)。
这就是我们现阶段需要了解的封装,以后经验丰富了,或许会根据不同的需求,可以采取不同访问权限的设置,但是私有始终是最安全的。

2.变量的作用域

方法内声明并赋值的变量,作用域只在这个方法内

	void test01() {
		int i = 10;
		System.out.println(i);
	}
    void test02() {
    	int i = 100;
		System.out.println(i);
    }

也就是说test01()方法,和test02()方法里面声明和赋值的 i 变量,并没有直接的关系,它们有各自的作用域,也就声明它们的方法内;
还有就是循环语句:for(int a = 0;…){}这里的变量 a 作用域仅限这个for后面的{…}中;
上面所说的变量 i 和变量 a ,都是作用在一个局部的变量,也称局部变量,这里要注意一个问题,局部变量没有默认值,声明的局部变量,必须进行赋值,必须!!!!

3.构造函数

构造函数?是不是不好理解?那我换个名字,构造方法,是个方法哦

    DogClass (int tempSize, int tempWeight, String tempBreed, String tempName) {//设置一个构造函数,初始化变量
		
		size = tempSize;
		weight = tempWeight;
		breed = tempBreed;
		name = tempName;
		
	}// end 构造函数	

这是一个特殊的方法,它是用来初始化类内实例变量的,其实每个类在被对象调用的时候,都会执行一个构造函数,只不过如果我们不写的话,它就执行默认的构造方法,完成实例变量的初值设置,但如果我们写了构造函数,那么在编译的时候,就不会再执行默认的构造函数了,转而优先执行我们写的构造函数;
构造函数的几个特征:

  1. 构造函数的名称与类的名称完全相同。
  2. 构造函数没有返回类型,包括void。
  3. 构造函数在创建对象时被自动调用。
  4. 构造函数在对象实例化时用来初始化对象的成员。
  5. 构造函数可以有参数,也可以没有参数。
  6. 构造函数可以重载,即可以有多个同名但参数列表不同的构造函数。
    有以上特征的方法,就是一个构造函数,这里有个需要例子说明的,我们来看下例句:
class TestA{
	
	TestA (int a,String b){
		
	}
	TestA(){
		
	}
}

大家可能发现了,这个类里面有两个构造函数,只不过一个有参数,一个没有参数,这是合法的,当然你还可以书写其他参数列表不同的同名构造函数,就要看你程序的需要了;
那我们创建对象的时候又有什么不同呢?

TestA a = new TestA();//调用的无参构造函数初始化对象
TestA a1 = new TestA(10,"参数");//调用有参构造函数初始化对象

一般来说,有参方法的参数输入到方法后面的()中,但是构造函数不同,因为它的作用是初始化对象,所以它的参数会出现在创建对象的时候,输入到类名后面的括号内,这就是构建函数与普通方法的不同之处之一;

上面这两个语句就是所谓的构造函数重载,大家知道怎么回事,知道如何书写就好,至于运用的话,只能在实战中不断深化的。

标签:JAVA,weight,DogClass,第八天,int,two,String,日志,构造函数
From: https://blog.csdn.net/mycqyjn/article/details/140191560

相关文章

  • JAVA零基础小白自学日志——第七天
    文章目录一、类1.类名2.这是啥东西?虽然在类里,但是不在构造方法里面,也不在语句块里,它是谁?它要干啥?3.方法二、对象(重头戏来喽)1.类与对象的关系2.类不是对象,对象由类构造3.类和对象到底在程序里是什么样的今日提要:类和对象(什么?你说你没对象!?去去去,别打岔,我这对象不是你......
  • Windows防火墙 日志 自定义 以记录被丢弃的数据包和成功的连接日志。以下是一个示例.r
     配置注册表,以记录被丢弃的数据包和成功的连接日志 WindowsRegistryEditorVersion5.00;WindowsDefender防火墙日志记录设置[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy];以下是针对不同配置文件的设置,例如......
  • 深入Java:JSON解析与操作的艺术
    哈喽,大家好,我是木头左!一、初识JSON:数据格式的优雅舞者在现代Web开发中,JSON(JavaScriptObjectNotation)以其轻量级和易于阅读的特点成为了数据交换的首选格式。它基于JavaScript的一个子集,采用完全独立于语言的文本格式,使得任何编程语言都能够轻松解析和生成。JSON的基本结构......
  • 3101.力扣每日一题7/6 Java(接近100%解法)
    博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞......
  • Java计算机毕业设计疫情防控形势下的高校食堂订餐管理系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着新冠疫情的全球蔓延,公共卫生安全成为了前所未有的重大挑战。高校作为人员密集且流动性大的场所,其食堂管理面临着巨大的疫情防控压力。传统的食堂......
  • Java计算机毕业设计食品安全监督平台的设计与实现(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着社会经济的快速发展和人民生活水平的不断提升,食品安全问题日益成为社会关注的焦点。近年来,食品安全事件频发,不仅严重损害了消费者的身体健康,也影......
  • 从零学习的JAVAday1~day7
    作为一个刚要迈入大二的预备程序员,已经学习过了c语言和c++的部分知识,在暑假期间满怀期待的开始Java的学习,希望一个暑假可以对Java的了解加深一些。学习Java首先要学习windows电脑的cmd命令:同时点击键盘上面的win+r键输入cmd即可进入默认的cmd面版,然后我们就可以输入一些命令:比......
  • MIT6.824-2022 分布式系统课程实验笔记 Lab 2B Raft-日志复制(Log Replication)--xunznu
    Part2B:LogReplication日志复制(困难)文章目录Part2B:LogReplication日志复制(困难)Lab1:MapReduceLab2:Raft实验解读Lab2A:领导者选举leaderelection我的代码实现(附带详细代码注释)提示:实现细节:1、commitIndex和lastApplied2、nextIndex和matchIndex3、Co......
  • 面试官:Java线程可以无限创建吗?
    哈喽,大家好......
  • 学生Java学习路程-1
    ok,到了一周一次的总结时刻,我大致会有下面几个方面的论述:1.这周学习了Java的那些东西2.这周遇到了什么苦难3.未来是否需要改进方法等几个方面阐述我的学习路程。这周我主要进行了java开发程序EclipseForJavaDeveloper跟jdk的安装,其中在安装jdk过程中,因为没有安装在C盘中,所以......