Java面试题2(OOP 第二阶段)

面向对象


  • 面向过程和面向对象的区别?优缺点?

面向过程思想:考虑的是程序整体的运行流程。面向过程就是分析出实现需求所需要的步骤,通过函数一步一步实现这些步骤,接着依次调用即可。

面向对象思想:考虑的是如何将每个解决业务问题的程序代码组合在一起。面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为。

优缺点:

(1)面向过程

优点:性能上它是优于面向对象的,因为类在调用的时候需要实例化,开销过大。

缺点:不易维护、复用、扩展

用途:单片机、嵌入式开发、Linux/Unix等对性能要求较高的地方

(2)面向对象

优点:易维护、易复用、易扩展,由于面向对象有封装继承多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低。

低耦合,简单的理解就是说,模块与模块之间尽可能的独立,两者之间的关系尽可能简单,尽量使其独立的完成成一些子功能,这避免了牵一发而动全身的问题。

  • 面向对象的特征有哪些方面?/面向对象程序设计的特点?

三大特性是:封装,继承,多态。
(1)封装,也就是把客观事物(对象的属性和方法)抽象封装成类。简单的说,一个类就是一个封装了数据以及操作这些数据的算法。然后对象利用访问修饰符对内部数据提供不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
(2)继承是指可以让某个类型的对象获得另一个类型的对象的属性和方法,继承是面向对象编程中一种代码复用的方式。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。子类是对父类功能的扩展,实际开发中父类往往是从子类泛化而来,父类中的属性和方法是从子类中抽象来的。继承的优点:减少代码冗余,提高程序的可维护性和可扩展性。
(3)多态是同一父类不同子类对象对同一方法调用,产生的不同行为。优点:减少代码冗余,增强程序的可维护性和可扩展性。重写、重载和向上造型都是多态的表现形式。使用:定义父类、定义子类继承父类、子类重写父类方法、子类对象赋给父类引用(向上造型)、使用父类引用调用子类重写后的方法。

  • 静态变量和实例变量的区别?

(1)静态变量前要加static关键字修饰的,静态变量不属于某个实例对象,而是属于类,所以也称为类变量。静态变量则可以直接使用类名来引用。

(2)实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。

  • 成员变量和局部变量的区别?

  • 多态的表现形式有哪些?

重写、重载和向上造型。

  • 访问修饰符有哪些?

  • 什么是向上造型?什么是向下造型?

(1)向上造型是把子类对象赋给父类引用,或父类引用指向子类对象。优点:子类对象可以放入父类类型的数组中,父类数组统一管理所有子类对象,减少代码冗余。特点:向上造型后的父类引用,只能调用到父类中的成员,不能调用到子类特有的成员,如果需要调用子类特有成员,那就需要向下造型。

(2)向下造型,也称强制类型转换,将一个类型的引用转换成另一个类型,前提是向上造型。优点:父类引用无法调用到子类特有的成员,而向下造型(强制类型转换)后就可以调用。在强转前,一般要使用关键字instanceof先判断一下实际的类型,如果类型不匹配会发生类型转换异常(ClassCastException)。也可以用于判断是否实现了某个接口。

  • 什么是方法重载?什么是方法重写?方法重载和重写的区别?

(1)方法重载是指在同一个类中,有多个方法名相同、参数列表不同的方法。方法重载的编译期绑定:调用被重载的方法时代码进行编译时就确定了要运行的那个方法。

(2)方法重写父类的方法不能满足子类的要求。在向上造型的前提下,指向子类对象的父类引用,在调用被子类重写的方法时,运行的是子类重写后的方法。运行期绑定:父类引用在运行方法时,JVM会自动检测这个父类引用指向的真实类型,调用真实类型重写后的方法。重写规则:两同两小一大。

  • static关键词的作用?

static(静态)只能修饰属性和方法。

(1)静态属性也称之为类属性,使用类名调用。被static修饰的属性,所有对象共享同一个值,并且属性值会被保存在内存的方法区中。优点:设置成静态,能够节省内存。

(2)使用static修饰方法,该方法称之为静态方法(类方法),可以直接使用类名调用,无需实例化对象。如果一个方法不需要访问当前类中的实例成员,就可以定义成静态。。静态只能访问静态,并且静态方法不能被重写。

(3)被static修饰的初始化块,可以完成类的初始操作,只会运行一次。始化块中的内容会在构造方法运行前运行。

  • 常量有几种赋值方式?

两种。

(1)声明的同时赋值。

(2)在静态块中赋值。

  • final、static和abstract能一起使用吗?它们的区别?

(1)fianl和abstract相互矛盾,不能同时修饰一个类或方法。抽象类或抽象方法必须被继承或重写才有意义,而final限制它们。

(2)static和abstract不能同时修饰一个方法。静态方法能直接被类调用,而抽象方法没有方法体,不能够被直接调用,需要在子类中或实现类中重写后具有处理逻辑的功能后才有意义。

