Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第二章 JavaSE 基础#Java 面向对象 #3

Open
maskleo opened this issue Jul 4, 2018 · 0 comments
Open

第二章 JavaSE 基础#Java 面向对象 #3

maskleo opened this issue Jul 4, 2018 · 0 comments

Comments

@maskleo
Copy link
Member

maskleo commented Jul 4, 2018

一、Java面向对象

    1. 面向对象都有哪些特性以及你对这些特性的理解
    • 1)继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
    • 2) 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。
    • 3) 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当 A 系统访问 B 系统提供的服务时,B 系统有多种提供服务的方式,但一切对 A 系统来说都是透明的。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:
    1. 方法重写(子类继承父类并重写父类中已有的或抽象的方法);
    2. 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。
    • 4)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

    注意:默认情况下面向对象有 3 大特性,封装、继承、多态,如果面试官问让说出 4 大特性,那么我们就把抽象加上去。

    1. 访问权限修饰符 public、private、protected, 以及不写(默认)时的区别(2017-11-12)
      该题目比较简单,不同的权限修饰符的区别见下表。
    修饰符 当前类 同包 子 类 其他包
    public
    protected ×
    default × ×
    private × × ×
    1. 如何理解 clone 对象
    • 3.1 为什么要用 clone?

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

    • 3.2 new一个对象的过程和 clone一个对象的过程区别

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

    • 3.3 clone对象的使用

    3.3.1 复制对象和复制引用的区别

      Person p = new Person(23, "zhang");
      Person p1 = p;
      System.out.println(p);
      System.out.println(p1);

    当 Person p1 = p;执行之后, 是创建了一个新的对象吗? 首先看打印结果:

     com.itheima.Person@2f9ee1ac
     com.itheima.Person@2f9ee1ac

    可以看出,打印的地址值是相同的,既然地址都是相同的,那么肯定是同一个对象。p 和 p1只是引用而已,他们都指向了一个相同的对象 Person(23, “zhang”) 。可以把这种现象叫做引用的复制。上面代码执行完成之后, 内存中的情景如下图所示:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant