JAVA开发互联网科技java学习

Java面试系列 — 基础篇(二)

2018-07-12  本文已影响63人  奋斗的蛐蛐

先整理出一批面试笔试面试题。后续将继续更新,如果本文中出现问题,请及时与蛐蛐联系,蛐蛐马上继续修改,后续也会同步更新。

static关键字

注意事项:
静态方法中不可以调用非静态方法
静态方法中不可以使用this
静态方法不可以调用非静态方法

原因: 从时间角度考虑,先有静态方法,而非静态方法在创建对象时才有,所以当静态方法调用非静态方法时,可能非静态方法还不存在。

备注: 非静态方法调用静态方法正好相反!

static代码块

封装好处

继承的好处

==和equals的区别和联系

Object类的6个常用方法

备注: Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。

什么是多态

多态的好处

多态的前提

抽象类和抽象方法

final、finally、finalize的区别

private/默认/protected/public权限修饰符的区别

访问控制 public protected 默认 private
同一类中成员
同一包中其它类 -
不同包中的子类 - -
不同包中对非子类 - - -

继承条件下构造方法的执行过程

多态的技能点(前提条件,向上转型、向下转型)

接口和抽象类的异同之处

  1. 语法方面的区别是比较低层次的,非本质的,主要表现在:
    • 接口中只能定义全局静态常量,不能定义变量。抽象类中可以定义常量和变量。
    • 接口中所有的方法都是全局抽象方法。抽象类中可以有0个、1个或多个,甚至全部都是抽象方法。
    • 抽象类中可以有构造方法,但不能用来实例化,而在子类实例化是执行,完成属于抽象类的初始化操作。接口中不能定义构造方法。
    • 一个类只能有一个直接父类(可以是抽象类),但可以充实实现多个接口。一个类使用extends来继承抽象类,使用implements来实现接口。
  2. 二者的主要区别还是在设计理念上,其决定了某些情况下到底使用抽象类还是接口。
    • 抽象类体现了一种继承关系,目的是复用代码,抽象类中定义了各个子类的相同代码,可以认为父类是一个实现了部分功能的“中间产品”,而子类是“最终产品”。父类和子类之间必须存在“is-a”的关系,即父类和子类在概念本质上应该是相同的。
    • 接口并不要求实现类和接口在概念本质上一致的,仅仅是实现了接口定义的约定或者能力而已。接口定义了“做什么”,而实现类负责完成“怎么做”,体现了功能(规范)和实现分离的原则。接口和实现之间可以认为是一种“has-a的关系”

简述Java的垃圾回收机制

try-catch异常处理的执行步骤

catch块中如何处理异常

logger.error("除数不能为零");
logger.error("被除数和除数必须是整数");

finally意义何在

IO流的关闭,数据库连接的关闭,网络连接的关闭,不管操作是否出现异常,都要执行

finally语句唯一不执行的情况

System.exit()

尝试通过if-else来解决异常问题

不可行!!

异常的类型

如何处理异常

Error和Exception的区别

Checked异常和Runtime异常的区别

Java异常处理try-catch-finally的执行过程

备注: 即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。

异常处理中throws和throw的区别

wait和sleep的区别

什么是值传递和引用传递

Java支持多继承吗?

Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口变相的多继承,即一个子接口可以实现多个接口。

String能被继承吗?为什么?

不可以,因为String类有final修饰符,而final修饰的类是不能被继承的。

父类与子类之间的调用顺序

  1. 父类的静态代码块
  2. 子类的静态代码块
  3. 父类的构造方法
  4. 子类的构造方法
  5. 子类的普通方法
  6. 重写父类的方法,打印重写后的方法

内部类与外部类的调用

面向对象的特征有哪些方面

  1. 封装
  2. 继承
  3. 多态

Integer与int的区别

String类为什么是final的

  1. 为了效率。若允许被继承,则其高度的被使用率可能会降低程序的性能。
  2. 为了安全

String、StringBuffer、StringBuilder区别与联系

  1. String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。
  2. StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setChartAt、setLength等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String
  3. JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相同。不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder

String类型是基本数据类型吗?基本数据类型有哪些?

String s="Hello";s=s+"world!";执行后,s内容是否改变

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。

String s = new String("xyz");创建几个String Object?

两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。

下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

对于如下代码:

String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab"); // false
System.out.println(s3 == "ab"); // true

运行结果说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象.

String s = "a" + "b" + "c" + "d";
System.out.println(s == "abcd");

最终打印的结果应该为true。

java.sql.Date和java.util.Date的联系和区别

使用递归算法输出某个目录下所有文件和子目录列表

import java.io.File;
public class $ { 
    public static void main(String[] args) { 
        String path = "D:/301SXT"; 
        Test(path); 
    }   
    private static void Test(String path) { 
        File f = new File(path); 
        File[] fs = f.listFiles(); 
        if (fs == null) { 
            return; 
        } 
        for (File file : fs) { 
            if (file.isFile()) { 
                System.out.println(file.getPath()); 
            } else { 
                Test(file.getPath()); 
            } 
        } 
    } 
}

Java有没有goto?

Java中的保留字,现在没有在Java中使用

启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

为什么重写equals时必须重写hashCode方法?

public class DemoBean {

    private String id;

    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        DemoBean demoBean = (DemoBean) o;

        if (id != null ? !id.equals(demoBean.id) : demoBean.id != null) return false;
        return name != null ? name.equals(demoBean.name) : demoBean.name == null;
    }

    @Override
    public int hashCode() {
        int result = id != null ? id.hashCode() : 0;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
}

上一篇下一篇

猜你喜欢

热点阅读