栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

最常考的Java后台面试题(一)Java基础

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

最常考的Java后台面试题(一)Java基础

目录

总览什么是面向对象?面向对象的封装、继承、多态指的是什么?Java为什么可以“Write Once, Run any Where”?JVM、JRE和JDK的关系是什么?引用数据类型和基本数据类型的关系?四个访问修饰符的区别?final、finally、finalize的区别?this关键字?static关键字?重写(override)和重载(overload)的区别?抽象类与接口的关系?

总览

参考内容:Java面试小抄

(一)Java基础(二)Java集合(三)JVM(四)Java并发(五)MySQL 什么是面向对象?

面向对象是和面向过程相对的。为了说明这俩的不同,我们举一个例子“如何在学校里找对象?”

面向过程:与目标相遇 --> 判断是否符合标准 --> 符合就加微信,不符合回到第一步 --> ……面向对象:寻找系统、打分系统、约会系统、表白系统……

从这个例子中可以大概知道二者的区别:面向过程的重点是把步骤一步一步组成逻辑,而面向对象则是将整个过程通用的部分提取出来并模块化。
因此,面向过程一个事一个做法,好处是消耗低,但难以复用;面向对象是找出通用做法,在提高了消耗的代价下获得了易于复用、维护和扩展的特性。

面向对象的封装、继承、多态指的是什么?

这三个的意思都是直白的。
首先,封装就是将类中的细节给包装起来,只留下接口以供使用。举例来说,用遥控器打开空调,室内变冷了,但是我们不需要知道是怎么变冷的。具体来说,类中由private修饰的就是需要隐藏起来的细节,而类中public的方法就是这个类的接口。在之后使用这个类的时候就可以通过public方法进行输入和输出。
继承就是字面意思,子类在父类的基础上构建,也就是说子类继承了父类。比如说,是动物的继承,女朋友是人类的继承。Java中的继承方式为extends。

public class A {   
	xxx;
} 
public class B extends A{
	xxx;
}

需要注意的是,子类拥有父类非private的属性和方法,可以增加特有的方法,也可以重写父类的方法。
继承部分还需要说三个关键词:构造器、protected、向上转型。
构造器其实就是类的初始化部分。构造器名同类名一致。在Java程序中,new后面的那个部分就是构造器。比如

List list = new ArrayList<>();

里面的ArrayList<>()就是构造器,完成了初始化操作。
但在继承部分单独提构造器的原因是,子类不能继承父类的构造器,只能通过super()方法去调用。如果没写super语句,编译的时候默认加上。
继承虽然使得复用变得简单,但是继承自父类的子类与父类是强耦合关系,父类变了子类也会变。所以要谨慎使用继承。
protected是private和public中间的限制,public是都可以访问,private是类内才可以访问,而protected指使用该类的对象依旧不可以访问,但是继承这个类的子类可以访问。
向上转型,是子类继承父类,并创建对象的过程。 语法为“父类 对象名 = new 子类构造器”。比如说“动物 a = new 猫”,这种情况下a虽然是动物,但a如果调用动物中的叫,调用的就是猫叫。即,A的对象可访问B从A中继承来的和B“重写”A的方法。
最后到多态。多态就是多种状态了,具体指的是同一行为(方法)的不同状态。举例来说就是,黑白打印机和彩色打印机都调用打印方法都打印“hello”,但是“hello”分别是黑白的和彩色的两种状态。

继承 + 重写 + 向上转型 —> 多态

多态是结果。继承是多态的其中一种原因。加上重写和向上转型的设定,使得存在多态的现象。用刚刚打印机的例子继续说明,彩色打印机继承自黑白打印机,并重写了打印出来的字的颜色,而用打印机 a = new 彩色打印机构造出来的a可以使用打印机的打印功能,但是字的颜色变成了彩色,也就导致了多态的产生。

Java为什么可以“Write Once, Run any Where”?

C或C++等,在程序编写之后,需要编译成二进制码才可以在平台上运行。但是不同平台上的对二进制码的识别不同,所以这些程序在一个平台编译之后不可以在另一个平台上运行。
但是Java将编写的程序编程成为字节码。Java的源程序的后缀是.java,然后编译程序将程序编译为.class的字节码文件。如果平台想运行.class,必须使用JVM(Java虚拟机),而JVM再将字节码转换为二进制从而运行程序。不同平台上的JVM是不同的。
之所以叫做字节码,是因为初步编译的程序是十六进制,而JVM一次读取两个十六进制,也就是以字节为单位读取。一个字节指的是8位的二进制,那么2的8次方有256;对于十六进制来说,两位的十六进制,即16的平方是256。
举例来说,我写了一份中文的文件,C++就是,我如果想发给俄罗斯和夏威夷,我就要把这个文件翻译成两国对应的语言,但显然翻译之后的俄罗斯文件给夏威夷的话他们是看不懂的;而Java的情况是,我写了一份的中文的文件,然后自己把它翻译成英文,然后派懂英文的当地翻译生活在当地,这样当地翻译就会把英文文件翻译成对应国家的语言。也就是所谓的“一次编写,处处运行”。这里的处处运行指的是.class文件可以处处运行,处处的前提是这个地方已经装了JVM。
编译指的是文件通过编译器一次成为平台可以理解的机器码,是静态的、效率高的、可移植性差的;解释指的是文件需要解释器一行一行的转换成机器码再运行,是动态的、效率低的、可移植性好的。因为.java需要先编译成为.class,所以有编译;又因为.class需要JVM解释成机器码再运行,所以有解释。这也是为什么说Java“编译与解释并存”。

