1、java跨平台
源代码(.java) ----编译器---》 字节码文件(.class) ----JVM---》 对应的机器码
不同平台需要安装不同的JVM,JVM是由C/C++开发的软件
 
2、一个java文件可以有多个类吗(不包含内部类)?
可以有多个类,但是只能有一个public类,如果这个public类存在,这个类必须和java文件同名
 
3、Java访问权限
private:可以被该类的内部成员访问
default:可以被该类内部成员,以及同一包下的其他类访问
protected:可以被该类的内部成员,以及同一包下的其他类,以及它的子类访问
public:可以被任意包下,任意类所访问
此外,修饰类时,只有default和public两种访问权限
 
4、java的数据类型
有基本数据类型和引用数据类型两种。
基本数据类型可以分为4类。整数型(byte, short, int, long),浮点型(float, double),
字符型(char),布尔型(boolean)。其中,整型的int 和 浮点的double 最常用。
另外,除了布尔类型,其他7个类型均可看成是数字类型,他们之间可以进行类型转换。
引用类型就是对一个对象的引用。可以分为3类:数组、类和接口。实际上就是一个指针。
 
5、常见数据类型的范围
byte:1字节(8位),范围:-2^7 ~ 2^7-1
short:2字节(16位),范围:-2^15 ~ 2^15-1
int:4字节(32位),范围:-2^31 ~ 2^31-1
long:8字节(64位),范围:-2^63 ~ 2^63-1
float:4字节(32位),范围:-2^31 ~ 2^31-1
bouble:8字节(64位),范围:-2^63 ~ 2^63-1
char:2字节(16位),范围:-2^15 ~ 2^15-1
boolean:不同的JVM有不同的实现机制
 
6、全局变量和局部变量
成员变量:
1)在类范围内定义
2)有默认初始值
3)未被static修饰叫实例变量,存储于对象所在的堆内存,生命周期于对象相同
4)被static修饰叫类变量,存储于方法区中,声明周期于类相同
局部变量:
1)定义在方法中
2)没有默认初始值
3)存储于栈内存中,作用范围结束,自动释放空间
另外Java中没有真正的全局变量
 
7、实例变量的默认初始值
byte/ short/ int: 0
long: 0L
float: 0.0F
bouble: 0.0
char: '\u0000'
boolean: false
适用于所有成员变量,类变量
 
8、为什么要包装类
java是面向对象的语言。而8种基本数据类型不具备对象的特性,Java为每个数据类型提供一个对应的引用类型,这就是包装类。
 
9、自动装箱、自动拆箱
JDK1.5
自动装箱:基本数据类型 直接赋值给 对应的包装类型
自动拆箱:对应的包装类型 直接赋值给 基本数据类型
 
10、Integer 和 Double 类型判断相等
不能直接比较(==、转字符串、compareTo方法)
Integer 和 Double 都属于Number类型,可以先转化为相同的基本数据类型,如用doubleValue()方法
 
11、int 和 Integer的区别,==比较的结果
int是基本数据类型,Integer是int的包装类。
二者在进行“==”运算时,Integer会自动拆箱成int类型,再进行比较
 
12、面向对象的理解和三大基本特征
基本特征:封装、继承、多态
封装:将对象的细节隐藏起来,通过一些公用的方法来暴露该对象的功能
继承:子类可以获得父类的属性个方法,实现软件复用
多态:子类对象可以直接赋值给父类变量
理解:从先世界的客观存在的事务出发来构建软件,并在系统构建时尽量运用人类的思维方式,强调直接以客观事物为中心来思考,并根据这些事物的特性抽象表示为系统中的类。
 
13、结构化设计 和 面向对象设计
结构化设计,也称面向功能的程序设计或面向数据流的程序设计。结构化程序设计采用自顶向下设计。最小单元为函数。每个函数都是具有输入、输出的子系统。
结构化设计的局限性:
1)设计不够直观,不符合人类思维。
2)适应性差,可扩展性不高。
 
14、封装的目的
封装是面向对象编程语言对客观事物的模拟,将对象的状态信息隐藏在对象内部,外界无法直接操作和修改。对一个类和对象的良好封装可以实现一下目的:
1)隐藏类的实现细节;
2)让使用者只能通过预定的方法来访问数据,从而限制对成员变量的不合理访问;
3)可以进行数据检查,保证对象信息的完整性;
4)便于修改,提高代码的可维护性;
 
15、多态的理解
Java允许把一个子类直接赋值给一个父类引用变量,无需进行类型转换,也成为向上转型(由系统自动完成)。当把一个子类赋值给父类引用对象,该对象在编译时类型是父类,运行时是子类。这就可能出现:相同类型的变量,调同一个方法时,呈现出多种不同的行为特征,这就是多态。
多态可以提高代码的可扩展性,和解耦合性。
 
16、多态的实现
多态的实现离不开继承。在设计程序时,可以把参数的类型设置为父类型;在调用程序时,传入父类型的子类实例对象。父类型可以有3种形式:普通类、抽象类和接口。子类需要根据自身的需求重写父类的方法。
 
