java零乱知识点

呵呵这里说下我每天突然想起或看到的一些java知识点:

1:==和equals的区别,==比较的是引用而equals比较的是内容:

package com.djk.jichu;

public class Test4 
{
	public static void main(String[] args)
	{
		String a = "a";
		String b = "a";
		System.out.println(a==b);
		System.out.println(a.equals(b));
	}
}


比较的结果是true和true,第一个比较的是引用,当String  a ="a"时会把字符串a放入常量池中,当String b = "a"的时候首先去常量池中找是否已经存在这个a字符串如果存在的话则直接把引用直接指向常量池中的字符串a,如果没有则在常量池中创建一个字符串a,在这个列子中在创建b的时候由于常量池中已经有了字符串a所以当比较a==b的时候他们当然相等(因为都指向常量池中的字符串a),第二个为true的原因主要是内容都为字符串a所以相等。

package com.djk.jichu;

public class Test4 
{
	public static void main(String[] args)
	{
		String a = "a";
		String b = new String("a");
		System.out.println(a==b);
		System.out.println(a.equals(b));
	}
}


这断代码的结果是false和true,第一个为false的原因是虽然创建b的时候常量池中已经存在字符串a,可是在创建b的时候我们显示的new了b对象,这样的话创建b的时候就不会再去常量池中找而是直接new出一个b对象。这样的话a和b所指向对象的地址当然不同,所以结果为false。第二个为true的原因是equals比较的是内容,引用a和b虽然指向的地址不同但是所指向的地址里放的内容是相等的所以结果为true。

package com.djk.jichu;

public class Test4 
{
	public static void main(String[] args)
	{
		String a = new String("a");
		String b = new String("a");
		System.out.println(a==b);
		System.out.println(a.equals(b));
	}
}


结果第一个是false第二个是true,第一个额外ifalse的原因是a和b所指向的地址不同。第二个true的原因是内容是相等的。

接下来再看一段代码:

package com.djk.jichu;

public class Test4 
{
	public static void main(String[] args)
	{
		Test5 test1 = new Test5("a");
		Test5 test2 = new Test5("a");
		System.out.println(test1.equals(test2));
	}
}

class Test5
{
	private String message;
	
	public Test5(String message)
	{	
		this.message = message;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
}


这不知道大家认为这段代码运行的结果是什么,答辩是false。或许有人会有疑问equals比较的是内容,而test1和test2的内容确实都是1是相同的为什么结果是false。原因在于java有个基类Object类,这个类中有equals方法,而则个equals方法默认比较的方式是和==比较的方式是一样的,比较的是引用指向的地址。所以当我们用自己的写的类来调用equals方法时虽然内容是相同的不过由于用的是基类的equals方法比较的是引用指向的地址所以结果是fasle。不过我们用String类的时候发现用equals比较的确实是内容原因是String类帮我们覆盖了基类的equals方法,所以我们比较的是内容。如果我们也想让Test5这个类调用equals方法时比较的是 内容那我们就要重写equals方法。

2:对数组的认识

数组也是对象,数组的定义有3种形式

(1)String [] a = new String[2];定义了一个数组容量是2,默认值是null

(2)String [] a = {"1","2"};定义了一个数组里面的内容是1和2

(3)String [] a = new String [] {"1","2"}定义了一个数组里面的内容是1和2

要打印数组的内容可以用Arrays.toString(a)这也是唯一的方法。

3:java传参的认识

package com.djk.jichu;

public class Test6
{
 public static void main(String[] args)
 {
  Test7 test = new Test7("1");
  System.out.println("before:"+test.getMessage());
  Test7 test2 =test;
  test2.setMessage("2");
  System.out.println("after:"+test.getMessage());
  
 }
}

class Test7
{
 public Test7(String message)
 {
  this.message = message;
 }
 
 private String message;
 
 public String getMessage() {
  return message;
 }

 public void setMessage(String message) {
  this.message = message;
 }
 
}


打印的结果是:before :1   after :2 原因是java传参传的是引用,  Test7 test2 =test;这个的意思是把test的引用传给了test2此时test2和test指向同一个内存中的对象,当test2改变这个内存中对象的值的时候对test当然也有影响。

		int i =10;
		System.out.println(i);
		int j = i;
		j = 20;
		System.out.println("i:"+i + "j:"+j);


这个的结果第一个打印的是10 第二个是i:10,j:20发现虽然把i的值给了j,改变了j的值可是对i没有产生任何影响i的值还是10原因是这时传的是值。不过我是这样记的,我还是认为基本数据类型的时候传的是引用,不过在int j = i的时候我认为编辑器会写成int j =new Integer(i);的形式就是j其实指向了另一个地址只不过这个地址的对象内容正好是i,这样改变j的值不会影响到i因为他们所指向的地址不同(呵呵 估计不对 不过我是这么记住的)。

4:关于构造器和重载的

我们如何确定java类的一个方法?答案是根据方法名和参数列表。

重载构成的条件是方法名相同但是参数不同。这里为什么不把返回值放进去,因为方法的调用者有的时候并不会去关心他的返回值所以要记住返回值不能用来作为判断重载的一个依据。

当我门在一个类中如果没有定义构造器则编译器会帮我们默认构造一个无参构造器,如果我们定义了一个构造器则编译机就不会再为我么定义一个构造器,所以有时会发生如下的错误:

package com.djk.jichu;

public class Test8
{
	public static void main(String[] args) 
	{
		MyTest myTest = new MyTest();
	}
}

class MyTest
{
	public MyTest(String i)
	{
		System.out.println(i);
	}
}

这个new MyTest();会报错,原因是我们定义的类MyTest有一个有参构造器则编译器就不会为我们创建一个无擦构造器,所以会报错,解决方案是我们自己显示的添加一个无参构造器或是在new MyTest();的时候加入一个参数new MyTest(1);

呵呵 今天就将这么多睡觉了 还有的下次看到了再将有不对的地方欢迎指出 谢谢。。。。。。

本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值