面试2#java基础杂七杂八篇

面向对象特征

  • 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。

  • 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。

  • 多态:多态顾名思义“一种形式多种状态”说了等于白说。其实啥叫多态呢?或许可以这样说:子类对象持有父类或者接口类型的引用,在方法调用期间动态的改变。 表现为变量编译时是一种类型,运行时是一种类型。

父类的静态方法能否被子类重写

不能:

静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成,不需要继承机制就可以调用。

如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"(即使父类的静态成员和方法不是private的,子类中也有一样的静态方法,父类对象引用也调用不了,发生不了多态。所以父类的静态方法对子类来说不是重写的这叫做隐藏)。

如果想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是跟实例方法和属性不太一样,存在"隐藏"的这种情况。

重写指的是根据运行时对象的类型来决定调用哪个方法,而不是根据编译时的类型。

父类的静态方法能否被子类重写

方法重载和方法重写的区别?

重载

方法重载的定义:同一个类或与他的派生类中,方法名相同,而参数列表不同的方法。其中参数列表不同指的是参数的类型,数量,类型的顺序这三种至少有一种不同。

方法重载注意:

  • 与返回值类型无关;
  • 与访问修饰符无关。
  • 构造方法也可以重载。
重写

方法的重写的定义:在继承关系的子类中,定义一个与父类相同的方法

方法重写的特点:

  • 在继承关系的子类中重写父类的方法
  • 重写的方法必须方法名相同,参数列表也相同
  • 重写的方法的返回值类型应该与父类中被重写方法的返回值类型相同或是他的子类类型
  • 重写的方法的访问权限应该与父类中被重写方法的访问权限相同或高于它的访问权限
  • 重写的方法不能抛出比父类更加宽泛的异常

方法重写的注意事项:

  • 构造方法不能被重写,不要问为什么?因为构造方法名必须和类名相同
  • private修饰的成员方法不能被重写
  • static修饰的方法不能被重写
  • final修饰的方法不能被重写
  • 当子类重写了父类中的方法后,子类对象调用该方法时调用的是子类重写后的方法

java中==、equals 、hashCode

==和equals 区别?

==是运算符,用于比较两个变量是否相等。比较基本数据类型时比的是基本数据类型的值,比较引用类型时比较的是引用的内存地址。

equals,是Objec类的方法,用于比较两个对象是否相等,默认情况下Object类的equals方法是比较两个对象的地址,跟==的结果一样。可以通过方法的重写来实现多态。如String的equals就是比较的字符串值是否相等。(integer、Date也都进行了自己的重写)

为啥一般重写equals 要重写hashCode?

hashCode是Object类的一个方法。返回一个离散的int型整数。不过我们重写equals 方法时一般会遵循hashCode通俗约定重写hashCode方法:

  • 在java程序执行过程中,在一个对象没有被改变的前提下,无论这个对象被调用多少次,hashCode方法都会返回相同的整数值。对象的哈希码没有必要在不同的程序中保持相同的值。
  • 如果2个对象使用equals方法进行比较并且相同的话,那么这2个对象的hashCode方法的值也必须相等。
  • 如果根据equals方法,得到两个对象不相等,那么这2个对象的hashCode值不需要必须不相同。但是,不相等的对象的hashCode值不同的话可以提高哈希表的性能。

Java Object.hashCode()源码分析

Java中==和equals的区别,equals和hashCode的区别

基本数据类型所占字节数

  • byte 1

  • short 2

  • char 2

  • int 4

  • float 4

  • long 8

  • double 8

Java中boolean类型占用多少个字节?

首先在Java中定义的八种基本数据类型中,除了其它七种类型都有明确的内存占用字节数外,就boolean类型没有给出具体的占用字节数,因为对虚拟机来说根本就不存在 boolean 这个类型,boolean类型在编译后会使用其他数据类型来表示,那boolean类型究竟占用多少个字节?答案不一:

我的答案是1个字节,理由是虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补。

Java中boolean类型占用多少个字节

String、StringBuffer、StringBuilder区别?

String

从源码来看String是final类,底层final char数组实现。不可变字符串序列。String内部并未提供add,delete、update等操作字符串的api。但是java提供了 双引号“” 包括的内容代表String常量。

在Java中字符串常量一旦声明则不可改变,而字符串对象可以改变,但是改变的是其内存地址的指向。这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。

StringBuild&StringBuffer

相同点

当一个StringBuild&StringBuffer 被创建以后,通过其提供的append()、insert()、reverse()、setCharAt()等方法可以改变这个字符串对象的字符序列。一旦通过SB生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。

不同点

StringBuffer :可变字符串序列,当对字符串修改时使用,线程安全,由于加了锁,导致效率低。

StringBuild:可变字符串序列,效率高,不能保证线程安全

StringBuffer 和StringBuild的区别就是StringBuffer 的一些核心方法上加了锁。如果要操作少量的数据用 String;多线程操作字符串缓冲区下操作大量数据 StringBuffer;单线程操作字符串缓冲区下操作大量数据 StringBuilder。

猜你喜欢

转载自blog.csdn.net/qq_38350635/article/details/124430765
今日推荐