/* -----------------------------------主函数--------------------------------------- 主函数:是一个特殊的函数,作为程序的入口,可以被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()方法。 */
Lesson_for_java_day10--访问权限、static、对象转型、equals方法、toString方法、主函数
最新推荐文章于 2022-03-15 16:45:21 发布