java面试(二)

面向对象考核点

1、说—下你对类与对象的理解

类是一个模板,是对一类事物的抽象描述;对象用于表示现实中该事物的个体。
类是对象的抽象,而对象是类的具体化,是类的实例。

2、Java创建对象有几种方式?
有4种
1.new一个对象

Object object = new Object();

2.使用反射创建一个对象

Object object = Class.forName("java.lang.Object").newInstance();

3.克隆一个对象

Object object = this.clone();

4.反序列化一个对象

ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("文件名"));
Object object = objectInputStream.readObject();

3、static关键字作用?

static表示静态的
修饰成员变量:在类加载的时候初始化,是所有该类的实例共享的,不属于任何一个对象,
			自身类中直接使用变量名访问,类外使用 类名.变量名
修饰方法:表明该方法是静态的,不依赖于任何对象就可以被调用,不可以访问成员变量
			自身类中直接使用方法名调用,类外使用类名.方法名调用
修饰代码块:静态代码块,在加载类时调用,可用于初始化变量。

4、静态方法能能否访问非静态成员,为什么?

不能,静态方法在类加载时就存在了,不属于任何对象,非静态成员需要创建对象才能够访问。

5、访问控制符区别(封装)?

public 			在所有类和包中都可以访问
protected		在本类、本包和不同包的子类中可以使用
default(默认)	在本类,本包中可以使用 
private			只能在本类中使用

6、面向对象三大特点?

封装:把客观事物的数据和方法封装成抽象的类,并且给成员添加访问权限,一些成员可以被外界访问,
	一些不可以。
继承:子类可以使用父类的属性和方法,提高的程序的复用性,子类可以扩展已存在的代码。
多态:对于同一个行为,不同的子类对象具有不同的表现形式,减少类之间的耦合,提升程序的可扩展性。

7、什么是多态?多态实现需要满足的三个条件

对于同一个行为,不同的子类对象具有不同的表现形式就是多态。
三个条件:继承、重写(子类继承父类后对父类进行重新定义)、父类引用指向子类对象

8、this关键字与super关键字区别

this表示当前对象,super表示当前类的父类对象
属性的区别:
 (1)this访问本类中的属性,如果本类没有这个属性则访问父类中的属性。
 (2)super访问父类中的属性,值还是该对象属性的值
方法的区别:
 (1)this访问本类中的方法,如果本类没有这个方法则访问父类中的方法。
 (2)super访问父类中的方法。 
构造的区别:
 (1)this调用本类构造构造,必须放在构造方法的首行。
 (2)super调用父类构造,必须放在子类构造方法首行。 
 (3)在类的构造方法中,一定要有this或者super调用构造方法放在首行(默认为super()),无参构造器中默认也是super()

9、重写与重载的区别?

重载是在一个类中多个方法的方法名相同,参数个数、类型、顺序不同的现象
重写是子类对父类非private方法的修改操作
1、范围不同:重载是在一个类中,重写是子类与父类之间的
2、多态不同:重载是编译时的多态性,重写是运行时的多态性
3、参数不同:重载的参数个数、参数类型、参数的顺序可以不同,重写父类子方法参数必须相同
4、修饰不同:重载对修饰范围没有要求,重写要求重写方法的修饰范围大于被重写方法的修饰范围

10、抽象类和接口区别?

抽象类本身是一个类,接口是对类行为定义的规范或约束。
相同点:都可以包含抽象方法,两者都不能实例化。
构造方法:抽象类有构造方法,用于子类实例化使用。接口无构造方法。
成员变量:抽象类可以是变量,也可以是常量。接口只能是常量
成员方法:抽象类可以是抽象的,也可以是非抽象的,不能被private修饰。接口中只能是抽象的,只能被public修饰。
		(1.8之后写default和static方法)

11、接口中可以定义哪些成员

接口可以定义常量(用public static final修饰的变量)
接口可以定义被public修饰的抽象方法
在jdk1.8后,接口可以定义静态方法和被default修饰的默认方法
在jdk1.9后,接口的方法可以是private

12、Object类中常用方法

public boolean equals(Object obj) //判断obj对象与本对象是否相等
public String toString();//返回一个以文本方式表示此对象的字符串
protected void finalize()//JVM垃圾回收器自动调用,在对象被销毁时执行
public native int hashCode()//通过hash运算得出该对象的hash值
public final native Class<?> getClass();//获取反射

13、Java中会存在内存泄漏吗,请简单描述。

所谓内存泄露就是指一个不再被程序便用的对象或变量一直被占据在内存中。
内存泄漏的几个场景:
	1.长生命周期的对象持有短生命周期对象的引用
	尽管短生命周期的对象不再使用,但是因为长生命周期对象持有它的引用而导致不能被回收。例如静态集合类对象。
	2.各种连接不及时关闭
		如数据库连接、网络连接和IO连接不再使用时需要用close方法关闭链接,否则造成内存泄漏。
	3.变量的作用域不合理
		一般而言,一个变量的定义的作用范围大于其使用范围,很有可能会造成内存泄漏。
	4.内部类持有外部类对象
		外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,
		即使那个外部类实例对象不再被使用,但由于内部类持有外部类的实例对象,这个外部类对象将不会被垃圾回收
	5.hashset集合中对象的hash改变
		当hashset中某个对象的hash值改变会导致contains方法找不到该对象的位置,进而无法从集合中删除该对象

14、说明内存泄漏和内存溢出的区别和联系?

关系:内存泄露最终会导致内存溢出,由于系统中的内存是有限的,如果过度占用资源而不及时释放,最后会导致内存不足,从而无法给所需要存储的数据提供足够的内存,从而导致内存溢出。导致内存溢出也可能是由于在给数据分配大小时没有根据实际要求分配,最后导致分配的内存无法满足数据的需求,从而导致内存溢出。

区别:内存泄露是由于GC无法及时或者无法识别可以回收的数据进行及时的回收,导致内存的浪费;内存溢出是由于数据所需要的内存无法得到满足,导致数据无法正常存储到内存中。内存泄露的多次表现就是会导致内存溢出。

15、构造器(constructor)是否可被重写(override) ?

Constructor不能被继承,所以Constructor也就不能被override。每一个类必须有自己的构造函数,负责构造自己这部分的构造。子类不会覆盖父类的构造函数,相反必须负责在一开始调用父类的构造函数。

16、什么是内部类?内部内有哪几个形式

一个类定义在另一个在一个类的内部叫内部类。
四种形式:成员内部类、静态内部类、匿名内部类、局部内部类

17、面向对象设计几大原则

  1. 单一职责原则:一个类只负责一个功能领域中的相应职责
  2. 开闭原则:软件实体应该对修改关闭,对扩展开放
  3. 里氏替换原则:所有引用基类(父类)的地方必须能透明地使用其子类的对象。
  4. 依赖倒转原则:抽象不应该依赖于细节,细节应当依赖于抽象。
  5. 接口隔离原则:使用多个专门的接口,而不使用单一的总接口
  6. 合成复用原则:尽量使用对象组合,而不是继承来达到复用的目的。
  7. 迪米特法则:一个软件实体应当尽可能少地与其他实体发生相互作用。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狴犴ys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值