Day01
1.JDK,JRE,JVM三者之间的关系
JDK是Java的工具包,它包含jre,jre中包含jvm
2.为什么要配置环境变量,如何配置
为了能够在任意盘符下运行Java文件;先复制JDK所在的文件地址,右键此电脑点击属性,选择高级系统设置,环境变量里面的系统变量,新建JAVA_HOME,将地址粘贴,然后点击path,新建%JAVA_HOME%/bin,点击确定
3.常用的命令行有哪些(至少写出4个)
mkdir rd del cd exit
4.请描述基于记事本编写程序的步骤
新建txt文件,后缀改成.java,编辑代码,在相应盘符下输入cmd,javac 文件名.java进行编译,然后java 文件名,回车运行
5.请描述程序的执行过程
编写—>编译成字节码文件—>通过JVM运行
6.请描述你理解的注释
对所写代码的解释说明
7.请描述你理解的标识符
在java中凡是可以自己命名的都叫标识符,有26个英文字母,下划线_,数字和$组成
在命名时,需满足标识符命名规范,数字不能开头、不能包含保留字和关键字、不能包含空格,建议15个字符以内,满足见名知意,驼峰规则
8.请描述你理解的变量
用声明的方式将数值存储下来供程序使用,并且值可以根据需求发生改变
9.请描述常用的数据类型有哪些
整型:byte(1字节) short(2字节) int(4字节) long(8字节)
浮点型:float(四字节) double(八字节)
字符类型:char(2字节)
Boolean型(1字节)
引用数据类型
10.请描述int类型做"/"运算时有哪些注意事项
当操作数都为整数类型时,结果一定为整数类型
当操作数都为整数类型时,但计算结果结果为小数,最终的结果也要取整数。
当操作数有一个是小数时,结果也要取小数。
11.请描述"%"做取余运算时有哪些注意事情
取两个数相除的余数,结果正负号与被取模(取余)正负号相同。
当操作数都为整数类型时,结果一定为整数类型
当操作数都为整数类型时,但计算结果结果为小数,最终的结果也要取整数。
当操作数有一个是小数时,结果也要取小数
12.请描述"++"的作用及前置++和后置++的区别
++表示自增1
前置++表示先自增一,然后再运算
后置++表示先运算再自增1.
13.请描述标识符的命名规则
由26个英文字母,数字0-9,下划线_,美元符号$组成
字母不能开头,不能使用关键字和保留字,但能包含关键字和保留字。
标识符不能包含空格
14.请描述数据类型存在的意义
因为数据是有明确的类型划分的,为了确保变量保留的数据其类型的唯一性,要使用数据类型进行变量的修饰。
15.请描述在使用变量时的注意事项
变量名不可重复使用,定义变量需要赋值,否则无法使用。
定义Long类型时,为防止整数过大,在末尾加L
定义float类型时,为防止类型不兼容,在后面加F
16.请描述/n、/t的作用
/n表示换行,/t表示空格
17.请描述赋值运算符+=和=的区别
+=是前面加上后面的数的和,=是把后面的值赋给前面
18.请描述三目运算符的使用场景
二选一或者多选一
19.请描述实现从键盘输入的步骤
导包、创建scanner的实例对象:Scanner scanner = new Scanner(System.in);
将输入的值赋值给变量:int a = scanner.nextInt:
20.源文件名是否必须与类名相同?如果不是,那么什么情况下,必须相同?
否,前面有public修饰时,必须相同
21.程序中若只有一个public修饰的类,且此类含main方法。那么类名与源文件名可否不一致?
否,必须一致
22.为什么要设置path(或者说,设置path的目的是什么)?
为了能够在任意文件位置运行Java文件
23.问题:System.out.println()和System.out.print()什么区别呢?
前者输出完毕后会换行。
Day02
1.请描述你理解的循环
按照一定的次数执行程序,直到达到次数上线,将重复的代码只编写一次,然后反复执行
2..请描述嵌套for循环执行的过程
初始值—>终止条件—>循环体—>更新—>终止条件—>循环体—>更新。。。
3..请描述你理解的数据类型
数据都是有明确的类型划分的,为确保变量保留的数据的类型的唯一性,要使用数据类型对变量进行修饰。
4.请描述你理解的数据类型的转换
等号两边数据类型不一致时,要进行数据类型转换,小的数据类型转化成大的数据类型会发生自动数据类型转换,大的转化成小的要进行强制数据类型转换,在数据前加(数据类型)或者在数据后面加要转化的数据类型的首字母。
5.请简述你对程序流程控制结构的理解
需求不同时就会出现多种流程控制,有顺序结构、选择结构、循环结构。
6.请简述选择结构的分类及每一种分类的使用场景
二选一时使用if else 多选一时使用if elseif elseif else,等值匹配时使用switch case
7.看图说话
1.无输出
2.能,结果时a
8.判断
bcd e
5、哪个选项和show()方法重载
class Demo{
void show(int a,int b,float c){}
}
A.void show(int a,float c,int b){}//yes
B,void show(int a,int b,float c){}//一模一样。不可以出现在同一个类中。
C.int show(int a,float c,int b){return a;}//yes。
D.int show(int a,float c){return a;}//yes
6、方法重载(overload)必须满足__bce______
A. 在不同class中定义的方法 B.在同一类型中定义的方法
C. 方法名必须相同 D.返回类型必须相同
E. 参数一定不同 F.参数可以相同
7、写出输出结果
class Demo{
public static void main(String[] args){
int x = 1;
for(show('a'); show('b') && x<3; show('c')){
show('d');
x++;
}
}
public static boolean show(char ch){
System.out.print(ch);
return true;
}
}
//答案:
abdcbdcb
Day03
1.请简述你对面向对象的理解
找一个对象帮助我们做事情(万物皆为对象),用虚拟思想去模拟现实生活
2、请简述你对类和对象的理解
对象是一类事物的具体体现,对象就是类的一个具体实例,对象具备该类事物的属性和行为。
类是事物相关属性和行为的集合,可以看成是一类事物的模板,使用事物的属性特征来描述该类事物。
3、类由什么组成?
由类的属性和方法
4、什么是类?什么是对象?类与对象的关系是什么?
对象是一类事物的具体体现,是类的一个具体实例,具备该类的属性和方法。
类是事物相关属性和行为的集合。
类是对,对象的抽象表示,对象是类的一个实例
5、请简述对象的内存分配过程
类的属性存放在栈中,方法存放在方法堆里,当创建该类的实例对象的时候,内存会在堆空间里开辟一个地址,里面存放对象的属性和方法
Day04
1.请简述你对static关键字的理解?
static表示静态的
可以修饰属性、方法、代码块、内部类以及实现静态导入
在类中声明的变量,称为属性或者叫做成员变量、或者叫做字段。那么属性面前如果加入static关键字修饰,称为静态变量,也叫做类的变量,类变量是全局变量,是共享数据。
如果属性前面没有编写static关键字,称为实例变量,也叫做对象变量
修饰方法,称为静态方法也叫做类方法
修饰代码块,称为静态代码块
静态导入,import static package.ClassName.变量名;
2.请简述静态块和非静态块的区别?
静态代码块用static修饰,静态代码块不需要我们人为的调用执行,因为没有名字。当类加载到内存时,执行静态代码块,并且只执行一次。并且在构造器执行之前
非静态代码块在创建对象时执行,在静态代码块执行之后构造方法之前执行。
3.请简述你对单例设计模式的理解?
只能创建一个对象,分为饿汉式和懒汉式分别为:
饿汉式:
public class Hungry{
private Hungry(){
}
private static Hungry h = new Hungry();
public static Hungry getInstance(){
return h;
}
}
懒汉式:
public class Lazy{
private Lazy(){
}
private static Lazy lazy;
public static Lazy getInstance(){
if(lazy == null){
private Lazy = new Lazy();
}else{
return lazy;
}
}
}
4.请谈谈你对引用数据类型的理解
数据都是有明确的类型划分的,为了保证变量存储的数据的类型的唯一性所以要用数据类型修饰。
5.请谈谈你对参数传递过程的理解
主要分为值传递和地址传递
值传递:传递对象的一个副本,即使副本被改变,也不会影响源对象,因为值传递的时候,实际上是将实参的值复制一份给形参。
引用传递:传递的并不是实际的对象,而是对象的引用,外部对引用对象的改变也会反映到源对象上,因为引用传递的时候,实际上是将实参的地址值复制一份给形参。
说明:对象传递(数组、类、接口)是引用传递,原始类型数据(整形、浮点型、字符型、布尔型)传递是值传递。
6、请描述你对变量分类的划分
按照数据类型划分:
按照声明位置划分:
局部变量:在方法中声明
成员变量:在方法外面即在类中声明的变量,称为成员变量也叫做属性。
7、请简述你对封装的理解?
封装就是隐藏类的内部信息(属性和方法),不允许外部程序直接访问,而是通过公有的方法才能完成访问(赋值方法get()和取值方法set()),就是利用private关键字去修饰属性或者方法 ,被private关键字去修饰的属性或者方法只能在本类中被访问。
8、请简述你对构造方法的理解?
构造方法是一个特殊的方法,主要特殊点如下
构造方法的名字与类的名字一致
它不声明返回值类型。(与声明为void不同)
不能被static、final、synchronized、abstract、native修饰,
不能有return语句返回值
构造方法声明格式:
public 类名(参数1,参数2,参数3){
}
作用:完成对属性的赋值
9、请简述你对构造方法重载的理解?
在同一个类中至少出现2个或者2个以上的参数列表必须不同的构造方法,这里的参数列表包括参数的个数、参数类型、参数类型顺序三要素,三要素若仅有一要素不同,那么就构成方法的重载。
10、请谈谈你对this关键字的理解
在同一个类中,局部变量的名字可以和成员变量的名字是可以相同的,不报错,但是局部变量优先,也就是:就近的优先,如果非要访问成员变量,则必须使用this
"this"关键字用于引用当前对象,区分成员变量和局部变量,调用其他构造方法以及传递当前对象给其他方法。
11、请谈谈你对static关键字的理解
12、什么是局部变量和全局变量?
静态变量对于类而言在内存中只有一个,能被类的所有实例所共享。
实例变量对于类的每个实例都有一份,它们之间互不影响。
13、下列关于变量的叙述哪个是错的( c)
A、实例变量是类的成员变量
B、在方法中定义的局部变量在该方法执行时被创建
C、实例变量用关键字static声明
D、局部变量在使用前必须进行初始化
14、阅读程序给出答案
public class Test1 { public static void main(String[] args) { new A(new B()); } } class A{ public A(){ System.out.println("A"); } public A(B b){ this(); System.out.println("AB"); } } class B{ public B(){ System.out.println("B"); } } |
答案: BAAB |
Day05
1.Java类是否可以多继承,怎么实现多继承?
不能,通过接口、内隐类,继承、实现,互相配合,达到多继承的效果
2.写出重载与重写的区别?
重载是同名不同参,重写是建立在继承的基础上,子类对父类方法的重写
3.读程序给出结果
class Demo{
int show(int a,int b){return 0;}
}
下面那些函数可以存在于Demo的子类中。A
A.public int show(int a,int b){return 0;}
B.private int show(int a,int b){return 0;}
C.private int show(int a,long b){return 0;}
D.public short show(int a,int b){return 0;}
E.static int show(int a,int b){return 0;}
4.为什么要重写toString()方法?
为什么要重写toString ()方法 在Object类里面定义toString()方法的时候返回的对象的哈希code码,这个hashcode码不能简单明了的表示出对象的属性。 所以要重写toString()方法。 当需要将一个对象输出到显示器时,通常要调用他的toString ()方法,将对象的内容转换为字符串.java中的所有类默认都有一个toString ()方法。
5.Overload的方法是否可以改变返回值的类型?
可以
6.this与super的区别
7.在静态方法中是否可用this来调用本类的类方法?
不可以
8.请谈谈你对代码块的理解
代码块是一种常见的代码形式。它用大括号“{}”将多行代码封装在一起,形成一个独立的代码区,这就构成了代码块。分为静态代码块(用static修饰)和匿名代码块
9.请再谈谈你对变量的理解
10.请写出空指针异常的名字(英文),并描述其产生的原因
Exception in thread "main" java.lang.NullPointerException
产生原因:对象为空,但是引用这个对象的方法
11.基本数据类型和引用数据类型有什么区别?
1.基本数据类型是存储数据的简单类型,而引用数据类型是存储对象的引用或地址。
2.基本数据类型在内存中分配固定的空间,而引用数据类型在内存中分配一个地址,实际数据存储在另外的位置。
3.基本数据类型是直接存储在栈(stack)中的,而引用数据类型在栈中存储的是一个地址,这个地址指向堆(heap)中的实际数据。
4.基本数据类型有8种:byte、short、int、long、float、double、char、boolean,而引用数据类型有类(class)、接口(interface)、数组(array)、枚举(enum)等。
5.基本数据类型是直接存储值,而引用数据类型是存储指向对象的引用。
6.基本数据类型的默认值是0或false,而引用数据类型的默认值是null。
7.基本数据类型的传递是按值传递,而引用数据类型的传递是按引用传递。换句话说,基本数据类型的值在传递时是复制的,而引用数据类型的值在传递时是引用的副本。
Day06
1..请描述你对多态的理解
描述一个事物的多种形态,多态体现为父类引用变量可以指向子类对象。
前提条件:必须有子父类关系
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法
2.类似:两个对象a和b,请问a==b和a.equals(b)有什么区别?
a==b :比较的是两个对象的地址值是否一致
a.equals(b):重写之前比较的是两个对象的的地址值相当于==;重写之后比较的是a和b各个属性的值
1.请描述你对多态的理解
描述一个事物的多种形态,多态体现为父类引用变量可以指向子类对象。
前提条件:必须有子父类关系
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法
2.类似:两个对象a和b,请问a==b和a.equals(b)有什么区别?
a==b :比较的是两个对象的地址值是否一致
a.equals(b):重写之前比较的是两个对象的的地址值相当于==;重写之后比较的是a和b各个属性的值
3、以下代码如何优化
if(username.equals(“admin”){ .... } |
答案圈①if(username != null && username.equals(“admin”)){ }②if(admin.equals(”username”)) |
Day07
2、请描述abstract class 和interface的区别?
4.1相同点
都不能创建对象,其实:抽象类和接口都是多态的一种形式
抽象类和接口中都可以编写抽象方法
子类或实现类都必须要重写抽象类或接口中的所有的抽象方法,否则子类或实现类就是抽象类
4.2不同点
抽象类
使用abstract关键字
抽象类中包含:普通类中包含的所有内容,也可以包含抽象方法
子类继承抽象类,并且是单继承
抽象类的出现就是为了统一标准,但是有单继承局限
接口
使用interface关键字
在JDK8.0中,接口包含:抽象方法(默认有public abstract)、公有静态常量(默认有public static final)、public static修饰的方法、public default修饰的方法
实现类实现接口,并且是多实现
接口的出现是为了统-标准,同时没有单继承局限
接口也弥补了Java单一继承的弱点,也就是类可以实现多个接口。
3、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口,实现类可以同时实现多个接口。
抽象类可以实现接口,从而提供接口方法的具体实现。
抽象类可以继承实体类,以复用实体类的功能,并且可以在抽象类中添加新的抽象方法或具体方法。
4、请描述你理解的模板方法设计模式?
模板设计模式在一个方法中定义了一个算法的基本结构,而将一些步骤的具体实现留给子类来完成。这样,子类可以在不改变算法结构的情况下,重新定义某些步骤的具体实现,以实现不同的行为。
适用场景:
多个子类有共同的行为,但其中某些步骤的实现可能不同。
有一个算法的框架,其中的某些步骤需要延迟到子类中实现。
需要复用一些代码,将算法的公共部分放在抽象类中,将可变部分留给子类实现。
注意事项:
在设计模板方法模式时,需要合理划分算法的不变部分和可变部分,确保算法的骨架在抽象类中,而具体实现留给子类。
确保子类实现的抽象方法不会改变算法的结构,否则就破坏了模板方法设计模式的原则。
Day08
1、Java能动态分配数组吗?
可以
2、我怎么知道数组的长度?
通过数组的length属性
3、数组有没有length()这个方法? String有没有length()这个方法
数组没有length()这个方法,只有length属性;String有length()方法
4.请描述冒泡排序的思想
重复地遍历待排序的元素列表,比较相邻的元素,并交换它们的位置,直到整个列表按照指定的顺序排列。
5.请描述数组的初始化方式
静态初始化:
静态初始化是在声明数组的同时进行初始化,指定数组的元素值。静态初始化使用花括号({})将元素值括起来,并用逗号(,)分隔不同的元素值。
动态初始化:
动态初始化是在声明数组时仅指定数组的长度,而不指定元素的值。后续可以使用索引来逐个为数组元素赋值。
6、请描述数组中可能会出现的异常
空指针异常(NullPointerException):
当试图访问一个空引用的数组元素时,即数组对象为null,会导致空指针异常。
数组下标越界异常(ArrayIndexOutOfBoundsException):
当试图访问数组中不存在的索引位置时,即索引超过数组的长度或小于0,会导致数组下标越界异常。
非法数组大小异常(NegativeArraySizeException): 当试图创建一个非法大小(负数)的数组时,会导致非法数组大小异常。
类型转换异常(ClassCastException):
当试图将一个不兼容的类型转换为数组的元素类型时,会导致类型转换异常。
7、请描述你理解的对象数组
可以通过创建对象数组来存储对象的引用。每个数组元素都指向一个具体的对象,这些对象可以是用户自定义的类的实例,也可以是Java内置的类(如String、Integer等)的实例。
8、请描述数组的扩容机制
数组的扩容是通过创建一个新的更大的数组,然后将原始数组中的元素复制到新数组中来实现的。
9、请描述基本类型数组元素的删除过程
找到要删除的元素位置:首先需要确定要删除的元素在数组中的位置(索引),通常通过遍历数组来查找。
移动元素:将要删除元素后面的所有元素向前移动一个位置,覆盖要删除的元素。
更新数组长度:由于基本类型数组的长度是固定的,删除元素后会产生一个空位置。因此,需要使用一个特定的值(如0对于整型数组)填充空位置,或者通过将数组的最后一个元素复制到空位置来保持数组的连续性。
10.请描述你理解的动态数组
动态数组是一种可以动态调整大小的数组数据结构。与传统的静态数组不同,动态数组可以在需要时自动扩容或缩减,以适应不同数量的元素
11、请描述你理解的数组拷算法思想
确定源数组和目标数组:首先需要确定源数组和目标数组,源数组是要被拷贝的数组,目标数组是拷贝后的结果数组。
确定拷贝范围:确定要拷贝的元素范围,通常指定源数组的起始位置(源数组的索引)和要拷贝的元素个数。
进行元素复制:通过遍历源数组的指定范围,将元素逐个复制到目标数组中相应的位置。
12、请描述你理解的数组反转算法思想
确定数组的中心位置:对于数组长度为 n,中心位置为 n/2。这里 n 是数组的长度,如果数组长度为奇数,则中心位置为中间元素,如果数组长度为偶数,则中心位置为中间两个元素的前一个元素。
使用一个循环进行交换:从数组的两端开始,依次交换首尾元素,然后逐渐向中心靠拢,直到两个指针相遇。在交换时,可以使用一个临时变量来暂存交换过程中的元素。
13、请描述你理解的数组查找算法思想
线性查找(顺序查找):从数组的第一个元素开始逐个遍历数组元素,直到找到目标元素或遍历完整个数组。这是最简单直观的查找方法,但在最坏情况下的时间复杂度为O(n),其中n是数组的长度。
二分查找(折半查找):二分查找要求数组是有序的。该算法先确定数组的中间元素,然后与目标元素进行比较。如果中间元素等于目标元素,则查找成功;如果中间元素大于目标元素,则在左半部分继续查找;如果中间元素小于目标元素,则在右半部分继续查找。通过不断缩小查找范围,二分查找可以在最坏情况下的时间复杂度为O(log n)内找到目标元素。
Day09
1.请描述你理解的二维数组
1. 二维数组就是用来存储一维数组的数组
2. 二维数组的存储数据类型是引用数据类型(一维数组是引用数据类型)。
3. 二维数组是有明确的行,列之分的。
2.请描述二维数组的遍历过程
通过双层嵌套for循环完成二维数组的遍历。
外层循环控制行,内层循环控制列
3.请描述快速排序算法的排序思想
(1) 从待排序的序列中挑选出一个基准元素(往往是数列中的第一个值)
(2) 将数列中所有比基准元素小的元素摆放在基准元素的左侧,所有比基准元素大的元素摆放在基准元素的右侧(相同的元素可以到任一边);
(3)按上述步骤((1)(2)),再对这左右两部分序列分别进行快速排序,直至整个序列变成有序序列。
4.请描述快速排序算法的代码实现过程
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
private static void quickSort(int[] arr, int leftIndex, int rightIndex) {//0 7
//未在合法索引范围内进行快排,直接return结束排序
if (leftIndex >= rightIndex) {
return;
}
int left = leftIndex;//左指针-0
int right = rightIndex;//右指针-7
//待排序序列中的第一个元素作为基准元素(也就是索引为0的元素-arr[0])
int key = arr[left];//key-基准元素
//从左右两边交替扫描,直到left = right 进行基准元素的归位
while (left < right) {//0 7
//从右往左扫描,找到第一个比基准值小的元素
while (right > left && arr[right] >= key) {
right--;
}
//找到比基准元素小的元素,将该元素arr[right]放入坑中(原有索引为0的位置)arr[left]中
arr[left] = arr[right];
//从左往右扫描,找到第一个比基准值大的元素
while (left < right && arr[left] <= key) {
left++;//1
}
//找到这种元素将arr[left]放入arr[right]中
arr[right] = arr[left];
}
//基准值归位
arr[left] = key;
//对基准值左边的元素进行递归排序
quickSort(arr, leftIndex, left - 1);
//对基准值右边的元素进行递归排序。
quickSort(arr, right + 1, rightIndex);
}
5.运行时异常与一般异常有何异同
二者都是Exception的父类
(1)运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等。 (2)一般异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。 (3)运行时异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
6.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会在return执行之前执行,finally中即使改变ruturn的值,最后ruturn返回的值也不改变
7.error和exception有什么区别
Error:通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;
Exception:通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
8.请仔细阅读下列测试代码,请问如何处理才能使程序正常输出“这是个异常,不是错误”,并且不会报告任何错误或者异常信息?
public class Test{
public static void main(String[] args) {
int[] arr ={1,1,1,1};
for(int i = 0 ; i < 5;i++){
System.out.println(arr[i]);
}
System.out.println("这是个异常,不是错误");
}
}
9.请描述你理解的try-catch-finally