校招Java基础

面向对象
什么是面向对象,你怎么理解,和面向过程的区别?

把数据及对数据的操作方法放在一起,作为一个相互依存的整体。
把每种事物都看成是整体,所谓整体就是由一系列属性和行为组成,例如人,你可以看成由胳膊,腿,等属性,组成的对象。跑和跳则可以看做方法。
面向对象:便于模块化,结构化。面向过程:着眼局部或者具体。

面向对象的三大特性?分别解释下?

封装:把数据和操作数据的方法封装起来,对数据的访问只能通过已定义的接口。
继承:从已有类得到继承信息创建新类的过程。
多态:分为编译时多态(方法重载)和运行时多态(方法重写)。
要实现多态需要做两件事:一是子类继承父类并重写父类中的方法,二是用父类型引用子类型对象。

重载和重写的区别?⭐️

重写是父类与子类之间多态性的体现,而重载是一个类的行为的多态性的体现

  • 重载,编译时多态,在一个类里面,方法名字相同,而参数不同。

  • 重写,也叫覆盖,运行时多态,重写发生在子类与父类之间
    两同:方法名,参数列表相同
    两小:返回值类型和声明异常类型,子类小于等于父类
    一大:访问权限,子类大于等于父类

Java跨平台原理

由源文件(.java)编译成字节码文件(.class),一次编译到处运行
虚拟机作用:将字节码文件解释成对应平台机器码并执行

Java和c++相比它的语言特点?Java单继承和c++多继承的好处坏处?

摒弃指针
单继承
自动内存管理

单继承:方便简洁
多继承:使用复杂麻烦

Java 类初始化采用什么顺序呢?

初始化父类中的静态成员变量和静态代码块

初始化子类中的静态成员变量和静态代码块

初始化父类中的普通成员变量和代码块,再执行父类的构造方法

初始化子类中的普通成员变量和代码块,再执行子类的构造方法

什么是构造函数?什么是构造函数重载?构造器能否被重写?

新对象被创建的时候会调用构造函数,每个类都有构造函数
可以为一个类创建多个构造函数,但是要保证每个构造函数都有唯一的参数列表。
不能

抽象类和接口有什么区别? 分别都在什么时候使用?什么情况下继承抽象类可以不用实现它的声明方法

相同点:都不能被实例化
不同点:

  1. 接口只有方法的定义,不能有方法的实现,java 1.8中可以用default或static定义方法体,而抽象类可以有定义与实现
    一个类可以实现多个接口,但只能继承一个抽象类。

  2. 接口强调特定功能的实现,而抽象类强调所属关系

  3. 接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public abstract的。

    抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号
    只需实现它的抽象方法

请说明类和对象的区别?
  • 类是对某一类事物的描述,是抽象的;
  • 对象是表示的一个具体的个体,是类的一个实例
异常
throw 和 throws 的区别?
  • throw:在方法体内部,表示抛出异常,由方法体内部的语句处理;throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例;
  • throws:在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理;表示出现异常的可能性,并不一定会发生这种异常。
异常和错误的关系

???

常见的异常类有哪些?

NullPointerException
ArrayIndexOutOfBoundsException
FileNotFoundException
SQLException
IOException
IndexOutOfBoundsExecption
IllegalArgumentException

&(按位与)和&&(短路与)的区别

&:无论左边表达式执行结果如何,都会执行右边
&&:左边不符合时,右边不执行

什么是JDK?什么是JRE?什么是JVM?

JVM是Java平台的基础,将字节码文件解释成对应平台机器码并执行

JDK:它能够创建和编译程序。它包含 JRE,还有编译器(javac)和工具(如 javadoc)。
JRE: 运行已编译 Java 程序,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。

super 关键字的作用?static关键字的作用?final关键字的作用?

子类中显式调用父类方法或变量,但是必须处于第一行

static 关键字可以用来修饰属性、方法、内部类、代码块;修饰的资源属于类级别,是全体对象实例共享的资源;

用来修饰一个引用
如果引用为基本数据类型,则该引用为常量,该值无法修改;
如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
修饰方法表示无法被重写
修饰类表示无法被继承

finally 是不是一定会被执行到?

不一定

  • 当程序进入 try 块之前就出现异常时,会直接结束,不会执行 finally 块中的代码;
  • 当程序在 try 块中强制退出时也不会去执行 finally 块中的代码,比如在 try 块中执行 exit 方法
