【Java面试之一基础知识】

面试题正确打开方式 : https://www.xdx97.com/article?bamId=656552384847151104

1. 面向对象和面向过程的区别
    1、面向过程 :面向过程性能比面向对象高。嵌入式开发、Linux/Unix等一般采用面向过程开发。
    2、面向对象 :面向对象易维护、易复用、易扩展。 。但是,面向对象性能比面向过程低。
2. Java 语言有哪些特点
    1、简单易学;
    2、面向对象(封装,继承,多态);
    3、平台无关性( Java 虚拟机实现平台无关性);
    4、支持多线程
3. 关于 JVM JDK 和 JRE 最详细通俗的解答
    1、Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
    2、JDK是功能齐全的Java SDK。它拥有JRE所拥有的一切,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。
    3、JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有内容的集合。但是,它不能用于创建新程序。
4. Java和C++的区别?
    1、Java 不提供指针来直接访问内存,程序内存更加安全
    2、Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
    3、Java 有自动内存管理机制,不需要程序员手动释放无用内存
5. 字符型常量和字符串常量的区别?
    1、字符常量是单引号引起的一个字符; 字符串常量是双引号引起的若干个字符
    2、含义上: 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)
    3、内存大小 字符常量只占2个字节; 字符串常量占若干个字节(至少一个字符结束标志) (注意: char在Java中占两个字节)
6. 构造器 Constructor 是否可被 override?
    1、父类的私有属性和构造方法并不能被继承,所以 Constructor 也就不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况。
7. 重载和重写的区别
    1、重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
    2、重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
8. Java 面向对象编程三大特性: 封装 继承 多态
    1、封装 : 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。
    2、继承 : 是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。
    3、多态 :程序只有在运行的时候才会知道具体的方法将要干什么。在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

9. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?     1、String 类中使用 final 关键字修饰字符数组来保存字符串,所以 String 对象是不可变的。
    2、StringBuffer 和 StringBuilder 底层没有使用final修饰。所以对字符串频繁操作的时候,可以使用这个两个
    3、但是StringBuffer是线程不安全的,所以当需要保证线程安全的时候还是应该使用StringBuilder。
10. 自动装箱与拆箱
    1、装箱:将基本类型用它们对应的引用类型包装起来
    2、拆箱:将包装类型转换为基本数据类型
11. 在一个静态方法内调用一个非静态成员为什么是非法的?
    由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。
12. 在 Java 中定义一个不做事且没有参数的构造方法的作用
    Java程序在调用子类的构造方法之前,如果没有使用 super关键字来调用特定的父类构造方法。就会默认去调用父类的空参构造方法,如果这个时候没有就会报错。
13. import java和javax有什么区别?
    实际上java和javax没有区别。这都是一个名字
14. 接口和抽象类的区别是什么?
    1、一个类可以实现多个接口,但只能实现一个抽象类
    2、接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。
    3、接口中除了static、final变量,不能有其他变量,而抽象类中则不一定。
    4、接口中只有抽象方法,抽象类中可以有非抽象方法。
     注意:Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。
15. 成员变量与局部变量的区别有哪些?
    1、成员变量是属于类的,局部变量是在方法中定义的变量或是方法的参数
    2、成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能;但是,成员变量和局部变量都能被 final 所修饰。
    3、成员变量如果没有被赋初值:则会自动以类型的默认值而赋值(一种情况例外:被 final 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。

16. 创建一个对象用什么运算符?对象实体与对象引用有何不同?
    new运算符,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)。
17. 什么是方法的返回值?返回值在类的方法里的作用是什么?
    方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用:接收出结果,使得它可以用于其他的操作!
18. 一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?
    1、作用是初始化对象的
    2、可以,因为会有一个默认的空参构造方法
19. 构造方法有哪些特性?
    1、名字与类名相同。
    2、没有返回值,但不能用void声明构造函数。
    3、生成类的对象时自动执行,无需调用。
    4、可以使用访问修饰符,使用private 修饰,最简单的单例模式

20. 静态方法和实例方法有何不同
    1、静态方法直接使用类名调用,整个类只有一份。实例方法每new一个实例就有一个,使用对象调用
    2、静态方法里面只能使用静态变量。
