天天看点

Lesson_for_java_day10--访问权限、static、对象转型、equals方法、toString方法、主函数

/*
-----------------------------------主函数---------------------------------------
	
主函数:是一个特殊的函数,作为程序的入口,可以被java虚拟机(JVM)调用。
主函数的定义:
	public:函数的访问权限是最大的。
	static:代表着主函数随着类的加载就已经存在。
	void:主函数没有具体返回值。
	main:不是关键字,但是是一个特殊的单词,能被JVM所识别。
	String[] args:函数参数。参数是一个数组,该数组中的元素是字符串,即字符串类型的数组。
	JVM在调用主函数时传入的是new String[0];
	
--------------------------------包和访问权限----------------------------------

1、将类放置到一个包中,需要使用package"包名"。
2、编译时需要使用-d参数,该参数的作用是依据包名生成相应的文件夹。
3、一个类的全名应该是"包名" + "." + "类名"。
4、包名的命名规范:
	1、要求包名所有的字母都是小写。
	2、包名一般情况下是你的域名倒过来写。
	
java当中的访问权限:public > protected > default > private
	1、public:公共权限:可以修饰类、成员变量和成员函数。没有任何访问权限,同一包中或者不同包中的类可以自由访问
	2、private:私有权限:可以修饰成员变量和成员函数。只能在本类中使用。私有权限是封装的一种表现形式。
	3、default:包级别访问权限(默认权限):可以修饰类、成员变量和成员函数。在同一个包中可以自由访问。
	4、protected:受保护权限:protected权限首先拥有和default权限一样的功能,其次又可以访问父类中有足够访问权限的成员。该权限只能修饰成员变量和成员函数。如果子类和父类不在同一个包中,子类可以继承到父类当中的default权限的成员变量和成员函数,但是由于权限不够,无法使用。
	

----------------------------------static关键字的作用---------------------------------------
	
作用:
	1、定义静态成员变量:静态成员变量可以用类名直接调用。当对象中出现共享数据时,该数据就被静态所修饰,存在于方法区,对象中的特有数据就定义成非静态,存在于堆内存中。
	2、定义静态成员方法:静态成员方法中不能包含非静态成员变量。功能内部没有访问到非静态成员数据(对象特有数据)那么该功能就可以定义成静态的。
	3、定义静态代码块:静态代码块是在类装载的时候运行的。
	
	
注意:静态成员变量在内存中只有一份,在静态函数中不能使用this,静态代码块主要作用是为静态成员变量赋值。

静态在内存中,不存在于堆内存中,而是存在于方法区(或叫共享区或数据区),可以单独存取。

static的特点:
	1、随着类的加载而加载,随着类的消失而消失。
	2、优先于对象存在。(静态先存在,对象后存在)
	3、被所有对象所共享。
	4、可以直接被类名所调用。
	
实例变量和类变量的区别?
	1、存放位置:类变量随着类的加载而存在于方法区中。实例变量随着对象的建立而存在于堆内存中。
	2、生命周期:类变量生命周期最长,随着类的消失而消失。实例变量生命周期随着对象的消失而消失。
				 
(重点)静态的使用注意事项:
	1、静态方法只能访问静态成员(变量和方法)。非静态方法既能访问静态成员,又可以访问非静态成员(变量和方法)。
	2、静态方法中不可以有this、super关键字,因为静态优先于对象存在,所以不可以有this、super。
	3、主函数是静态的。
	
使用静态的利弊:
	利:对对象的共性数据进行单独空间存储,节省空间,没有必要每一个对象中都存储一份,而可以被类名直接调用。
	弊:生命周期过长,访问出现局限性(静态虽好,只能访问静态成员)。
	
	

-----------------------------------对象的转型------------------------------------------
	
什么是向上转型:
	将子类的对象赋值给父类的引用。
		eg:Person p = new Student();
		
什么是向下转型:
	将父类的引用赋值给子类的引用。向下转型的前提是先进行向上转型。
		eg:Person p = new Student();
			Student s2 = (Student)p;
			
多态的规则:
	1、多态自始至终都是子类对象在做着变化。
	2、一个引用能够调用哪些成员(变量和函数),取决于这个引用的类型。
	3、一个引用调用的是哪一个方法,取决于这个引用所指向的对象。
	4、非静态成员函数在多态调用时,编译时看左边,运行时看右边。
	5、在多态中,成员变量,无论编译还是运行,都是参考左边。(引用型变量所属的类)
	6、在多态中,静态成员函数,无论编译还是运行,都参考左边。
	
类类型的判断:
	类名 instanceOf 类名     返回值为boolean。
	

	
-------------------------------equals方法和"=="--------------------------------------------

简单说,"=="一般用于基本数据类型的比较,而equals一般用于引用数据类型的比较。

在Java规范中,它对equals()方法的使用必须要遵循如下几个规则:
	equals 方法在非空对象引用上实现相等关系:
		1、自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
		2、对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true
		3、传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
		4、一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
		5、 对于任何非空引用值 x,x.equals(null) 都应返回 false。对于上面几个规则,我们在使用的过程中最好遵守,否则会出现意想不到的错误。

在java中进行比较,我们需要根据比较的类型来选择合适的比较方式:
	1) 对象域,使用equals方法 。 
	2) 类型安全的枚举,使用equals或== 。 
	3) 可能为null的对象域 : 使用 == 和 equals 。 
	4) 数组域 : 使用 Arrays.equals 。 
	5) 除float和double外的原始数据类型 : 使用 == 。 
	6) float类型: 使用Float.foatToIntBits转换成int类型,然后使用==。  
	7) double类型: 使用Double.doubleToLongBit转换成long类型,然后使用==。
	至于6)、7)为什么需要进行转换,我们可以参考他们相应封装类的equals()方法,
	
重写equals方法的要点: 
	1. 使用==操作符检查“实参是否为指向对象的一个引用”。 
	2. 使用instanceof操作符检查“实参是否为正确的类型”。 
	3. 把实参转换到正确的类型。 
	4. 对于该类中每一个“关键”域,检查实参中的域与当前对象中对应的域值是否匹配。
		(1)、对于既不是float也不是double类型的基本类型的域,可以使用==操作符进行比较;
		(2)、对于对象引用类型的域,可以递归地调用所引用的对象的equals方法; 
	  	(3)、对于float类型的域,先使用Float.floatToIntBits转换成int类型的值,然后使用==操作符比较int类型的值;
		(4)、对于double类型的域,先使用Double.doubleToLongBits转换成long类型的值,然后使用==操作符比较long类型的值。 
	5. 当你编写完成了equals方法之后,应该问自己三个问题:它是否是对称的、传递的、一致的?(其他两个特性通常会自行满足)如果答案是否定的,那么请找到这些特性未能满足的原因,再修改equals方法的代码。
		

--------------------------------toString方法------------------------------------------	
		toString()方法在Object类中定义,其返回值是String类型,描述当前对象的有关信息在进行String与其它
	类型数据的连接操作时,自动调用toString()方法可以根据需要在用户自定义类型中重写toString()方法
	基本类型数据转换为String类型时,调用了对应封装类的toString()方法。
	
*/