区别:

  • 什么是抽象类?什么是接口?抽象类和接口的区别?

(1)不存在具体对象的类型,就是抽象类,如Pet、Fruit、Person。class前加abstract关键词修饰,抽象类不能实例化,抽象类中可以有抽象方法,可以没有抽象方法,有抽象方法的类一定是抽象类。抽象方法就是不能编写具体实现的方法,如吃水果、养宠物等。抽象方法不能有方法体,抽象方法必须在子类中被重写,除非子类也是抽象类。抽象方法必须在抽象类中。

优点:因为抽象类不能实例化,只能作为父类,所以它提供一个数据结构简化编程。因为子类中必须重写父类的抽象方法,约束了子类行为,更加自然地使用向上造型和方法重写。

(2)接口是一种特殊的抽象类。接口和类平级,也是一个数据类型。在一个java文件中将类的class关键字替换为interface。接口中的属性都是public static final默认修饰的,即都是常量;接口中的方法都是public abstract默认修饰的,即方法都是抽象方法,注意没有方法体。接口不能实例化。接口没有构造方法。我们将实现接口的类称为实现类。这个实现类要实现接口中的所有方法,除非这个类是抽象类。如果一个实现类实现多个接口,接口名用,分割。如果这个类既继承父类又实现接口,要先写extends再写implements。父类是个类型,接口是个能力。子类继承父类符合is-a(是一个)原则,实现类实现接口应该符合has-a(有一个)原则。使用向上造型可以将对象赋给接口类型,但是接口类型只能调用到接口声明的方法。接口也可以继承接口,使用extends关键字,多个接口用,分割,实现类实现所有父类接口中的内容。

用处:使Java可以间接的实现多继承。
           接口约束了实现类(子类)的方法,从而提高程序的扩展性。
           方便程序的设计者搭建程序框架。

  • 什么是内部类?

一个类的内部定义的另一个类,外部的类叫outer,内部类的叫inner。内部类可以访问外部类的私有成员(priva修饰的成员),当内部类和外部类有同名成员时,内部类中可以使用<外部类名>.this.<成员>来访问外部成员。通常情况下,内部类只会在外部类中使用,通过实例化内部类对象可以访问内部类的私有成员。所有的内部类都有独立的class文件。

(1)成员内部类是在楼中的成员位置声明/定义的类结构。

(2)匿名内部类是在通常情况下,在方法中,通过继承一个类或实现一个接口类创建的没有名称的内部类。使用时机:如果这个类的对象只在某个方法中使用一次,可以使用匿名内部类。匿名内部类可以使用其所在方法的局部变量,但是要将其视为被final修饰的(隐式)。计时器就是一个匿名内部类。

  • 接口是否可以继承接口?抽象类是否可以实现接口? 抽象类是否可以继承具体类?

接口可以继承接口,可以继承多个接口。抽象类可以实现接口,可以实现多个接口。抽象类可以继承具体类,但只能继承一个类

  • final、finally和finalize的区别?

(1)final关键词可以修饰类、属性、方法和局部变量。被final修饰的类不允许有子类,被final修饰的属性值不能被修改,被final修饰的方法不允许被重写,被final修饰的局部变量声明后只能被赋值一次,不能被修改。

(2)finally是在捕获异常时搭配try catch使用的,表示一定会执行的一个语句块,常用来关闭资源等操作。

(3)Object中的finalize方法:所有对象都会继承到这个方法。GC在回收垃圾之前,会调用该对象的finalize方法,该方法调用完毕后对象会被释放。

  • GC是什么?GC的作用?

Garbage Collection(Gc):垃圾回收管理机制。Java提供的GC功能可以自动监测回收不被引用的对象,释放其占用的内存,
垃圾收集器会自动进行管理。处理原因:如果放任那些不再使用的对象存放在内存中,最终会发生内存溢出(内存泄漏),严重影响计算机性能。如果要请求垃圾收集,可以调用下面的方法之一:System.gc()或Runtime.getRuntime().gc(),这些方法会通知GC尽快进行内存垃圾回收。在对象使用以后要及时释放其引用,有利于垃圾回收,可以有效的防止内存泄露。

优点:Java程序员不需要管理回收垃圾。

缺点:GC本身是需要占一些内存的。 GC对垃圾的回收是有延迟的。 GC只处理Java程序内部产生的垃圾。

回收原理:GC判断对象是否是垃圾的方法是综合的,有很多方法来判断一个对象是否是垃圾,其中一个最核心的方法就是引用计数法栈帧:内存中的一个栈和一个方法对应,一个方法对应的一个栈称为"栈帧"。 程序计数器:计算引用数。如果希望一个局部变量尽快被回收,将它设置为null。

Object中的finalize方法:所有对象都会继承到这个方法。GC在回收垃圾之前,会调用该对象的finalize方法,该方法调用完毕后对象会被释放。

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值