java 面试总结(java基础)

xiaoxiao2021-08-21  466

1.面向对象思想

   面向对象编程,即OOP,面向对象的概念和应用已经超越了程序设计、软件开发领域,现在已经发展到了各个领域。

   面向对象可以说是对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段的产物。

  它的特点:抽象  封装  继承   多态

  用我的话说,其实可以这么理解,假如我是上帝,我要造 人 (这是对象)。

  首先,我要知道人类要有哪些最基本的东西 ?

  人要有思想,人还要有肉体

  这个过程呢就是(抽象)

  因为人的数量很庞大,所以我需要找别人帮我一起造人,但是我不想让他知道我造人的技术(人的脸需要用多少克泥巴,需要怎么用手去捏鼻子等等),我可以把我的造人的技术封装起来,别人只需要知道他要做什么样的人类就好了。【封装】

  当我自己造人的时候,我可能造着造着就累了,我可能就要用我之前造出来的某个泥人作为模板“复制”,“粘贴”了

  用模板创出来的泥人具有模板的特征,就像孩子一样具有父母的性状。我们称这个过程为【继承】

但是呢  好多泥人都是我后来偷懒用模板复制出来的,为了让人类更丰富多彩一些,我对他们又进行了改变。这个过程可以叫【多态】

 接下来我举个栗子来区分面向过程和面向对象

例子:是如何将大象装进冰箱

为了解决这个问题,我们采用两种方案,一种是面向过程方案,另一种是面向对象方案

面向过程:

总共分三个过程,

第一个过程:冰箱门打开(关着门的冰箱)     返回值是打开门的冰箱

 第二个过程:大象装进去(打开门的冰箱)     返回值是打开着门,装着大象的冰箱

 第三个过程:冰箱门关上(打开着门,装着大象的冰箱)    返回值关着门的装着大象的冰箱

面向对象:

总共分三个动作,(每个动作都有一个对象去执行)

  第一个动作:冰箱.开门()

  第二个动作:冰箱.装进(大象)

第三个动作:冰箱.关门()

或者是链式调用冰箱.开门().装进(大象).关门()

 

2.java的好处

  Java是一种跨平台,适合于分布式计算环境的面向对象编程语言。

 具体来说,它具有如下特性:

  简单性、面向对象、分布式、解释型、可靠、安全、平台无关、可移植、高性能、多线程、动态性等。

 下面我们将重点介绍Java语言的面向对象、平台无关、分布式、多线程、可靠和安全等特性。

 1)面向对象

      面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看作是对象。对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心以算法为驱动的话,面向对象的编程语言则是以对象为中心以消息为驱动。用公式表示,过程式编程语言为:程序=算法+数据;面向对象编程语言为:程序=对象+消息。

       所有面向对象编程语言都支持三个概念:封装、多态性和继承,Java也不例外。现实世界中的对象均有属性和行为,映射到计算机程序上,属性则表示对象的数据,行为表示对象的方法(其作用是处理数据或同外界交互)。所谓封装,就是用一个自主式框架把对象的数据和方法联在一起形成一个整体。可以说,对象是支持封装的手段,是封装的基本单位。Java语言的封装性较强,因为Java无全程变量,无主函数,在Java中绝大部分成员是对象,只有简单的数字类型、字符类型和布尔类型除外。而对于这些类型,Java也提供了相应的对象类型以便与其他对象交互操作。

       多态性就是多种表现形式,具体来说,可以用“一个对外接口,多个内在实现方法”表示。举一个例子,计算机中的堆栈可以存储各种格式的数据,包括整型,浮点或字符。不管存储的是何种数据,堆栈的算法实现是一样的。针对不同的数据类型,编程人员不必手工选择,只需使用统一接口名,系统可自动选择。运算符重载(operatoroverload)一直被认为是一种优秀的多态机制体现,但由于考虑到它会使程序变得难以理解,所以Java最后还是把它取消了。

         继承是指一个对象直接使用另一对象的属性和方法。事实上,我们遇到的很多实体都有继承的含义。例如,若把汽车看成一个实体,它可以分成多个子实体,如:卡车、公共汽车等。这些子实体都具有汽车的特性,因此,汽车是它们的“父亲”,而这些子实体则是汽车的“孩子”。Java提供给用户一系列类(class),Java的类有层次结构,子类可以继承父类的属性和方法。与另外一些面向对象编程语言不同,Java只支持单一继承。

2)平台无关性

      Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。平台无关有两种:源代码级和目标代码级。C和C++具有一定程度的源代码级平台无关,表明用C或C++写的应用程序不用修改只需重新编译就可以在不同平台上运行。

3)分布式

      分布式包括数据分布和操作分布。数据分布是指数据可以分散在网络的不同主机上,操作分布是指把一个计算分散在不同主机上处理。

4)可靠性和安全性

      Java最初设计目的是应用于电子类消费产品,因此要求较高的可靠性。Java虽然源于C++,但它消除了许多C++不可靠因素,可以防止许多编程错误。首先,Java是强类型的语言,要求显式的方法声明,这保证了编译器可以发现方法调用错误,保证程序更加可靠;其次,Java不支持指针,这杜绝了内存的非法访问;第三,Java的自动单元收集防止了内存丢失等动态内存分配导致的问题;第四,Java解释器运行时实施检查,可以发现数组和字符串访问的越界,最后,Java提供了异常处理机制,程序员可以把一组错误代码放在一个地方,这样可以简化错误处理任务便于恢复。

5)多线程

     Java在两方面支持多线程。一方面,Java环境本身就是多线程的。若干个系统线程运行负责必要的无用单元回收,系统维护等系统级操作;另一方面,Java语言内置多线程控制,可以大大简化多线程应用程序开发。Java提供了一个类Thread,由它负责启动运行,终止线程,并可检查线程状态。Java的线程还包括一组同步原语。这些原语负责对线程实行并发控制。利用Java的多线程编程接口,开发人员可以方便得写出支持多线程的应用程序,提高程序执行效率。必须注意地是,Java的多线程支持在一定程度上受运行时支持平台的限制。例如,如果操作系统本身不支持多线程,Java的多线程特性可能就表现不出来。

2.Java中String类 用final修饰的原因

    Java没有字符串这种基本类型,它是使用char[]数组包装而成,对象生成那一刻,内部数据就确定了;另外,它利用编译器重载了“+”、“==”操作符,在虚拟机里与内部常量池做了映射,可见内部非常复杂。因此,为了保证这种数据结构完整性,不被修改和其它操作(例如子类、反射),因此使用final关键字加于限制。

3.Object类的方法有哪几种?

1)clone方法

     保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。

2)getClass方法

     final方法,获得运行时类型。

3)toString方法

     该方法用得比较多,一般子类都有覆盖。

4)finalize方法

     该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。

5)equals方法

     该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。

6)hashCode方法

     该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。

    一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。

7)wait方法

wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

调用该方法后当前线程进入睡眠状态,直到以下事件发生。

(1)其他线程调用了该对象的notify方法。

(2)其他线程调用了该对象的notifyAll方法。

(3)其他线程调用了interrupt中断该线程。

(4)时间间隔到了。

此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

8)notify方法

   该方法唤醒在该对象上等待的某个线程。

9)notifyAll方法

   该方法唤醒在该对象上等待的所有线程。

 

转载请注明原文地址: https://www.6miu.com/read-4823516.html

最新回复(0)