JVM、JRE和JDK的关系是什么?

引用数据类型和基本数据类型的关系?

Java中只有两种数据类型,基本数据类型和引用数据类型。

上图中基本数据类型后面的括号内容表示该类型占用的内存大小,单位是字节(byte)。
相同点。两种数据类型都是为了创建变量,都可以在创建变量后赋值;同时,两种数据类型本身都是一个地址。
不同点。数据在堆中开辟并保存后,基本数据类型直接指向该数据,地址所在处保存了数据;引用数据类型再次指向地址,地址所在处是一系列基本数据类型的地址,存在“二级跳”。

四个访问修饰符的区别?

public: 最大,都可见;protected: 其他包内不可见,其他包内的子孙类需要说明才知道可不可见;default (即什么也不写,有时也叫做friendly): 其他包内不可见;private: 最小,只有当前类中可见。 final、finally、finalize的区别?

从英语语法上,三者分别是形容词、副词和动词,也就是说翻译过来可以称作最后的、最终和最后定下来。

final:关键字,修饰变量、方法、类。修饰完就不可以改了。finally:作为异常处理的一部分,只能出现在try/catch语句中,表示这段语句最终一定要被执行。finalize:方法,属于Object类,该方法使得垃圾收集器将对象清除之前做必要的清理工作。 this关键字?

总的来说,this关键字是为了在构造函数中避免混淆提升效率的一个关键字,主要作用是给出指向,不能使用在普通方法中。

this.属性名

class Student {
    int rollno;
    String name;
    float fee;

    Student(int rollno, String name, float fee) {
        this.rollno = rollno;
        this.name = name;
        this.fee = fee;
    }
}

在上面的程序中,this.后面的是类中定义的属性rollno、name、fee,之所以加this是因为构造器中的参数和之前定义的属性重名了。如果此时不加this,那么new Student()时参数就不会传给对象。
因此要用this.区分。

this.方法

public class Dog {
    public void jump() {}
	public void run() {
	    this.jump();
}

在同一类中,如果一个方法想使用类中的另一个方法,那应该使用this.来指明。不过在这种情况中,this.也可以省略。

this();

这种情况是调用当前类的构造函数。

public class Student {
    String name;
    public Student() {
        this("张三");
    }
    public Student(String name) {
        this.name = name;
    }
    public void print() {
        System.out.println("姓名:" + name);
    }
    public static void main(String[] args) {
        Student stu = new Student();
        stu.print();
    }
}

输出结果为

姓名:张三

main()函数中在构造时没有给参数,所以调用无参的构造函数,而无参的构造函数中用this()方法重新调用有参的构造函数并给出默认参数“张三”,虽然程序在打印时就打出了参数信息。

static关键字?

static是“静止的”的意思。
static可以用来修饰变量和方法,被修饰的变量和方法可以在没有创建对象的情况下调用。static修饰的变量和方法从属于类,只在类初始化的时候被创建一次。普通变量和方法从属于对象。

static变量
在加载类的过程中,静态变量的内存就被分配完毕。静态变量可以任意被访问。
比如说一个学校里的学生信息,因为本身就是一个学校的,所以所有实例的学校信息就都是一样的。如果用普通变量来定义学校,那么每创建一个学生就会开辟存学校的内存,这是会产生大量浪费的。所以这种情况下,应该直接使用static来修饰学校。static方法
静态方法不能调用非静态变量。
因为静态方法在类初始化的时候就确定,此时还没有实例化对象,就还没有非静态的普通变量,故静态方法无法调用非静态变量。
接上刚刚的例子,如果想修改静态变量,那应该使用静态方法。
由于静态变量是共享的,所以一旦一个静态方法改变了静态变量的数值,那么之后使用该静态变量时使用的也是改变后的值。也就是说,不同的静态方法对静态变量的改变是可以积累的。static代码块
以下是静态代码块和非静态代码块的例子。二者都在某类中。
静态代码块可以在类的任何位置,在类初始化时所以静态代码块的内容都依次执行,且只执行一次。非静态代码块在类初始化时不执行,在创建对象时自动执行,在构造器之前执行。

static {
// 这就是静态代码块
}

{
//这就是非静态代码块
}
重写(override)和重载(overload)的区别?

重写就是子类继承父类的时候,子类将父类的某个方法重新写了一遍,需要保证方法名和参数都一样。
重载就是同一个方法名,但是参数不一样。在构造器中经常见到,比如说无参的一种构造,再来一个有参的构造,有参构造就是无参构造的重载。需要注意,重载不能根据返回值的不同来重载,必须通过参数的不同来重载。

抽象类与接口的关系?

抽象类很简单。类是对象的模板,那么抽象类就是类的模板。抽象类不能被实例化,只能被继承。

public abstract class Employee {}

抽象类实现起来就是在原来的class前加abstract。抽象类中可以有成员的方法的细节,也就是说抽象类内部可以是不抽象的。
接口是一种特殊的抽象类。接口是很多抽象类的集合。接口是接下来的类要实现什么功能的设定、标准、蓝图、行为规范。

public interface Person {    
   int age = 20; // 定义常量,默认加了且只能是public,final, static
   void getInfo(); // 声明方法,默认加了且只能是public,abstract
}

一个类可以继承多个接口,这也是解决java不能多次继承的一种方法。
蓝图在设定好之后,要用的时候要去实现,英文是implement,动词。

public class Student implements Person {
   public void getInfo(){
   //具体实现的程序
   }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749487.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号