2021-08-07

Java基础44道

1.解释一下什么是面向对象,面向对象和面向过程的区别?

面向对象是一种基于面向过程的编程思想,是向现实世界模型的自然延伸,这是一种“万物皆对象”的编程思想。由执行者变为指挥者,在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动。
两种编程思想的区别在于:
(1)编程思路不同:面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、执行方法来完成功能。
(2)封装性:都具有封装性,但是面向过程是封装功能,而面向对象封装的是数据和功能。
(3)面向对象具有继承性和多态性,而面向过程无继承性和多态性,所以面向对象它更具有易维护、易拓展、易复用的特点。

2.面向对象的三大特性?分别解释一下?

面向对象的三大特性分别是封装性、继承性和多态性。
封装性:通常认为封装是把数据和操作数据的方法封装起来,对数据的访问只能通过已经定义的接口。
继承性:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类),得到继承信息的类被称为子类(派生类)。
多态性:分为编译时多态(方法重载)和运行时多态(方法重写)。要实现多态有两点需要:一是子类继承父类并且重写父类的方法,二是用父类型引用子类型对象。这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为。
**补充:**1)子类拥有父类对象所有的属性和方法(包括私有属性和方法),但是父类中的私有属性和方法子类是无法访问的,只是拥有。因为在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类所独有的属性,两者合起来形成一个子类的对象;
2)子类可以拥有自己的属性和方法;
3)子类可以用自己的方式实现父类的方法。即重写。

3.JDK、JRE、JVM三者之间的关系?

JDK(Java Development Kit):是java开发工具包,是整个java的核心,包括了java运行环境JRE、java工具和java基础类库。
JRE(Java Runtime Environment):是java的运行环境,包含JVM标准实现及java核心类库。
JVM(Java Virtual Machine):是java虚拟机,是整个java实现跨平台的最核心部分,能够运行以java语言编写的软件程序。所有的java程序会首先被javac编译器编译成.class的类文件,这种类文件能够在java虚拟机上运行。

4.重载和重写的区别?

重载:编译时多态,同一个类中同名方法具有不同的参数列表,其中参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。不能根据返回类型进行区分(因为:函数调用是不能指定类型信息,编译器不知道你调哪个函数)
重写:运行时多态,子类和父类之间,子类重写父类的方法具有相同的返回类型、更好的访问权限。

  1. 返回值类型、⽅法名、参数列表必须相同,抛出的异常范围⼩于等于⽗类,访问修饰符范围
    ⼤于等于⽗类。
  2. 如果⽗类⽅法访问修饰符为 private/final/static 则⼦类就不能重写该⽅法,但是被 static 修饰
    的⽅法能够被再次声明。
  3. 构造⽅法⽆法被重写

5.Java中是否可以重写一个private或者static方法?

java中static方法不能够被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念是上不适用。
java中也不可以覆盖private的方法,因为private修饰的变量和方法只能够在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或者方法的,所以当然也不能够被重写。
**补充:**静态方法可以被继承,但是不能被重写。如果父类和子类中存在同样名称和参数的静态方法,那么该子类的方法会把原来继承过来的父类方法隐藏,而不是重写。简单来说就是,父类的方法和子类的方法是两个没有关系的方法,具体调用哪一个方法是看哪个对象的引用;这种父子类方法也不存在多态的性质。

6.构造方法有哪些特性?

(1)构造方法名与类名相同;
(2)没有返回值,但是也不能够用void声明构造函数;
(3)成类的对象时自动执行,无需调用。

7.在java中定义一个不做事且没有参数的构造方法有什么作用?

java程序在执行子类的构造方法之前,如果没有用super()方法来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。
因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()方法来调用父类中特定的构造方法,则编译时会发生错误,因为java程序在父类中找不到没有参数的构造方法可供执行。解决的办法是:在父类中定义一个不做事且没有参数的构造方法。

8.java中创建对象的几种方式?

1.使用new关键字;
2.使用Class类的newInstance方法,该方法调用无参构造器创建对象(反射):Class.forName.newInstance();
3.使用clone()方法;
4.反序列化,比如调用ObjectInputStream类的readObject()方法。

9.抽象类和接口有什么区别?

1)抽象类中可以定义构造函数,接口不能定义构造函数;
2)抽象类中可以有抽象方法和具体方法,而接口中只能有抽象方法(public abstract);
3)抽象类中的成员权限可以是public、默认、protected(抽象类中抽象方法就是为了重写,所以不能被private修饰),而接口中的成员只可以是public(方法默认:public abstract、成员变量默认:public static final);
4)抽象类中可以包含静态方法,而接口中不可以包含静态方法;
5)一个类可以实现多个接口,但是只能继承一个抽象类。
6)从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。

  1. 在 jdk 7 或更早版本中,接⼝⾥⾯只能有常量变量和抽象⽅法。这些接⼝⽅法必须由选择实
    现接⼝的类实现。
  2. jdk 8 的时候接⼝可以有默认⽅法和静态⽅法功能。
  3. Jdk 9 在接⼝中引⼊了私有⽅法和私有静态⽅法。

10.静态变量和实例变量的区别?

静态变量:是被static修饰的变量,也称为类变量,它属于类,因此不管创建了多少个对象,静态变量在内存中有且仅有一个拷贝;静态变量可以实现让多个对象共享内存。
实例变量:属于某一实例,需要先创建对象,然后通过对象才能访问到它。