21. 对象的相等与指向他们的引用相等,两者有什么不同?
    1、对象的相等,比的是内存中存放的内容是否相等。
    2、而引用相等,比较的是他们指向的内存地址是否相等。
22. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
    帮助子类做初始化工作。
23. == 与 equals(重要)
    1、 == : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。
    2、 equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
        情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
        情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
24. hashCode 与 equals (重要)
    1、如果两个对象相等,则hashcode一定也是相同的
    2、两个对象相等,对两个对象分别调用equals方法都返回true
    3、两个对象有相同的hashcode值,它们也不一定是相等的
    4、因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
    5、hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
25. 为什么Java中只有值传递?
    这个解答是我自己按照我的思考写的,网上都写的比较复杂,个人感觉面试的时候不方便说。
    如果是地址值传递。那么对形参所作的一切都会映射到实参上面。
    但是在引用传递的时候
    当你传递一个User的时候,你在方法里面重新new一个User给形参。但是这时候实参还是之前的不会变。

public static void main(String[] args) {
    User u1 = new User("李四");
    fun(u1);
    System.out.println("Main : " + u1.getName());
}

public static void fun(User u2){
    u2 = new User("张三");
    System.out.println("fun : " + u2.getName());
}

打印结果:

fun : 张三
Main : 李四


26. 简述线程、程序、进程的基本概念。以及他们之间关系是什么?
     程序: 程序就是一堆指令和数据的集合,比如你写了一个.java的文件。它是一个静态文件,被存储在磁盘上。
     进程: 进程是程序执行一次的过程,是系统运行程序的基本单位。系统运行一次程序,就是一个进程从创建、到销毁的过程。进程之间运行相互独立。
     线程: 与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程

27. 线程有哪些基本状态?
     初始状态 : 线程被创建,但是还没有调用start()方法
     运行状态 : Java程序中将“运行”和”就绪“都笼统的称为 ”运行中“
     阻塞状态 : 表示线程进入等待状态
     超时等待状态 : 等待时间结束会自动返回
     终止状态 : 当前线程执行完毕

28. 说一下 final 关键字
     1、final可以使用在变量、方法、类上面
     2、用在变量上,变量值就不能再改变。如果是引用类型的变量,就不能再指向其它引用
     3、用在方法上,这个方法就不能被重写
     4、用在类上,这个类就不能被继承,final类中的所有成员方法都会被隐式地指定为final方法。

29. 说一下 Java 中的异常
     1、Java中的异常分错误和异常两种,异常又分运行时异常和非运行时异常。非运行时异常需要使用 try catch 或者 throws来处理。
30 Java序列化中如果有些字段不想进行序列化,怎么办?
     使用transient关键字修饰,transient只能修饰变量,不能修饰类和方法。
31 BIO,NIO,AIO 有什么区别?
    1、BIO是传统的阻塞IO
    2、NIO是非阻塞IO,它相对传统的阻塞IO多了下面几个关键的属性
        2-1:channel 通道
        2-2:buffer 缓冲区
        2-3:selected 选择器

32 八大基本数据类型,以及他们的大小
    1、byte / 8
    2、short / 8
    3、float / 16
    4、int / 16
    4、char / 16
    5、double / 32
    7、long / 32
    8、boolean

8 bit(比特) = 1 b(字节)


33、内部类

     定义在一个类内部的类叫做内部类
     内部类的优点:
        1、内部类的对象能访问所处类的私有属性和方法
        2、内部类可以隐藏起起来,不被同一个包的其他类访问
        3、内部类可以声明为抽象类,被其他内部类继承,也可以声明为final
        4、内部类可以声明为private、protect
        5、内部类可以用static修饰

8 bit(比特) = 1 b(字节)


34. 说一下 static 关键字
     1、被static修饰的变量或者方法,属于这个类。整个类只有一份,直接使用类名.方法名/变量名调用
     2、可以修饰静态代码块,不管创建多少个实体,静态代码块只执行一次
     3、静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非static成员变量和方法
发布了302 篇原创文章 · 获赞 127 · 访问量 52万+

猜你喜欢

转载自blog.csdn.net/Tomwildboar/article/details/103584883
今日推荐