java中的事物-java中spring框架中aop
一、Java基本概念
1.1 Java源程序的扩展名是什么?
.java
1.2 什么是标识符?
在java语言中,我们可以命名自己的标识符。
1.3 标识符有什么特点?
标识符由大小写字母、数字字符、$和_组成,不能以数字开头,不能是java关键字,区分大小写
1.4 请解释环境变量Path和classpath的区别
path 是系统用来指定可指定文件的完整路径。 Path 用于搜索执行的可执行文件的路径。 如果执行的可执行文件不在当前目录下,则依次查找path中设置的路径。
类路径指定您在程序中使用的类 (.class) 文件所在的位置。
1.5 java程序编译后生成的字节码文件的扩展名是什么?
字节码文件扩展名为.class
1.6 请命名并解释常用的DOS命令?
1.7 请解释一下Java语言的跨平台特性?
Java 语言跨平台运行。 实际上,不同的操作系统使用不同的JVM映射规则,使其独立于操作系统,完全跨平台。 JVM不关心上层的Java源文件,它只关心源文件生成的类文件。
1.8 请解释JDK、JRE、JVM的区别?
2.Java基础
2.1 评论的分类和作用是什么?
2.2 请告诉我Java中数据类型的分类? 有哪些基本数据类型?
引用数据类型
2.3 Java中有多少种数据类型转换? 这些是什么?
2.4 Java语言中的字符char可以存储汉字吗? 为什么?
char类型变量用来存储Unicode编码的字符,而unicode编码的字符集中包含汉字,所以char类型变量可以存储汉字。 但是,如果unicode编码的字符集中没有包含一个特殊的汉字,那么这个特殊的汉字就不能存储在char变量中。
补充说明:unicode编码占两个字节,所以一个char类型的变量也占两个字节。
2.5请解释&&和&的区别?
&和&&都可以作为逻辑与运算符,即逻辑与(与)。 当运算符两边表达式的结果都为真时,整个运算结果为真; 否则,只要其中之一为假,则结果为假。
&&还有短路的作用,即如果第一个表达式为假,则不再对第二个表达式求值
& 也可以用作按位运算符。 当 & 运算符两边的表达式都不是布尔类型时, & 表示按位与运算。
2.6 请解释==和=的区别?
2.7 三元运算符的基本格式是什么?
三元运算符的格式为:条件表达式? 表达式 1 : 表达式 2
2.8 三元运算符的执行流程是怎样的?
三元运算符的执行过程:首先计算条件表达式的值,看返回结果是真还是假java中的事物,如果为真,则执行表达式1,如果为假,则执行表达式2
2.9 使用键盘输入数据的三个步骤是什么?
2.10 请解释for、while、do...while 三种循环的格式和执行流程,以及它们的区别。
while循环语句格式
while (判断条件语句) {
循环体语句;
}do...while循环语句格式
做 {
循环体语句;
}while((判断条件语句);三种循环语句的区别
注意:写程序时,优先考虑for循环,然后考虑while循环,最后考虑do...while循环
2.11 定义方法的格式是什么,方法的注意事项?
2.12 private关键字用在什么地方? private修饰的成员有什么特点?
当类的成员需要私有时使用 private 关键字
特征:
是权限修饰符。
可以修改成员(成员变量和成员方法)
private修饰的成员只能在本类访问
2.13 为什么会有this关键字? 这个关键字是什么意思?
this用来解决成员变量和局部变量重名的问题
this关键字表示该类的对象引用; 谁叫我,这代表谁。
2.14 final关键字是什么意思,可以修改哪些成员? 修改成员有什么特点?
final 最终的意思。
特征
2.15 当形式参数是基本类型时需要什么? 当它们是类名、抽象类名、接口名时,它们需要什么?
形参是基本类型,需要的是基本类型的变量或者具体的常量值
2.16 基本类型返回的返回值类型是什么? 返回的类名、抽象类名、接口名是什么?
当返回值是基本数据类型时,返回具体的值
2.17 包有什么作用?
package,包的意思,其实就是一个文件夹,可以对类进行分类管理
2.18 导入的作用是什么?
不同包下的类互相访问时,发现每次使用不同包下的类,都需要加上包的全路径。 比较麻烦。 这时候java就提供了(import)导入包的功能。
使用 import 导入包中的类。 以后使用该类时,不需要导入包,直接使用,简化了编写。
2.19 请解释==和equals()方法的区别?
== 解释
== 对基本类型和引用类型的影响是不同的,如下:
代码示例:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
代码解读:因为x和y指向同一个引用,==也是true,重写了new String()方法开辟了内存空间,所以==的结果是false,equals总是比较值,所以结果都是真的。
等于解释
equals本质上就是==,但是String和Integer重写了equals方法,变成了值比较。 看下面的代码就明白了。
先看默认的equals是比较一个具有相同值的对象,代码如下:
class Cat {
public Cat(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat c1 = new Cat("mbb");
Cat c2 = new Cat("mbb");
System.out.println(c1.equals(c2)); // false
输出结果出乎我们的意料,是假的? 怎么回事,可以看equals的源码,源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
事实证明,equals 本质上就是 ==。
那么问题来了,为什么两个相同值的String对象都返回true呢? 代码如下:
String s1 = new String("mbb");
String s2 = new String("mbb");
System.out.println(s1.equals(s2)); // true
同样的,当我们进入String的equals方法时,我们找到了答案,代码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
原来String重写了Object的equals方法,将引用比较改为值比较。
总结:==对于基本类型是值比较,对于引用类型是引用比较; 而equals默认是引用比较,但是很多类re-equals方法,比如String,Integer等,把它变成Value比较进行,所以一般情况下equals比较的是值是否相等。
2.20 请简要描述什么是泛型? 它们的用途是什么? 它们在哪里使用?
泛型的常见应用
2.21 如何编写接受泛型参数并返回泛型类型的泛型方法?并举例说明
泛型方法是指在方法上定义泛型,用泛型来代替原始类型
public static T[] sort(T[] t){
Arrays.sort(t);
return t;
}
2.22 请简述Java中如何使用泛型编写带参数的类?并举例说明
泛型类是指在类上定义泛型,用泛型代替原始类型
class GenericClass {
private T t;
public void setT(T t) {
this.t = t;
}
public T getT() {
return t;
}
}
2.23 请说说文件名过滤器FilenameFilter的作用?
FilenameFilter是文件名过滤器,用于过滤不符合规则的文件名,返回符合条件的文件。
2.24 请简述什么是递归? 有什么注意事项?
所谓递归,就是程序调用自己。
注意递归不会无限调用,它必须有出口,满足条件程序才会结束,否则就是死循环。
2.25 如果两个对象的hashCode()相同,那么equals()也一定为真,对吧?
不是,两个对象的hashCode()是一样的,equals()不一定为真。
代码示例:
String str1 = "通话";
String str2 = "重地";
System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));
执行结果:
str1:1179395 | str2:1179395
false
代码解读:很明显,“call”和“heavy place”的hashCode()是一样的,但是equals()是false,因为在哈希表中,hashCode()是相等的,也就是hash值相等两个键值对的 of 相等,但是 ha 值相等,并不一定代表键值对相等。
2.26 什么是数学。 Java 中的 round(-1.5) 等于?
等于-1,因为数轴取值时,中间值(0.5)向右舍入,所以正0.5向上舍入java中的事物,负0.5直接舍弃。
3.Java变量
3.1 请写下Java标识符的命名规则
方法或变量:常量
全部大写
3.2 什么是变量?
变量是一个量,其值可以在程序运行时修改。
3.3 变量的定义格式是什么?
数据类型变量名=变量值
3.4 成员变量和局部变量有什么区别?
3.5 静态变量和成员变量有什么区别?
4.Java字符串
4.1 字符串s = "a"+"b"+"c"; 创建了多少个对象,它们是什么?
因为字符串的特点是一旦创建,就无法更改。 添加常量时,会创建一个新的字符串对象,最后将字符串“abc”的常量值赋值给引用变量s
4.2 如何实现StringBuffer与String的转换?
通过String类的构造方法 通过StringBuffer类中的toString()方法 通过StringBuffer类中的substring()方法(注:不常用)
String转StringBuffer的方法:通过StringBuffer类的构造函数通过StringBuffer类的append()和insert()方法
4.3 如何实现String与int数据的转换
String – Integer – int 通过 Integer 类的 intValue() 方法 通过 Integer 类的 parseInt(String s) 方法
Int转String的方法: Int - Integer - String Integer的toSting()通过String类的valueOf()方法和Integer类的toSting(int i)方法连接字符串""
4.4 如何实现【基本数据类型】和【基本数据封装类】的相互转换
通过包装类的构造函数通过包装类的静态方法valueOf()
包装类转换为基本数据类型的方式:通过包装类的方法xxxValue()
4.5 请解释String和StringBuffer的区别?
String类表示一个字符串,其内容不可改变
StringBuffer类表示一个字符串,其内容可以被修改
4.6 请解释StringBuffer和StringBilder的区别?
4.7 什么是正则表达式?
正则表达式使用单个字符串来描述和匹配一系列符合一定语法规则的字符串。 在许多文本编辑器中,正则表达式通常用于检索和替换与特定模式匹配的文本。
4.8 Date和long如何相互转换?
4.9 Date和String如何相互转换?
字符串至今
4.10 String是基本数据类型吗?
字符串不是基础类型
有8种基本类型:
并且 String 属于对象
4.11 String str="i" 和 String str=new String("i") 一样吗?
不一样,因为分配内存的方式不一样。 String str="i",Java虚拟机会分配给常量池; while String str=new String("i") 会分配到堆内存。
4.12 如何反转字符串?
使用 StringBuilder 或 stringBuffer 的 reverse() 方法。
示例代码:
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System. out. println(stringBuilder.reverse()); // gfedcba
4.13 String类的常用方法有哪些?
5.Java类、抽象类、接口、内部类、代码块
5.1 什么是类? 对象是什么?例如
相关属性和行为的集合是抽象的东西,对象是这个类的具体体现。
例子:一个学生就是一个班级,每个学生都是一个学生的具体体现,所以每个学生都是一个学生。
5.2 类由什么组成?
一个类由成员变量和成员方法组成
成员变量对应事物的属性(即事物的固有信息,例如:人的属性包括身高、姓名、年龄、学历……),成员方法对应行为(行为:是事物可以做的事情,如:人的行为包括:吃饭、睡觉……)
5.3 什么是匿名对象? 什么时候使用匿名对象?
匿名对象是指:没有名字的对象
使用匿名对象:
a:调用该方法,仅当它只被调用一次时
b:匿名对象可以作为实参传递
5.4 构造方法的作用是什么? 施工方法有什么特点? 施工方法注意事项? return语句可以写在构造方法中吗?
构造方法的作用是给类的成员变量赋值,完成类的初始化
5.5 类的默认构造函数可以有参数吗?
类的默认构造函数没有参数
5.6 请解释在一个对象的创建过程中做了什么?
学生 s = new Student();
将Student.class字节码文件加载到栈内存中,开辟一块空间存放s变量,用于记录Student对象在堆内存中的引用,开辟一块空间存放Student对象的成员信息加载类中的new Student()对象 静态成员执行类中的静态代码块 加载对象中的普通成员 执行构造代码块 执行构造方法 将new Student()的地址赋值给s变量
5.7 子父类中构造方法的执行有什么特点? 为什么?
默认情况下,子类的所有构造函数都会访问父类中的空参数构造函数。
因为子类会继承父类中的数据,也可能会使用到父类的数据。 因此,在子类初始化之前,必须先完成父类数据的初始化。
每个构造方法的第一条语句默认为:super() 如果父类中没有空参数的构造方法,则通过以下方式解决
> 注意:super(…) 或 this(…) 必须出现在第一条语句上,否则会出现父类数据的多次初始化
5.8 静态代码块、构造代码块、构造方法的执行顺序和执行特点是什么?
先执行所有静态代码块,再执行所有构造代码块,最后执行构造方法。 静态代码块只执行一次,构造代码块和构造方法每创建一个对象就执行一次。
5.9 什么是抽象类及其特点?
5.10 抽象类中是否有构造函数,如果有,是做什么用的?
抽象类虽然不能被实例化,但是抽象类中有一个构造函数,用于子类访问父类的数据时进行初始化。
5.11 接口中的成员变量和成员方法有什么特点?
接口中的成员变量都是常量,有默认的访问修饰符:
public static final
接口中的成员方法都是抽象方法,有默认的访问修饰符:
public abstract
5.12 请说说类与类、类与接口、接口与接口的关系和特点?
5.13 抽象类和接口有什么区别?
会员差异
施工方法
有成员方法
它可以是抽象的或非抽象的接口:
关系差异
设计理念差异
5.14 内部类的访问特点是什么?
内部类可以直接访问外部类的成员,包括私有外部类。 要访问内部类的成员,首先要创建一个内部类对象
5.15 匿名内部类的格式是什么? 它的本质是什么?
5.16 抽象类必须有抽象方法吗?
不,抽象类不必有抽象方法。
示例代码:
abstract class Cat {
public static void sayHi() {
System.out.println("hi~");
}
}
上面代码中,抽象类没有抽象方法但是可以正常运行。
5.17 抽象类可以用final修饰吗?
不是的,定义一个抽象类是为了让其他类继承。 如果定义为final,类不能被继承,会造成相互冲突,所以final不能修饰抽象类
6.封装、继承、多态
6.1 请解释什么是方法重载?
方法重载是指在同一个类中,允许存在多个同名方法,只要它们的参数个数或参数类型不同即可。
方法重载的特点:
a) 与返回值类型无关,只看方法名和参数列表
b) 调用时,虚拟机通过参数列表的不同来区分同名方法
6.2 使用面向对象【封装】有什么好处?
隐藏实现细节并提供公共访问方法;
改进代码的可重用性;
提高安全性。
6.3 Java中类的继承特点和继承注意事项有哪些?
继承的特点:在Java语言中,类继承只支持单继承,不支持多继承。 但是多层继承是可以的。
继承注意事项:
子类只能继承父类的非私有成员。 子类不能继承父类的构造函数,但是可以通过super访问父类的构造函数。 不要对某个功能使用继承。
6.4 继承有什么好处?
改进代码维护提供代码可重用性创建类之间的关系,这是多态性的前提
6.5 this和super是什么,各自的应用场景是什么?
6.6 什么是方法重写? 需要注意哪些问题?
方法重写:是指在子类中出现与父类相同的方法声明,也称为方法覆盖、方法重写
需要注意的问题:
1. 父类中私有方法不能被重写
2. 子类重写父类方法时,访问权限不能更低
3. 父类静态方法,子类也必须通过静态方法进行重写。(其实这个算不上方法重写,但是现象确实如此)
6.7 方法覆盖和重载有什么区别?
6.8 什么是多态,多态的前提是什么?
一个事物在不同时间的状态就是多态
多态性的先决条件:
6.9 多态中成员(成员变量、成员方法、静态成员方法)的访问特性有哪些?
6.10 多态有什么好处?
提供代码的可维护性(由继承保证)和代码的可扩展性(由多态性保证)。 这个特性也反映了多态性最常见的应用,即作为参数传递。
6.11 多态的缺点是什么,如果想访问子类特有的功能怎么办?
多态的缺点,不能访问子类中特有的功能
如果我们仍然想使用特定于子类的功能,我们需要使用向下转型
> 向下转换:就是将父类的引用强制转换为子类的引用。 在向下转型的过程中,需要注意一个异常:ClassCastException
7.Java 容器
7.1 创建数组有多少种方法? 这些是什么?
2种。 动态创建和静态创建。
7.2 请简述集合与数组的异同点?
收集:
大批:
7.3 什么是迭代器Iterator? 如何使用? 有什么特点?
Iterator 接口提供了一个用于遍历任何 Collection 的接口。 我们可以使用 iterator 方法从 Collection 中获取迭代器实例。 迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。
迭代器使用代码如下:
List list = new ArrayList<>();
Iterator it = list.iterator();
while(it.hasNext()){
String obj = it.next();
System.out.println(obj);
}
Iterator的特性更安全,因为它可以保证当前遍历的集合元素发生变化时,会抛出ConcurrentModificationException。
7.4 请简述常用的数据结构?
7.5 请简述ArrayList、Vector、LinkedList的特点?
数组列表
底层数组结构
向量
底层数组结构
链表
底层链表结构
7.6 请简述ArrayList、Vector、LinkedList,它们在什么时候使用?
线程安全
向量
不是线程安全的
7.7 请简述并发修改异常的原因? 怎么解决?
异常
并发修改异常
> 迭代器在迭代过程中,集合中的元素个数发生了变化,导致并发修改异常。
解决方案
增加和删除元素的操作是通过列表迭代器自带的方法完成的。 通过for循环遍历集合,使用集合中的方法完成元素的增删改查。
7.8 请简要描述List