【纯干货!】LawsonAbs的Java面试题【持续更新】


0. 总结

Get to the points first. The article comes from LawsonAbs!

  • update on 20200504:修改相关格式;更改博文title;

1.JDKJRE的区别

  • jdk:一套java的开发环境,简称jdk,全称java Development kit,它是整个java的核心,其中包括java编译器,java运行工具,java文档生成工具,java打包工具。
  • jre: 提供给普通用户的java运行环境。
    jdk中自带jre工具。

2. static关键字

3.super关键字

3.1 出现的原因

如果子类继承父类,并且覆盖率父类中的相应方法,那么如何在子类中调用其父类被覆盖的那个方法呢?为了解决这个问题,引出了super

3.3 功能

  • 使用super调用父类的成员变量
  • 使用super调用父类构造函数;

需要注意的是,如果是在子类的构造函数中调用父类的构造函数,那么必须要将super()这个代码放在子类构造函数的第一行。

  • 使用super调用父类普通函数;

4.final关键字

记住三不能

  • 使用final修饰的类不能被继承
  • 使用final修饰的方法不能被子类重写
  • 使用final修饰的变量(成员变量和局部变量)是常量,在初始化之后不能被修改值。

5.包的作用

5.1出现原因

管理“类”,当程序变多之后,就需要有类别的管理好我们的代码文件,所以就搞出“包”这么一个概念!

5.2 注意

  • 必须在代码文件的第一行

10. Java中的修饰符问题

10.1 Java中局部变量为什么不需要public,protected,default,private等修饰符?

因为局部变量在方法中使用,在方法执行完成时,局部变量就消失了。所以不需要修饰符修饰。

10.2 Java中的外部类为什么只有public和default【默认】两种修饰符?

对于顶级类(外部类)来说,只有两种修饰符:public和默认(default)。因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置。因此,只需要两种控制权限:包控制权限和公开访问权限,对应两种控制修饰符:默认(default)和public。

10.3 Java中外部类为什么不能用private修饰?

如果将类定义为私有的和受保护的,那么在其他文件中就无法调用。因此,外部类只允许public和默认修饰符。

11. Java中的this用法

this 表示当前对象的意思。什么叫当前对象?【就是你在什么类中用,这个this指的就是这个类的对象。】

12. 三元表达式

什么是三元表达式,怎么用?见下例。

public class helloworld {
    public static void main(String args[]){
        helloworld hw = new helloworld();
        hw.test();
    }
    public void  test(){//测试一个三元表达式的例子
        int b = 1 < 2 ? 1: 2;
        System.out.println("b="+ b);
    }
}

13. List和ArrayList的区别

List是一个接口,ArrayList是一个实现类。 源码如下:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

同样,Set也是一个接口。

14. Java中增强for循环

Java5 引入了一种主要用于数组的增强型 for 循环。格式如下:

for(声明语句 : 表达式)
{
   //代码句子
}

声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式:表达式是要访问的数组名,或者是返回值为数组的方法。

15. Java中的反射机制【非常重要!】

本节单独成文,请点击链接查看。

16. 接口和抽象类的区别

1.接口

  • interface 修饰
  • 为啥命名为接口,因为它只是提供方法的接口(不提供方法体,简单的说,就是没有{},方法体需要自己实现。
  • 接口中的方法默认是public abstract修饰,即全部为抽象方法,故不可以实例化对象
  • 接口中的变量默认使用public static final修饰,即是全局常量
  • 实现接口时,可以使用implements或者extends关键字

2.抽象类

  • abstract修饰
  • 抽象类也是类。所以可以定义方法,但是必须写全方法体
  • 包含抽象方法的类必须声明为抽象类,但抽象类可以不包含任何抽象方法
  • java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用 abstract 关键字修饰
  • 抽象类不可以实例化【因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用】
  • 只有在抽象类中才可以定义抽象方法
  • 抽象类可以继承具体类
  • 抽象类中可以为空,即没有任何的方法的声明
  • 如果一个类继承了抽象类,那么该子类必须将抽象类中的所有抽象方法*重写,而对于非抽象方法则可以不重写!
  • 抽象类中可以有静态main方法
    示例:
package grammer;

class Student {
    int age;
    String name;
}

public abstract class People extends Student{
    public static void main(String []args){
        System.out.println("what!");
    }
}

运行结果:
what!

  • 抽象类中的方法不能用private修饰
abstract class Something {
	private abstract String doSomething ();//Error
}

abstract 的 methods 不能以 private 修饰。 abstract 的 methods 就是让子类implement( 实现 ) 具体细节的,怎么可以用 private 把 abstract method 封锁起来呢 ? ( 同理, abstract method 前不能加 final) 。

抽象类与普通类的唯二区别就是不能创建实例对象和允许有 abstract 方法

17. Java中的多态

17.1 什么是多态?

在同一个方法中,由于参数类型不同而导致执行效果各异的现象就是多态。

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法

17.2 多态的实现方式

  • 01.重写
  • 02.接口
  • 03.抽象类和抽象方法

17.3 多态的优势

  • 01.可以使程序有良好的扩展,并可以对所有类的对象进行通用处理
  • 02.使用父类类型的引用指向子类的对象
  • 03.该引用只能调用父类中定义的方法和变量
  • 04.如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
  • 05.变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错
  • 06.先调用超类的构造方法,多重超类首先调用最远超类的方法
  • 07.然后再执行当前子类的构造方法

18. Java中重载与重写的区别

18.1 重写:【override】

只有在父子类中,才会涉及到重写。如果重写父类的方法,需要满足以下几点要求:
1关键点

  • 01.方法名称,返回值、参数列表必须与父类相同
  • 02.父类引用指向子类对象时,调用的是重写函数,而不是父类被重写的函数
  • 03.对函数进行重写时,可以使用override关键字

18.2 重载:【overload】

1关键点

  • 01.指的是一个方法可以有很多种不同的实现,这些不同的实现之间的关系就可以理解为重载。
  • 02.构造函数可以重载,但是不可以重写

19. 构造函数

1.构造函数精析

  • 构造函数主要是用来初始化成员变量的—>构造函数可用来传递参数
  • 如果类中没有人为书写构造函数,则系统会调用默认的构造函数
  • 构造函数可以重载,但是不可以重写。
  • 构造函数也是函数,里面也可以写return,但是return语句中不可以返回任何内容。
  • 构造函数和类同名
  • 构造函数不可以手动调用
  • 构造函数在类的对象被创建时调用,而且只执行一次。
  • 构造函数不会被继承,所以不能被重写,但是可以重载。【很多类都有不止一个构造函数】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

说文科技

看书人不妨赏个酒钱?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值