八种基本数据类型和占用的大小⭐️

原始类型:byte(1),short(2),int(4),long(8),float(4),double(8),boolean,char(2)

包装类型

Boolean,Character,Byte,Short,Integer,Long,Float,Double

深拷贝和浅拷贝⭐️

浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

deep and shallow copy

新特性
Lambda 表达式

前提:接口有且只有一个方法须要重写

new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("The runable now is using!");
            }
}).start();
//用lambda
new Thread(() -> System.out.println("It's a lambda function!")).start();
反射机制
四种方式获取 Class 对象
  • 知道具体类的情况下可以使用:Class alunbarClass = TargetObject.class;
  • 通过 Class.forName()传入类的路径获取:Class alunbarClass1 = Class.forName(“cn.javaguide.TargetObject”);
  • 通过对象实例instance.getClass()获取:Employee e = new Employee();
    Class alunbarClass2 = e.getClass();
  • 通过类加载器xxxClassLoader.loadClass()传入类路径获取:class clazz = ClassLoader.LoadClass(“cn.javaguide.TargetObject”);
哪些地方用到了反射,它的优缺点

反射是框架设计的灵魂,
JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序
Spring框架中xml的配置模式

  • 优点: 运行期类型的判断,动态加载类,提高代码灵活度。
  • 缺点: 1,性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的 java 代码要慢很多。2,安全问题,让我们可以动态操作改变类的属性同时也增加了类的安全隐患。
String
String可以修改吗

不可改变类型,每次值发生改变,都会创建一个新的对象

StringBuilder和StringBuffer的区别⭐️

StringBuffer 线程安全(在append()方法上使用了synchronized) StringBuilder 执行效率高

常用的方法有哪些⭐️

indexOf():返回指定字符得索引
charAt():返回指定索引处得字符
repalce():字符串替换
trim():去除字符串两端的空白
split():分割字符串 返回分割后的字符串数组
getBytes():返回字符串的 byte 类型数组
length():返回字符串的长度
toLowerCase():字符串转小写
toUpperCase():字符串转大写
substring():截取字符串
equals():字符串比较

final修饰 StringBuffer 后还可以 append 吗

可以,final 修饰的是一个引用变量,那么这个引用始终指向这个对象,但这个对象内部的属性是可以改变的

String 字符串修改实现的原理

当 String 修改字符串的时候会创建一个 StringBuilder 对象,调用 append 方法,最后通过 toString 方法返回

String str = new String(“abc”)创建几个对象

首先要看常量池里是否有“abc”这个字符串,如果有,则创建一个,如果没有,则创建两个

i++线程安全吗
Object类的常见方法⭐️

getClass()//native方法,用于返回当前运行时对象的Class对象,使用了final关键字修饰,故不允许子类重写。
hashCode()//native方法,用于返回对象的哈希码,主要使用在哈希表中,比如JDK中的HashMap。
equals()//用于比较2个对象的内存地址是否相等,String类对该方法进行了重写用户比较字符串的值是否相等。
clone()
toString()
notify()
notifyAll()
wait()
finalize()//实例被垃圾回收器回收的时候触发的操作

什么是值传递和引用传递

值传递:传递的是变量的一个副本,改变副本不影响原变量

引用传递:传递的是对象地址的一个副本,对引用对象操作影响原变量

== 比较的是什么

是对象的的话就比较引用
基本数据类型的话,则比较值是否相等

Java 的泛型是如何工作的 ? 什么是类型擦除 ?

泛型使得数据的类型可以通过参数传递过来,它提供了一种扩展能力,更符合面向对象思想。
当具体的类型确定之后,泛型还提供了类型检测机制,不符合的类型不允许赋值,否则编译不通过。
所以类型擦除就是在进入 JVM 之前,与泛型相关的信息会被擦除掉,这些信息被擦除后,相应的类型就会被替换成泛型类型参数的上限,如果没有指定,则替换成 Object。

有哪些IO类

按数据类型分

  • 字节流InputStream、OutputStream(可通过缓冲流BufferedInputStream和BufferedOutputStream提升性能)
  • 字符流Reader、Writer(可通过BufferedReader和BufferedWriter提升性能)

将a.txt文件中的单词与b.txt文件中的单词交替输出到控制台

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值