17、java为什么是单继承,不能多继承
Java单继承是指,一个类只能有一个直接的父类。Java不能多继承则是说一个类不能直接继承多个父类。单继承的目的是避免出行混淆的情况。
尽管一个类只能有一个直接继承类,但是可以有多个间接父类。
 
18、重写和重载的区别
重写发生在父类子类中,子类对父类方法进行重写,要求方法名、参数列表必须与父类相同。返回值和抛出异常要<=父类,权限要>=父类。子类不能对private修饰的方法进行重写。
重载发生在同一个类中,方法名相同,参数列表不同的方法形成重载关系。
 
19、构造方法能不能重写
不能。重写要求方法名和参数列表一致,这与构造函数的要求不一致。
 
20、Object类
常用方法:
1)Class<> getClass():
2)boolean equals():
3)int hashCode():
4)String toString():
 
 
21、hashCode() 和 equals()
hashCode()用于取哈希码,equals()用于判断2个对象是否相等
两个对象相等,则两个对象的哈希码相等;
但是,两个对象的哈希码相等,则它们未必相等
 
22、为什么要重写hashCode() 和 equals()
在Object类中,equals()使用“==”来进行比较,也就是说只有比较对象为同一对象才会返回true。而在实际业务中,往往2个不同的对象拥有相同的内容。这就需要对equals()进行重写。
同时,hashCode() 和 equals()具有联动关系,对equals()重写时,hashCode()也需要重写。
 
23、== 和 equals()有什么区别
==:
1)作用于基本数据类型时,比较两者数值是否相同
2)作用于引用数据类型时,比较两个对象的地址是否相同
equals():
1)没有重写时,Object默认以“==”进行比较,比较两个对象的地址
2)重写后,则比较两个对象的内容
 
24、String的常用方法
  • char charAt(int index):返回指定索引处的字符;
  • String substring(int beginIndex, int endIndex):从此字符串中截取出一部分子字符串;
  • String[] split(String regex):以指定的规则将此字符串分割成数组;
  • String trim():删除字符串前导和后置的空格;
  • int indexOf(String str):返回子串在此字符串首次出现的索引;
  • boolean startsWith(String prefix):判断此字符串是否以指定的前缀开头;
  • boolean startsWith(String prefix):判断此字符串是否以指定的前缀开头;
  • String toUpperCase():将此字符串中所有的字符大写;
  • String toLowerCase():将此字符串中所有的字符小写;
  • String replaceFirst(String regex, String replacement):用指定字符串替换第一个匹配的子串;
  • String replaceAll(String regex, String replacement):用指定字符串替换所有的匹配的子串。
 
25、String可以被继承吗
不能。String被final修饰。
 
26、String和StringBuffer的区别
String是不可变类,一旦被创建,包含在这个对象里的字符序列是不可改变的,直到对象被销毁;
StringBuffer代表一个字符序列可变的字符串,在StringBuffer创建后,可以通过append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。
 
27、使用new和“”创建字符串的区别
使用“hello”创建字符串,JVM会使用常量池来管理这个字符串
使用new String("hello")创建字符串,JVM首先会使用常量池来管理这个字符串,在创建一个新的String对象出来保存在堆内存中
 
28、字符串拼接
1)+:字符串直接量
2)StringBuilder:字符串中包含变量,且不要求线程安全
3)StringBuffer:字符串中包含变量,且要求线程安全
4)concat()方法:只是对两个字符串进行拼接,并且包含变量
 
29、字符串相加的底层实现
1)字符串直接量相加,则编译器会直接将其优化成一个完整的字符串,和直接写一个字符串一样
2)字符串中包含变量,则编译器采用StringBuilder对其优化,自动创建StringBuilder实例并调用append方法。
 
30、接口和抽象类的区别
1)设计目的:
接口是一种规范,规定了实现者要提供什么服务,调用者如何调用服务。对于一个程序中的多个模块,接口是各个模块的耦合标准。对于多个应用程序,接口是它们之间的通信标准;
抽象类是一种模板式设计。抽象类作为多个子类的父类,是系统实现的中间产物,完成了系统的部分功能,但仍需要继续完善。
2)使用方式:
1. 接口不能有普通方法的实现;而抽象类可以
2. 接口中只能定义静态常量,不能有普通成员变量;而抽象类两者都可以
3. 接口中不包含构造;抽象类可以定义构造器,但只用于让子类完成对抽象类的初始化
4. 接口中不能包含初始化块;抽象类可以
5. 一个类可以继承多个接口,但只能友谊和直接父类,包括抽象类。
 
31、面向接口编程的理解
接口体现的是一种设计规范和实现分离的设计哲学。利用接口,可以很好的降低系统中各个模块的耦合度,从而提高系统的可扩展性和可维护性。
 
32、异常如何处理
try --- catch --- finall
1、捕获异常:将业务代码块包裹在try块内部,当业务中发生任何异常时,系统会为此创建一个异常对象。之后,JVM会在try块之后寻找处理它的catch块,并将异常对象交给catch处理。
2、处理异常:在catch块中,先记录日志,以便日后追溯这个异常。然后根据异常的类型、结合当前的业务,进行相应的处理。
3、回收资源:如果业务在try中打开了某个资源,可以在finall块中关闭这些资源,如数据库连接、网络连接、磁盘文件等。
 
