zoukankan      html  css  js  c++  java
  • Java面试之基础题---对象Object

    参数传递:Java支持两种数据类型:基本数据类型和引用数据类型。

      原始数据类型是一个简单的数据结构,它只有一个与之相关的值。引用数据类型是一个复杂的数据结构,它表示一个对象。原始数据类型的变量将该值直接存储在其存储器地址处。使用对象和引用变量时会有所不同。。Java中的所有参数都通过值传递。

      当参数是原始是原始数据类型时,实际参数的值将复制到参数。在方法主体中对参数值进行的任何更改只会更改形式参数的副本,而不会更改实际参数的值。当参数通过参考值传递时,存储在实际参数中的参考被复制到形式参数。实际参数和形式参数都指向内存中的相同对象。形式参数可以通过直接更改实例变量的值或通过调用对象上的方法来修改对象。通过形式参数对对象进行任何修改都可以通过实际参数立即可见,因为它们对保存对内存中同一对象的引用。形式参数本身可以被修改以引用方法内的另一个对象。要禁用将引用类型形式参数更改为引用不同对象的方法,在引用类型形式参数声明中使用关键字final。

      可变长度参数:(varargs:variable-length arguments),声明一个接受可变数量的参数的方法或构造函数。声明可变长度参数,在方法参数的数据类型之后添加一个省略号...,省略号...之前和之后添加空格时可选的。可变长度参数方法可以有多个参数,但最多可以有一个可变长度参数。可变长度参数方法的可变长度参数必须是参数列表的最后一个,可以使用for循环来处理可变长度参数的参数列表。length属性给出了可变长度参数传递的值的数量。

      重载可变长度参数方法

      方法重载规则适应于可变长度参数方法。可以使用可变长度参数重载一个方法,只要方法的参数在连续顺序或数字上不同。

      Java的关键字this。它是对类的当前实例的引用。它只能在实例的上下文使用。当实例变量或类变量被具有相同名称的另一个变量覆盖时,需要使用关键字this限定一个实例变量,并使用类名称定义一个类变量。可以使用关键字this来限定实例方法名。

      final关键字不允许修改或替换其原始值或定义。可以在以下三个上下文中使用:变量声明,类声明,方法声明。变量被声明为final,它只能被赋值一次。final变量的值在设置后不能修改。变量声明包括局部变量的声明,方法/构造函数的形式参数,实例变量和类变量。final变量的值只设置一次,它不能被重新赋值。有两种方法来初始化final变量的值:(1)在声明时给予初始化。(2)将其初始化延迟到稍后的时间。必须在第一次读取final变量之前初始化它。

      final类,它不能被扩展或继承。

      final方法,不能在包含该方法的类的子类中重新定义(覆盖或隐藏)

    构造函数是用于在对象创建后立即初始化对象的代码块。构造函数的结构看起来类似于一个方法。构造函数名称与类的名称相同。构造函数名称后面是一对括号,可能包括参数。可选的,右括号后面可以是关键字throws,其后面是逗号分隔异常列表。

      重载构造函数:一个类可以有多个构造函数。也叫重载构造函数。如果一个类有多个构造函数,它们的顺序和参数类型都必须与其它构造函数不同。每个对象创建表达式调用一次构造函数。可以在对象创建的过程中只执行一个构造函数的代码一次。

      从另一个构造函数调用构造函数:构造函数可以调用同一类中的另一个构造函数。必须使用关键字this从另一个构造函数调用另外一个构造函数。如果构造函数调用另一个构造函数,它必须是构造函数体中的第一个可执行语句。构造函数不能调用自身,因为它将导致递归调用。

      从构造函数返回:构造函数在其声明中不能返回类型。但可以在构造函数体中使用没有返回表达式的return语句。当一个构造函数中的返回语句被执行时,控制返回给调用者,忽略构造函数的其余代码。

      静态初始化块:静态初始化器。当类定义被加载到JVM中时,只对一个类执行一次静态初始化器,需要在其声明的开头使用static关键字。在一个类中可以有多个静态初始化器。所有静态初始化器都按文本出现的顺序执行,并在任何实例初始化器之前执行。

      Java  Object 类:在java.lang 包中。所有的Java类都直接或间接扩展Object类。所有的Java类都是Object类的子类,Object类是所有类的超类。Object类本身没有超类。Object类的引用变量可以保存任何类的对象的引用。Object类有九个方法。可以在Java中的所有类中使用。toString、equals、hashCode、clone、finalize没有实现,需要子类自定义。在对象销毁前被垃圾收集器调用。notify、notifyAll、wait、getClass()在Object类中实现,不能自定义它。它返回对对象的Class对象的引用。 

      对象的哈希代码:哈希码(也叫散列码)是一个整数值。计算整数的算法称为散列函数。Java使用散列码从基于散列的集合中有效地检索数据。Object类有一个返回int的hashCode方法,它是对象的哈希码。该方法的默认实现通过将对象的内存地址转换为整数来计算对象的哈希码。如果两个对象使用equals()方法相等,则它们必须具有相同的哈希码。如果对同一个对象多次调用hashCode()方法,则该方法必须返回相同的整数值。如果一个类覆盖这两个方法中的任何一个,它必须基于散列集合覆盖该类的对象以保证能正确工作。Java 7 引入了一个实用程序类java.lang.Objects 。它包含一个hash()方法,用于计算任意数量值的哈希码。

      equals()方法的特性:1.自反性。x.equals(x)应该返回true

      2、对称性。如果x.equals(y)返回true,那么y.equals(x)

      3、传递性,如果x.equals(y)为true,且y.equals(z),那么x.equals(z)

      4、一致性,如果x.equals(y)返回true,它应该返回true,知道x或y的状态改变

    类的toString()方法非常重要。当需要对象的字符串表示时,Java会自动调用toString()方法。当连接一个字符串和一个对象时,实例调用的就是toString()方法。

      Java对象克隆:Java不提供克隆(复制)对象的自动机制。克隆对象意味着逐位复制对象的内容。要支持克隆操作,请在类中实现clone()方法。clone()方法声明为protected。因此,不能从客户端代码调用它。需要在类中声明clone()方法为public来克隆类的对象。它的返回类型是Object。这就需要使用clone()方法转换返回值。

      Java提供了一种在对象即将被销毁时执行资源释放的方法。在Java中创建对象,但是不能销毁对象。JVM运行一个称为垃圾收集器的低优先级特殊任务来销毁不再引用的所有对象。垃圾回收器给我们一个机会,在对象被销毁前执行清理代码。Object类有一个finalize()方法就是用于在对象被销毁之前执行清理代码,这个方法声明为protected,Object类中的finalize()方法不会做任何事情。所以需要覆盖类中的finalize()方法。

      Java不可变对象:在创建状态后无法改变状态的对象称为不可变对象。一个对象不可变的类称为不可变类。不变的对象可以由程序的不同区域共享而不用担心其状态改变。不可变对象本质上是线程安全的。关键字final声明属性,那么属性不可变,对象也就是不可变的。

  • 相关阅读:
    插槽分发内容
    Java学习-sgg-day07-20200422-复习
    Java学习-sgg-day06-20200421-今天晚上在下载资料
    Java学习-sgg-day05-20200420
    Java学习之面向对象之总结-sgg-day04-20200419
    Java学习之Eclipse的使用-sgg-day04-20200419
    Java学习之面向对象-sgg-day04-20200419
    Java学习之面向对象-sgg-day03-20200418
    Java学习总结-前三天
    Java学习之-sgg-day03-20200418
  • 原文地址:https://www.cnblogs.com/sdlzspl/p/7878227.html
Copyright © 2011-2022 走看看