11.Integer和int区别?

(1)int是java的八种基本数据类型之一,而Integer是java为int类型提供的封装类;
(2)int型变量的默认值为0,Integer变量的默认值为null;这一点说明Integer可以区分出未赋值和值为0的区别;
(3)Integer变量必须实例化忠厚才可以使用,而int不需要。
比较延伸:
1.由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的,因为其内存地址是不同的;
2.Integer变量和int变量比较时,只要两个变量的值是相等的,则结果是true。因为包装类Integer和基本数据类型int类型进行比较时,java会自动拆包类为int,然后进行比较,实际上就是两个int型变量进行比较;
3.非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同;
4.对于两个非new生成的Integer对象进行比较时,如果两个变量的值在区间[-128,127]之间,则比较的结果为true,否则为false。java在编译Integer i=100时,会编译成Integer i=Integer。java对于[-128,127]之间的数会进行缓存,比如:Integer i=127,会将127缓存,下次再写Integer j=127时,就会直接从缓存中取出,而对于这个区间之外的数就要进行new了。

12.装箱和拆箱的区别?

自动装箱是java编译器在基本数据类型和对应的包装类之间做的一个转化。比如:把int转化成Integer。反之就是进行拆箱操作。
装箱:将基本类型⽤它们对应的引⽤类型包装起来;
拆箱:将包装类型转换为基本数据类型。

13.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量。而整数表达式可以是int基本数据类型或者Integer包装类型。由于byte、short、char都可以隐式转换为int,所以,这些类型以及这些类型的包装类型也都是可以的。而long和String类型都不符合switch的语法规定,并且不能作用于switch语句中。不过,需要注意的是在JDK1.7版本之后,switch就可以作用在String上了。

14.final、finally、finallize的区别?

final:用于声明属性、方法和类,分别表示属性不可变,方法不可被重写,被修饰的类不可被继承;
finally:异常处理语句结构的一部分,表示最后总是执行;
finallize:Object类的一个方法,在垃圾回收时会被调用被回收对象的finalize

15.==和equals的区别?

= = :它的作用是判断两个对象的地址是不是相等。即:判断两个对象是不是同一个对象(基本数据类型= =比的是值,引用数据类型= = 比的是内存地址)。
equals():它的作用也是判断两个对象是否相等。但是它一般有两种情况:
1)类没有覆盖equals()方法,则通过equals()比较该类的两个对象时,等价于用过“= =”比较这两个对象。
2)类覆盖了equals()方法。一般,我们用覆盖equals()方法来比较两个对象的内容是否相等;若它们的内容相等,则返回true(即,认为这两个对象相等)
说明:
String 中的 equals ⽅法是被重写过的,因为 object 的 equals ⽅法是⽐᫾的对象的内存地
址,⽽ String 的 equals ⽅法⽐᫾的是对象的值。
当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相
同的对象,如果有就把它赋给当前引⽤。如果没有就在常量池中重新创建⼀个 String 对象。

16.两个对象的hashcode()相同,则equals()也一定为true吗?

hashcode()的作用是获取哈希码,它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashcode()定义在JDK的Object类中,这就意味着java中的任何类都包含有hashcode()函数。
因为 hashCode() 所使⽤的杂凑算法也许刚好会让多个对象传回相同的杂凑值。越糟糕的杂凑算
法越容易碰撞,但这也与数据值域分布的特性有关(所谓碰撞也就是指的是不同的对象得到相同
的 hashCode 。
我们刚刚也提到了 HashSet ,如果 HashSet 在对⽐的时候,同样的 hashcode 有多个对象,它会
使⽤ equals() 来判断是否真的相同。也就是说 hashcode 只是⽤来缩⼩查找成本。

17.为什么要重写equals()方法就一定要重写hashcode()方法呢?

如果两个对象相等,则 hashcode ⼀定也是相同的。两个对象相等,对两个对象分别调⽤ equals
⽅法都返回 true。但是,两个对象有相同的 hashcode 值,它们也不⼀定是相等的 。因此,
equals ⽅法被覆盖过,则 hashCode ⽅法也必须被覆盖。

18.& 和 & &的区别?

java中&&和&都是表示与的逻辑运算符,都表示逻辑运输符and,当两边的表达式都为true的时候,整个运算结果才为true,否则为false。
&&:有短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式
&:不管第一个表达式结果是否为true,第二个都会执行。除此之外,&还可以用作位运算符:当&两边的表达式不是Boolean类型的时候,&表示按位操作。

19.java中的参数传递时传值呢?还是传引用?

java的参数是以值传递的形式传入方法中,而不是引用传递。
当传递方法参数类型是基本数据类型时,一个方法是不可能修改一个基本数据类型的参数。
当传递方法参数类型是引用数据类型时,一个方法将修改一个引用数据类型的参数所指向对象的值。即使java函数在传递引用数据类型时,也只是拷贝了引用的值罢了,之所以能修改引用数据是因为它们指向了一个对象,但这仍然是按值调用而不是引用调用。

20.深拷贝和浅拷贝的区别?

  1. 浅拷⻉:对基本数据类型进⾏值传递,对引⽤数据类型进⾏引⽤传递般的拷⻉,此为浅拷
    ⻉。
  2. 深拷⻉:对基本数据类型进⾏值传递,对引⽤数据类型,创建⼀个新的对象,并复制其内
    容,此为深拷⻉。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值