不允许使用抽象类类型的对象怎么办_直击面试:Java面向对象

da295ed5a8f7814df3567095a5b9f8ff.png     a07d2e32d8bf1517faea7862b9297ec7.gif   作者|Summer

1、面向对象包括哪些特性,怎么理解的?

(1)封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。

(2)继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。

关于继承如下 3 点请记住:

1、子类拥有父类非 private 的属性和方法。

2、子类可以拥有自己属性和方法,即子类可以对父类进行扩展。

3、子类可以用自己的方式实现父类的方法。

(3)多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当 A系统访问B系统提供的服务时,B 系统有多种提供服务的方式,但一切对 A 系统来说都是透明的。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。

运行时的多态是面向对象最精髓的东西,要实现多态需要做三件事:

继承:在多态中必须存在有继承关系的子类和父类。

重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

(4)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

2、访问权限修饰符 public、private、protected, 以及不写(默认)时的区别?

修饰符   当前类同包子类其他包
public √
protected
默认(缺省)××
private×××

3、Java中为什么要用 clone?

在实际编程过程中,我们常常要遇到这种情况:有一个对象 A,在某一时刻 A 中已经包含了一些有效值,此时可能会需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动都不会影响到 A 中的值,也就是说,A 与 B 是两个独立的对象,但 B 的初始值是由 A 对象确定的。在 Java 语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但clone()方法是其中最简单,也是最高效的手段。

● 说到对象的克隆,涉及到深克隆和浅克隆?

浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。

深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

4、new一个对象的过程和clone一个对象的区别?

new 操作符的本意是分配内存。程序执行到 new 操作符时,首先去看 new 操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象。

clone 在第一步是和 new 相似的,都是分配内存,调用 clone 方法时,分配的内存和原对象(即调用 clone 方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域,填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。

5、Java中实现多态的机制是什么?

Java中的多态靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

6、谈谈你对多态的理解?

多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源代码,就可以让引用变量绑定到各种不同的对象上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

7、谈谈你对面向对象的理解?

所谓对象就是由一组数据结构和处理它们的方法组成的,重点“数据”包括对象的特性、状态等的静态信息;“方法” 也就是行为,包括该对象的对数据的操作、功能等能动信息。把相同行为的对象归纳为类,类是一个抽象的概念,对象是类的具体。简单点说:对象就是类的实例。例如:小品演员就是一个类,赵本山就是一个对象。

面向对象的目的:解决软件系统的可扩展性,可维护性和可重用性。

● 面向对象的三大特性:封装、多态和继承:

(1)封装(对应可扩展性):隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。封装是通过访问控制符(public protected private)来实现。一个类就可看成一个封装。

(2)继承(重用性和扩展性):子类继承父类,可以继承父类的方法和属性。可以对父类方向进行覆盖(实现了多态)。但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,只有明确的IS-A关系才能使用。继承要慎用,尽量优先使用组合。

(3)多态(可维护性和可扩展性):接口的不同实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口。

面向对象编程(OOP)其实就是一种设计思想,在程序设计过程中把每一部分都尽量当成一个对象来考虑,以实现软件系统的可扩展性,可维护性和可重用性。

8、抽象类和接口有啥区别

抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。

从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

相同点

  • 接口和抽象类都不能实例化

  • 都位于继承的顶端,用于被其他实现或继承

  • 都包含抽象方法,其子类都必须覆写这些抽象方法

不同点

8a01b61a56dcd8e7c3df7adcca04ec76.png

备注:Java8中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。

现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样的原则:

1)、行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类。

2)、选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能。

9、super()与 this()的区别?

This():当前类的对象,super 父类对象。

Super():在子类访问父类的成员和行为,必须受类继承规则的约束。

而 this 他代表当前对象,当然所有的资源都可以访问。

在构造函数中,如果第一行没有写 super(),编译器会自动插入,但是如果父类没有不带参数的构

造函数,或这个函数被私有化了(用 private 修饰)。此时你必须加入对父类的实例化构造,而 this 就没有这个要求,因为它本身就进行实例化的构造。

而在方法中 super 和 this 使用的方法就差不多了,只不过 super 要考虑是否能访问其父类的资源.

10、类的组成和执行顺序?

组成:属性 方法  静态块 非静态块

执行顺序:先父类,后子类,静态块 静态字段 非静态块 非静态字段 构造器 方法

11、重载(Overload)与重写(Override )区别?     

重载发生在同一个类,不同的方法里面。重写发生在父子类中,参数完全相同的方法里面。

重载参数不同,而重写参数相同且返回类型相同。

方法名相同,重写override是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现。

12、面向对象的设计模式有哪些?

创建型模式:

    1.简单工厂模式

    2.工厂模式

    3.抽象工厂模式

    4.单例模式

    5.原型模式

创建者模式

    6.结构型模式:

    7.组合模式

    8.装饰者模式

    9.外观模式

    10.适配器模式

    11.代理模式

    12.享元模式

    13.桥接模式

行为型模式:

    14.观察者模式

    15.策略模式

    16.状态模式

    17.中介模式

    18.模板方法

    19.命令模式

    20.备忘录模式

    21.访问者模式

    22.解释器模式

    23.迭代器模式

    24.职责链模式

这里只是简单描述了定义和特征以及设计模式的关系,后续会专门出文章介绍。

公众号回复:001 获取2020最新Java面试题

4640db98963b54af63ff0c6e192755bc.png

往期精彩回顾

f1be085b29d19db142e215df7b5ec965.png

编程学不会?这样学,你会成为大牛!

Windows很卡该怎么办?我只说这一次!

我要吹爆它!Windows办公神器软件!!

资源找不到?给你两个网站,你想要的都有!

希望这篇文章可以帮助到你~欢迎大家点个 在看,分享至朋友圈 IT的路上 我 一直陪着你

4fc696b53d95feadb407342b28844935.png

写留言 99+

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值