动易官方网站,中国建设银行征信中心网站,舞台灯光网站建设公司,手机排行榜2024Object 类
类 java.lang.Object是类层次结构的根类#xff0c;即所有类的父类。
除Object类之外的任何一个Java类#xff0c;全部直接或间接的继承于Object类。由此#xff0c;Object类也被称为根父类。Object类中声明的成员具有通用性#xff0c;并且Object类中没有声明…Object 类
类 java.lang.Object是类层次结构的根类即所有类的父类。
除Object类之外的任何一个Java类全部直接或间接的继承于Object类。由此Object类也被称为根父类。Object类中声明的成员具有通用性并且Object类中没有声明任何属性只提供了一个空参的构造器。正是由于Object类的根父类这一特性因此所有的类都可以重写Object类中的方法。
equals方法
定义
在Object类中equals()方法的源码如下 由源码可知equals()方法判断两个对象是否相等就是判断两个对象的引用地址是否相同或者说是判断两个变量是否指向了堆空间中的同一个对象实体。
对于自定义类来说如果没有重写equals()方法那么判断两个对象是否相等使用的就是Object类中的源码如果重写了equals()方法那么就是根据自己的自定义条件进行判断。
对于像String类、Date类和包装类等他们都重写了Object类中的equals()方法其方法内容就是用于比较两个对象实体的内容是否相同。
实际开发中重写equals()方法一般就是重写成判断两个对象的实体内容是否相等而非两个对象的引用地址是否相等。 和 equals()的区别
是一个运算符既可以判断基本数据类型也可以判断引用数据类型。判断基本数据类型时就是判断其对应的数值是否相等判断引用数据类型时就是判断其引用地址是否相同或者说是判断两个变量对应的是否是一个实体。
equals()是一个方法因此只能判断引用数据类型。判断引用数据类型时如果没有重写Object类中的equals()方法那么作用就和运算符的相同判断两个变量是否指向了堆内存中的同一个对象实体。如果重写了equals()方法那么具体的判断就是重写方法中的内容不过一般重写的equals()方法就是用来判断两个变量对应对象的内容实体是否相同。
toString()方法
定义
在Object类中toString()方法的源码如下 由源码可知toString()方法是用来返回该类的地址值不过由于Java是在JVM上运行因此返回的并不说电脑上的实际地址而是一个哈希值。
对于自定义类来说如果没有重写toString()方法那么输出的就是一个地址值。如果重写了toString()方法那么输出的内容就是重写代码的执行结果。
对于像String类、Date类以及包装类中都对toString()方法进行了重写。当调用toString()方法时这些类返回的就是当前对象的实体内容。
实际开发中一般自定义类重写toString()方法时也是书写返回当前类的具体内容的代码.并且关于toString()在调用对象名输出时其实源码中调用的是toString()方法。
static
如果想让类的一个成员除构造器外被类的所有实例所共享那么就使用关键字static来修饰这个成员。
类成员的设计思想
当我们编写一个类时其实就是在描述一个类的属性和行为而并没有产生实质上的对象只有使用new关键字时才能产生出对象这时系统才会分配内存给对象对象中的方法和属性才可以供外部调用。我们有时候希望无论是否产生了对象或者无论产生了多少个对象某些特定的数据在内存中有些仅有一份。
这里的类成员只需要使用static修饰即可所以也被称为静态成员。
static可以修饰的结构
属性、方法、代码块、内部类。
静态变量 VS 实例变量
1. 个数 静态变量一定有且仅有一个被类的多个对象所共性。 实例变量创建几个对象实例变量就有几个。
2. 内存位置 静态变量存放在方法区。 实例变量存放在堆空间中。
3. 加载实际 静态变量随着类的加载而加载。由于类只会加载一次因此静态变量也只会加载一次。 实例变量随着对象的创建而创建每个对象都拥有自己的一个实例变量。
4. 调用者 静态变量可以被类调用也可以被对象调用。 实例变量只能使用对象调用。
5. 消亡时机 静态变量随着类的卸载而消亡。 实例变量随着对象的消亡而消亡。
静态方法 / 类方法
1. 随着类的加载而加载。
2. 可以通过类名.静态方法名的方式进行调用。
3. 在静态方法内部不可以调用非静态的属性和方法。但是对于非静态方法来说内部是可以调用静态的属性和方法的同时也可以调用非静态的属性和方法。
4. 在静态方法内部并不可以使用super或者this关键字。
特别说明
对于静态方法的声明当方法内部全部是静态的成员时就可以将方法设为静态方法。在真实的开发场景中一般将工具类的方法设置为静态方法。
对于静态属性的声明如果属性的值是能被所有类所共享的那么就可以设置为静态属性。在真实的开发场景中一般将常量设置为静态的。
注意事项
Dog a null;
dog.hello();
System.out.prntln(a.count);// 由于hello()方法和count属性都是静态的
// 因此使用上述方法时并不会报错
// 相反还会正常输出结果
final
final理解
最终的
final可以用来修饰的结构
类、方法、变量成员变量和局部变量
具体说明
1. final用来修饰类表示类不能被继承。
2. final用来修饰方法表示方法不能被重写。
3. final修饰变量表示变量成了常量一旦赋值不可修改。 ①final修饰成员变量可以显式赋值、代码块赋值以及构造器赋值不能默认初始化赋值。 ②final修饰局部变量一旦赋值不可更改。对于方法内部声明的变量在调用局部变量前一定要进行赋值而且一旦赋值就不可更改。对于方法形参在调用方法时给形参进行赋值而且一旦赋值就不可更改。
final和static
final和static结合修饰属性时此变量称为全局常量。
抽象类(abstract)
抽象类使用abstract来修饰。
由来
随着继承层次中一个个新子类的定义子类变得越来越具体而父类变得越来越一般越通用。类的设计应该保证父类和子类共享特性。有时程序员将一个父类设计的非常抽象以至于它没有具体的实例这样的类叫作抽象类。
们声明一些几何图形类圆、矩形、三角形类等发现这些类都具有共同特征求面积求周长。那么这些共同特征应该抽取到一个共同父类几何图形类中。但是这些方法在父类中又无法给出具体的实现而是应该交给子类各自具体实现。那么父类在声明这些方法时就只有方法签名没有方法体我们把没有方法体的方法称为抽象方法。Java语法规定包含抽象方法的类必须是抽象类。
abstract可以用来修饰的结构
类外部类和内部类、方法
具体说明
abstract修饰方法时表示此方法为抽象方法。在抽象方法中只有方法的声明没有方法体。但是我们通过方法的声明就可以确定方法的功能只不过具体实现功能的代码在子类中进行设计。当子类继承抽象类之后必须重写其中的抽象方法否则还是一个抽象类。
abstract修饰抽象类时表示此类为抽象类。抽象类不能被实例化但是抽象类中仍然存在构造器当子类实例化对象时需要直接或间接的调用到抽象类的构造器。在抽象类中可以没有抽象方法但是抽象方法一定是在抽象类中。
abstract不能共同的关键字
1. 不能修饰private修饰的方法毕竟private修饰的方法不能在除自己以外的其他类中使用。
2. 不能修饰静态方法。
3. 不能修饰使用final修饰的方法和类毕竟final修饰的类和方法分别不能继承和重写。
接口(interface)
接口使用interface来表示。
接口的理解
接口的本质是契约、标准以及规范就像我们的法律一样指定好以后大家都要遵守。
在我看来接口其实就是多态的最好体现使用接口可以在不增加冗余代码的情况下扩展代码的适用范围。
接口内部结构的说明
接口内可以声明属性但是属性必须使用public static final修饰表明了属性是全局常量。
接口内可以声明方法声明抽象方法时使用public abstract表示也可以声明静态方法只不过静态方法只能通过接口调用不能用实现类来代替也可以声明默认方法即default修饰的方法。
接口内不能声明构造器、代码块等内容。
接口与类
1. 类是单继承使用class关键字定义使用extends关键字来继承。一个类只能继承一个父类。
2. 接口是多实现使用interface关键字定义使用implements来实现。一个类可以实现多个接口。
3. 类实现接口之后必须将其中所有的接口都重写否则类就要声明为抽象类。
抽象类与接口
1. 两者都可以声明抽象方法都不能被实例化。
2. 抽象类有构造器接口没有构造器。
接口与接口
接口与接口之间是继承关系并且可以多继承。 在上篇介绍完面向对象的特点之后又对特点的衍生知识进行了一些介绍。在抽象类和接口中都可以很好的体现多态的特点。随着文章的不断输出JavaSE也快到了尾章后续大概还会有枚举和注解、泛型、反射以及IO四篇文章。