2020最新Java基础面试题(一)

1.Java基础

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

静态变量 实例变量
定义 使用static关键字声明的 实例变量在类中声明,但是在方法,构造函数或其他块之外
初始化 属于类,只要加载了类的字节码,就会被分配空间 必须创建实例对象,才会被分配空间
加载次数 初始化加载一次 每创建一次对象加载一次

1.14 是否可以从一个static方法内部发出对非static方法的调用?

不可以,static方法调用时不需要创建对象,非static方法的调用需要创建实例,那在这个时刻,就像是你想找对象秀恩爱,你对象还没出生,这不扯呢

1.15 Math.round(1.5)等于多少?Math.round(-1.5)又等于多少?

// Math.round 返回一个四舍五入的值
Math.round(1.5)  =  2
Math.round(-1.5) =  -1
//
Math.ceil() 向上取整
Math.floor() 向下取整

1.16 下面的代码有什么不妥之处?

// 1
if(str.equals("test")){}

// 2
System.out.println(0.1+0.2);

第一个 str 为 null的话会抛出空指针异常,所以改为 “test”.equals(str)
第二个会输出0.30000000000000004,改成

System.out.println(new BigDecimal(String.valueOf(0.1)).add(new BigDecimal(String.valueOf(0.2))));

1.17 java中作用域 public,protected,private和默认不写时的区别

作用域 说明
public 可以被任何类访问
protected 可以被同一包中的所有类访问,被所有子类访问,子类没有在同一包中也可以访问
private 只能够被当前类的方法访问
缺省 无访问修饰符,可以被同一包中的所有类访问,如果子类没有在同一个包中,也不能访问

1.18 重载与重写的区别

很多,面试的时候就捡简要的说

  • 重载在一个类中,重写发生在父子类
  • 重载是可以在一个类中有多个重名但参数列表不同,参数列表要个数或数据类型不同,重写则返回值和形参都不能改变
  • 重写的方法只能比父类抛出更少的异常,并且访问限制符也只能比父类大
    ps: 参数相同,但返回值相同,那不叫重载,错误写法

基本上回答这些就OK
扩展:方法的重载与重写都是实现多态的方式,区别是前者是编译时的多态性,后者是运行时的多态性,重写遵循里氏代换原则,就是子类可以扩展父类的功能,但不能改变父类原有的功能

1.19 Integer与int的区别

  • Integer是int的包装类,可以为 null 值
  • int是8种原始数据类型之一
    8种原始数据类型与其包装类型
原始 包装类
byte Byte
short Short
int Integer
long Long
boolean Boolean
char Character
float Float
double Double

1.20 构造器Constructor是否可被override?

构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload

1.21 java的接口可以继承接口吗?接口中可以定义静态或者默认方法吗?

java的接口可以继承接口,第二个在jdk8之后也支持了,可以写静态方法体,但是默认方法要用default修饰符

public interface TestInterface implements A,B,C{  
  
    static void staticMethod() {  
        System.out.println("static method");  
    }
 
    default void defaultMethod() {  
        System.out.println("default method");  
    }
}

1.22 抽象类可以实现接口吗?抽象类是否可以继承具体类?抽象类中是否可以有静态main方法?

  • 抽象类可以实现接口
  • 抽象类可以继承具体类
  • 抽象类中可以有静态main方法

抽象类可以实现接口,可以不必须实现接口中的所有方法

抽象类与普通类的区别

  • 前者不能实例化
  • 前者允许存在抽象方法
  • 后者实现接口必须要实现接口中所有方法

1.23 clone()有什么作用?

super.clone()
拷贝使用

package erdan.demo;

public class TestClone {
    public static void main(String[] args) throws CloneNotSupportedException {
        Demo demo = new Demo();
        demo.a = 1;
        demo.b = 2;
        Demo demo2 = (Demo) demo.clone();
        demo2.a = 100;
        System.out.println(demo.a + " " + demo.b);
        System.out.println(demo2.a + " " + demo2.b);
    }

    static class Demo implements Cloneable {
        int a;
        int b;

        public Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
}

1.24 面向对象的特征

特征 总结
封装 隐藏对象的属性与实现细节,对外提供公开的访问接口
抽象 将一类对象共同特征总结出来构造类的过程
继承 从已有类得到继承信息创建新类的过程
多态 指允许不同子类型的对象对同一消息作出的不同响应

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

答:父类中有方法 fun(),子类B与C分别继承与重写了fun()方法,当创建一个 A a = new B()时,a.fun()调用的是B中的fun(),假若是new C(),那么调用的就是C中的fun()方法,怎么判断使用的是哪个类的fun(),就是动态绑定,这个现象,就是多态

1.26 abstract class 与 interface 有什么区别?

  • abstract class可以有构造方法,而interface不行
  • 单继承(抽象类),多实现(接口)
  • 方法类型:接口只能有抽象方法。抽象类可以具有抽象和非抽象方法。从Java 8开始,接口还可以具有默认方法和静态方法。
  • 最终变量:在Java接口中声明的变量默认为final,抽象类可能包含非 final 变量。
  • 变量类型:抽象类可以具有 final,非 final,static和非 static 变量。接口只有 static 变量和 final 变量。
  • 实现:抽象类可以提供接口的实现。接口无法提供抽象类的实现。
  • 继承与抽象:可以使用关键字“ implements”来实现Java接口,而可以使用关键字“ extends”来扩展抽象类。
  • 数据成员的可访问性:默认情况下,Java接口的成员是公共的。Java抽象类可以具有private,protected修饰的类成员
  • 接口是用来约束类的,抽象类基本是用来代码复用的

1.30 抽象的方法可以是静态的吗?abstract与synchronized可以一起使用吗?

用static声明方法表明这个方法在不生成类的实例时可直接被类调用,而abstract方法不能被调用,所以不能为静态的。
synchronized作用在具体的方法上才有意义,所以不行

1.31 什么是内部类?Static Nested Class 与 inner class 不同点?

内部类顾名思义就是在类内部的一个类,内部类中不能定义静态成员
Static Nested Class 静态内部类,不依赖于外部实例被实例化,通常的内部类需要在外部实例化后才能实例化。

猜你喜欢

转载自blog.csdn.net/Fine_Cui/article/details/106415039