天天看点

java基础篇1. 解释下什么是面向对象?面向对象和面向过程的区别?2. 面向对象的三大特性?分别解释下?3.JDK、JRE、JVM 三者之间的关系?4.重载和重写的区别?5.Java 中是否可以重写一个 private 或者 static 方法?6.构造方法有哪些特性?7.在 Java 中定义一个不做事且没有参数的构造方法(无参构造方法)有什么作用?8.Java 中创建对象的几种方式?9.抽象类和接口有什么区别?10.静态变量和实例变量的区别?

1. 解释下什么是面向对象?面向对象和面向过程的区别?

面向对象:

其实对象是类的抽象概念 ,也就是起一个名字,我们可以按照各种不同的功能,方法,模块,业务逻辑等分别起名,分别归类,使用此对象名调用该对象所代表的类中的不用函数也就是代码块,其中就是我们分开写的各种不同的方法,业务了逻辑等。

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

缺点:性能比面向过程低

面向过程:

其实就是在一个类中将所有的模块、功能、业务逻辑等按照执行顺序依次从上到下的书写并执行。

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;

缺点:没有面向对象易维护、易复用、易扩展;

2. 面向对象的三大特性?分别解释下?

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

封装:是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。通俗来说,就是将一大堆实现逻辑,放在一个盒子里面。我们使用的时候,只需要调用封装好的盒子即可。

封装的优点:1、良好的封装能减少耦合

2、类内部的结构可以自由修改
                 3、可以对成员变量进行更精确的控制
                 4、隐藏信息,实现细节
           

继承:就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

多态:同一个行为具有多个不同表现形式或形态的能力。

多态存在的三个必要条件:

1、继承;
            2、重写;
            3、父类引用指向子类对象:Parent p = new Child();
           

3.JDK、JRE、JVM 三者之间的关系?

JDK:JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。

它是每一个 Java 软件开发人员必须安装的。JDK 安装之后,它会自带一个 JRE,因为软件开发人员编写完代码之后总是要运行的。

注意:如果只是在这台机器上运行 Java 程序,则不需要安装 JDK,只需要安装 JRE 即可

JRE:JRE(Java Runtime Environment,Java 运行环境),运行 JAVA程序所必须的环境的集合,包含 JVM 标准实现及 Java 核心类库。

JVM:JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

JVM 是实现 Java 语言跨平台的法宝。

4.重载和重写的区别?

方法重载是在同一个类中,声明多个同名方法,通过参数列表来区分不同的方法,与参数列表的数量、类型和顺序有关,与修饰符和返回值类型以及抛出异常类型无关

方法重写(方法覆盖)的前提是发生在具有继承关系的两个类之间,方法重写有以下规则:

  • 参数列表,返回值,方法名必须保持一致
  • 重写方法的访问权限范围必须大于等于父类方法
  • 重写方法的抛出异常类型范围不能大于父类方法

5.Java 中是否可以重写一个 private 或者 static 方法?

java中的static方法是不可以被覆盖的,因为方法覆盖是基于运行时的动态绑定的,而static方法编译时是静态绑定的,static方法类的任何事例都不相关联。

java中也不可以覆盖private权限的方法,因为private修饰变量只能在当前类内部使用,其他类继承当前类的时候,访问不到private变量

6.构造方法有哪些特性?

  1. 构造器是一种特殊的方法;构造方法的名称必须跟类名保持一致
  2. 构造方法虽然有返回值(返回一个已经初始化好的对象),但是不能定义返回类型,返回值的类型肯定是本类类型
  3. 不能用关键字void,不能在构造器里调用return
  4. 构造方法在创建类对象的时候通过关键字new被调用;

7.在 Java 中定义一个不做事且没有参数的构造方法(无参构造方法)有什么作用?

Java程序在执行子类的构造方法之前,如果没有使用super()调用父类特定的构造方法,则会默认调用父类中的无参构造方法。

如果父类中没有无参构造方法,而子类又没有使用super()调用父类中特定的构造方法,则编译时会出错。

8.Java 中创建对象的几种方式?

new关键字

反射

Class.newInstance:

运用反射创建对象时最常用的方法。Class类的newInstance使用的是类的public的无参构造器。

Constructor.newInstance:

Constructor.newInstance比Class.newInstance强大。可以通过该方法调用有参数和私有的构造函数。不再局限于必须是无参且公共的。

Clone方法

无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。

因为Object的clone方法是protected的,所以要使用clone方法,我们必须先实现Cloneable接口并复写Object的clone方法

反序列化

当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。

为了反序列化一个对象,我们需要让我们的类实现Serializable接口。

9.抽象类和接口有什么区别?

抽象类

在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,没有方法体。抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。

接口

Java中接口使用interface关键字修饰。接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。

接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。

区别

语法层面

  • 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract (隐式声明)方法;
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final(隐式声明)类型的(必须在声明时赋值);
  • 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

设计层面

  • 抽象类是对一种事务的抽象,是对整个类进行抽象,包括属性,行为(方法)。接口是对行为(行为)的抽象。如果一个类继承或实现了某个抽象类,那么一定是抽象类的种类(拥有同一种属性或行为的类)。
  • 设计层面不同,抽象类作为很多子类的父类,是一种模板设计,而接口是一种规范,它是一种辐射式设计,也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象方法中添加实现,子类可以不用变更,而对于接口不行,如果接口进行了变更,那么实现它的类都需要做变更。

10.静态变量和实例变量的区别?

静态变量

静态变量用 static字符修饰,随着类的加载而加载,静态变量存放在方法池中的静态区,可以直接通过"类名.变量名直接"调用,也可以通过类的对象调用

实例变量

实例变量相当于该类的属性,需要 "new对象 "才能被调用。而且该变量不常驻内存,当这个类不再被使用时会java回收机制所释放

静态变量与实例变量的区别

  1. 存储区域不同:静态变量存储在静态存储区域,实例变量存储在堆中,会被释放。
  2. 静态变量与类相关,实例变量与对象相关。
  3. 生命周期不同,静态变量在类启动时就分配指定内存;实例变量在被对象调用后才分配内存,调用结束时内存释放。