33、Java的异常机制
1)异常处理:
异常处理语句是:try --- catch --- finall。将业务代码放在try块中,运行过程中捕捉异常并在catch中处理,finally负责回收资源。
2)抛出异常:
当程序出现异常时,系统会自动抛出异常。此外,系统也允许程序主动抛出异常。业务代码可以使用throw关键字向外抛出异常。
3)异常跟踪栈:
 
34、Java的异常接口
1)Throwable是异常的顶层父类,代表所有的非正常情况。它有两个直接子类,分别是Error、Exception。
2)Error是错误,一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此不需要用try---catch和throw捕获和抛出
3)Exception是异常,它被分为两大类,分别是Checked异常和Runtime异常。Java认为Checked异常都是可以被处理(修复)的异常,所以Java程序必须显式处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误,无法通过编译。Runtime异常则更加灵活,Runtime异常无须显式声明抛出,如果程序需要捕获Runtime异常,也可以使用try...catch块来实现。
 
35、在finally中return会发生什么
在通常情况下,不要在finally块中使用return、throw等导致方法终止的语句,一旦在finally块中使用了return、throw语句,将会导致try块、catch块中的return、throw语句失效。
 
36、static关键字的理解
以static修饰的成员就是类成员。类成员属于整个类,而不属于单个对象。
规则:类成员(包括成员变量、方法、初始化块、内部类和内部枚举)不能访问实例成员(包括成员变量、方法、初始化块、内部类和内部枚举)。
 
37、 static修饰的类能不能被继承?
可以被继承。
扩展:
如果static修饰一个内部类,则这个类属于外部类本身,而不属于某个实例对象。因此使用static修饰的内部类也称为类内部类、静态内部类。
static关键字的作用是把类的成员变成类相关,而不是实例相关。
静态内部类的规则:
1. 静态内部类可以包含静态成员,也可以包含非静态成员;
2. 静态内部类不可以访问外部类的实例成员,只能访问它的静态成员;
3. 外部类的所有方法、初始化块都能访问其内部定义的静态内部类;
3. 外部类的外部也可以实例化静态内部类,语法
外部类.内部类 变量名 = new 外部类.内部类();
 
38、static 和 final 的区别
static关键字可以修饰成员变量、成员方法、初始化块、内部类,被static修饰的成员都是类的成员,属于类而不是某个实例对象:
1. 类变量:被static修饰的成员变量是类变量(静态变量)。类变量属于类,存储在方法区,不随对象存储在堆中,类变量可以直接通过类名访问;
2. 类方法:被static修饰的成员方法是类方法(静态~~)。类方法可以直接通过类名访问;
3. 静态块:被static修饰的初始化块是静态初始化块。静态初始化块属于类,在类加载的时候被隐式调用一次,之后不会被调用;
4. 静态内部类:被static修饰的内部类是静态内部类。
final关键字可以修饰类、方法、变量:
1. final类:final修饰的类不可以被继承
2. final方法:final修饰的方法不可以被重写
3. final变量:final修饰的变量一旦被初始化就不能被修改
 
38、泛型的理解
泛型,即“参数化类型”。允许程序在创建集合时制定集合元素的类型。目的是为了解决在使用集合时避免杂乱地使用Object变量和强制类型转化,使代码更具安全性和可读性。
 
39、泛型擦除
在严格地泛型代码里,带泛型声明的类总应该带类型参数。但为了与老版本的java对应,也允许在使用带泛型声明的类不指定实际的参数类型。此时被称作原始类型。
 
40、Java反射机制
首先要理解2个概念:编译期和运行期。Java程序中的对象在运行时可以表现为编译时类型和运行时类型。例如Person p = new Studet(); 在编译时p为Person类型,运行时为Student类型。反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够调用其属性和方法。简单来说就是程序在运行时能够动态的获取自身的信息。
 
41、反射的运行场景
1. 使用JDBC时,需要通过反射机制加载数据库的驱动类
2. 多数框架都支持XML配置,从配置中解析出来的类是字符串,需要反射机制实例化
3. 面向切面编程(AOP)的实现,是在程序运行时创建目标对象的代理类,这必须由反射机制来完成
 
42、四种引用方式
1. 强引用:最常见。即创建一个对象并赋值给一个引用变量,程序通过引用变量来操作实际的对象。当一个实例对象被一个以上的引用变量引用时,处于可达状态,不能被垃圾回收机制回收。
2. 软引用:当一个对象只有软引用时,当系统内存不足时,会被垃圾回收机制回收。经常使用于对内存敏感的程序中。
3. 弱引用:在垃圾回收机制运行时,弱引用引用的对象一定会被收回。
4. 虚引用:虚引用完全类似于没有引用。主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使使用,必须与引用队列联合使用。
 posted on 2022-06-06 09:34  Slothhh  阅读(136)  评论(0编辑  收藏  举报