




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java笔试面试题: 1.类的定义格式: 修饰符 class 类名 类的主体; 2.方法声明的基本格式: 修饰符 返回值类型 方法名(参数类型 参数名, .) 定义变量; 定义方法; 3.局部变量与成员变量的区别:成员变量有默认值,而局部变量没有; 4.Java的判断条件结果必须是一个布尔值; 5.this关键字和super关键字分别代表什么?以及他们各自的使用场景和 作用。 this:代表当前类的对象引用 super:代表父类存储空间的标识。(可以理解为父类的引用,通过这个 东西可以访问父类的成员) 应用场景: A:调用成员变量 this.成员变量 调用本类的成员变量 super.成员变量 调用父类的成员变量 B:调用构造方法 this(.) 调用本类的构造方法 super(.) 调用父类的构造方法 C:调用成员方法 this.成员方法 调用本类的成员方法 super.成员方法 调用父类的成员方法 6.权限修饰符: 本类 同一个包下(子类和无关类) 不同包下(子类) 不同包下 (无关类) private Y 默认 Y Y protected Y Y Y public Y Y Y JAVA的事件委托机制和垃圾回收机制: java 事件委托机制的概念,一个源产生一个事件并将它送到一个或多个 监听器那里。在这种方案中, 监听器简单的等待, 直到它收到一个事 件。 一旦事件被接受, 监听器将处理这个事件,然后返回。 垃圾回收机制 垃圾收集是将分配给对象但不再使用的内存回收或释放 的过程。如果一个对象没有指向它的引用或者其赋值为null,则次对象 适合进行垃圾回收 7.控制跳转语句: break:中断 continue:继续 return:返回 break:中断的意思 使用场景: A:switch语句中 B:循环语句中。 (循环语句中加入了if判断的情况) 注意:离开上面的两个场景,无意义。 如何使用呢? A:跳出单层循环 B:跳出多层循环 要想实现这个效果,就必须知道一个东西。带标签的语 句。 格式: 标签名: 语句 wc:for(int x=0; x3; x+) nc:for(int y=0; y4; y+) if(y = 2) break wc; System.out.print(*); System.out.println(); continue:继续 使用场景: 循环中。离开此场景无意义。 测试,找到和break的区别: break:跳出单层循环 continue:跳出一次循环,进入下一次的执行 练习题: for(int x=1; x 2); /6 System.out.println(-24 2); /-6 System.out.println(-24 2); /1073741818 详细分析: 计算出3的二进制:11 00000000 00000000 00000000 00000011 (00)000000 00000000 00000000 0000001100 计算出24的二进制11000 00000000 00000000 00000000 00011000 0000000000 00000000 00000000 000110(00) 计算出24的二进制:11000 原码:10000000 00000000 00000000 00011000 反码:11111111 11111111 11111111 11100111 补码:11111111 11111111 11111111 11101000 11111111 11111111 11111111 11101000 1111111111 11111111 11111111 111010(00) 补码 补码:1111111111 11111111 11111111 111010 反码:1111111111 11111111 11111111 111001 原码:1000000000 00000000 00000000 000110 结果:-6 的移动: 计算出24的二进制:11000 原码:10000000 00000000 00000000 00011000 反码:11111111 11111111 11111111 11100111 补码:11111111 11111111 11111111 11101000 11111111 11111111 11111111 11101000 0011111111 11111111 11111111 111010(00) 结果:1073741818 /* 面试题: 请自己实现两个整数变量的交换 */ class OperatorDemo public static void main(String args) int a = 10; int b = 20; System.out.println(a:+a+,b:+b); /方式1:使用第三方变量(开发中用的) int c = a; a = b; b = c; System.out.println(a:+a+,b:+b); System.out.println(-); /方式2:用位异或实现(面试用) /左边:a,b,a /右边:a b a = a b; b = a b; /a b b = a a = a b; /a b a = b System.out.println(a:+a+,b:+b); /方式3:用变量相加的做法 a = a + b; /a=30 b = a - b; /b=10 a = a - b; /a=20 System.out.println(a:+a+,b:+b); /方式4:一句话搞定 b = (a+b) - (a=b); /b=30-20=10,a=20 System.out.println(a:+a+,b:+b); /* 练习: 获取两个整数中的最大值 获取三个整数中的最大值 比较两个整数是否相同 */ public class OperatorTest public static void main(String args) /获取两个整数中的最大值 int x = 100; int y = 200; int max = (x y? x: y); System.out.println(max:+max); System.out.println(-); /获取三个整数中的最大值 int a = 10; int b = 30; int c = 20; /分两步: /A:先比较a,b的最大值 /B:拿a,b的最大值再和c进行比较 int temp = (a b)? a: b); /System.out.println(temp); max = (temp c? temp: c); System.out.println(max:+max); /一步搞定 /int max = (a b)?(a c)? a: c):(b c)? b: c); /这种做法不推荐。 /int max = a b?a c? a: c:b c? b: c; /System.out.println(max:+max); System.out.println(-); /比较两个整数是否相同 int m = 100; int n = 200; boolean flag = (m = n); System.out.println(flag); If语句与三目运算符的区别: 由于if语句的第二种格式刚才也完成了三元运算符可以完成的效果。 所以,我们就认为他们可以完成一样的操作。 但是,他们就一点区别没有吗?肯定不是。 区别: 三元运算符实现的,都可以采用if语句实现。反之不成立。 什么时候if语句实现不能用三元改进呢? 当if语句控制的操作是一个输出语句的时候就不能。 为什么呢?因为三元运算符是一个运算符,运算符操作完毕 就应该有一个结果,而不是一个输出。 面试题: 字符参与运算 是查找ASCII里面的值 a 97 A 65 0 48 System.out.println(a); /a System.out.println(a + 1); /98 字符串参与运算 这里其实是字符串的连接 System.out.println(hello+a+1); /helloa1 System.out.println(a+1+hello); /98hello System.out.println(5+5=+5+5); /5+5=55 System.out.println(5+5+=5+5); /10=5+5 24. 面试题: byte可以作为switch的表达式吗? /可以 long可以作为switch的表达式吗? /不可以 String可以作为switch的表达式吗? /JDK7以后可以是字符 串 25. 面试题 静态代码块,构造代码块,构造方法的执行顺序? 静态代码块 构造代码块 构造方法 静态代码块:只执行一次 构造代码块:每次调用构造方法都执行 class Code /静态代码块 static int a = 100; System.out.println(a); /构造代码块 int x = 1000; System.out.println(x); /构造方法 public Code() System.out.println(code); /构造代码块 int y = 2000; System.out.println(y); /静态代码块 static int b = 200; System.out.println(b); public class CodeDemo public static void main(String args) /局部代码块 int x = 10; System.out.println(x); /找不到符号 /System.out.println(x); int y = 20; System.out.println(y); System.out.println(-); Code c1 = new Code(); System.out.println(-); Code c2 = new Code(); 输出结果: 10 20 - 100 200 1000 2000 code - 1000 2000 Code 看程序写结果: class Student static System.out.println(Student 静态代码块); System.out.println(Student 构造代码块); public Student() System.out.println(Student 构造方法); public class StudentDemo static System.out.println(你好,明天!); public static void main(String args) System.out.println(我是main方法); Student s1 = new Student(); Student s2 = new Student(); /*输出结果: 你好,明天! 我是main方法 Student 静态代码块 Student 构造代码块 Student 构造方法 Student 构造代码块 Student 构造方法*/ 问题:不仅要输出局部范围的num,还要输出本类成员范围的num,我还 想要输出父类成员范围的num。怎么办呢? class Father public int num = 10; class Son extends Father public int num = 20; public void show() int num = 30; System.out.println(num); System.out.println(this.num); System.out.println(super.num); class ExtendsDemo public static void main(String args) Son s = new Son(); s.show(); 数据初始化的面试题 A:一个类的初始化过程 B:子父类的构造执行过程 C:分层初始化 class Father public Father() System.out.println(Father的无参构造方法); public Father(String name) System.out.println(Father的带参构造方法); class Son extends Father public Son() /super(); System.out.println(Son的无参构造方法); public Son(String name) /super(); System.out.println(Son的带参构造方法); class ExtendsDemo public static void main(String args) /创建对象 new Son(); System.out.println(-); new Son(蒙蒙); /运行结果: /Father的无参构造方法 /Son的无参构造方法 /- /Father的无参构造方法 /Son的带参构造方法 看程序写结果: A:成员变量 就近原则 B:this和super的问题 this访问本类的成员 super访问父类的成员 C:子类构造方法执行前默认先执行父类的无参构造方法 D:一个类的初始化过程 成员变量进行初始化 默认初始化 显示初始化 构造方法初始化 class Fu public int num = 10; public Fu() System.out.println(fu); class Zi extends Fu public int num = 20; public Zi() System.out.println(zi); public void show() int num = 30; System.out.println(num); /30 System.out.println(this.num); /20 System.out.println(super.num); /10 class ExtendsTest public static void main(String args) Zi z = new Zi(); z.show(); 结果: fu zi 30 20 10 看程序写结果: A:一个类的静态代码块,构造代码块,构造方法的执行流程 静态代码块 构造代码块 构造方法 B:静态的内容是随着类的加载而加载 静态代码块的内容会优先执行 C:子类初始化之前先会进行父类的初始化 class Fu static System.out.println(静态代码块Fu); System.out.println(构造代码块Fu); public Fu() System.out.println(构造方法Fu); class Zi extends Fu static System.out.println(静态代码块Zi); System.out.println(构造代码块Zi); public Zi() System.out.println(构造方法Zi); public class ExtendsTest public static void main(String args) Zi z = new Zi(); /* 结果是: 静态代码块Fu 静态代码块Zi 构造代码块Fu 构造方法Fu 构造代码块Zi 构造方法Zi*/ 看程序写结果: A:成员变量的问题 int x = 10; /成员变量是基本类 型 Student s = new Student(); /成员变量是引用类型 B:一个类的初始化过程 成员变量的初始化 默认初始化 显示初始化 构造方法初始化 C:子父类的初始化(分层初始化) 先进行父类初始化,然后进行子类初始化。 问题: 虽然子类中构造方法默认有一个super() 初始化的时候,不是按照那个顺序进行的。 而是按照分层初始化进行的。 它仅仅表示要先初始化父类数据,再初始化子类数据。 class X Y b = new Y(); X() System.out.print(X); class Y Y() System.out.print(Y); public class Z extends X Y y = new Y(); Z() /super(); System.out.print(Z); public static void main(String args) new Z(); 结果: YXYZ 面试题: package,import,class有没有顺序关系? 有。 package import class Package:只能有一个 import:可以有多个 class:可以有多个,以后建议是一个 面试题: 局部内部类访问局部变量的注意事项? A:局部内部类访问局部变量必须用final修饰 B:为什么呢? 局部变量是随着方法的调用而调用,随着调用完毕而 消失。 而堆内存的内容并不会立即消失。所以,我们加final 修饰。 加入final修饰后,这个变量就成了常量。既然是常 量。你消失了。 我在内存中存储的是数据20,所以,我还是有数据在 使用。 面试题: 要求请填空分别输出30,20,10。 注意: 1:内部类和外部类没有继承关系。 2:通过外部类名限定this对象 Outer.this 成员内部类的面试题(填空) 控制台输出:30,20,10 class Outer public int num = 10; class Inner public int num = 20; public void show() int num = 30; System.out.println(num); System.out.println(this.num); System.out.println(Outer.this.num); class InnerClassTest public static void main(String args) Outer.Inner oi = new Outer().new Inner(); oi.show(); /匿名内部类面试题: /按照要求,补齐代码 /要求在控制台输出”HelloWorld” /* interface Inter void show(); class Outer /补齐代码 class OuterDemo public static void main(String args) Outer.method().show(); */ /答案: interface Inter void show(); /public abstract class Outer /补齐代码 public static Inter method() /子类对象 - 子类匿名对象 return new Inter() public void show() System.out.println(HelloWorld); ; class OuterDemo public static void main(String args) Outer.method().show(); /1:Outer.method()可以看出method()应该是Outer中的一个静 态方法。 /2:Outer.method().show()可以看出method()方法的返回值是 一个对象。 / 又由于接口Inter中有一个show()方法,所以我认为 method()方法的返回值类型是一个接口。 字符串的面试题(看程序写结果) =和equals()的区别? A:= 基本类型:比较的是值是否相同 引用类型:比较的是地址值是否相同 B:equals() 只能比较引用类型。默认情况下,比较的是地址值是 否相同。 但是,我们可以根据自己的需要重写该方法。 A:=和equals() String s1 = new String(hello); String s2 = new String(hello); System.out.println(s1 = s2);/ false System.out.println(s1.equals(s2);/ true String s3 = new String(hello); String s4 = hello; System.out.println(s3 = s4);/ false System.out.println(s3.equals(s4);/ true String s5 = hello; String s6 = hello; System.out.println(s5 = s6);/ true System.out.println(s5.equals(s6);/ true B:字符串的拼接 /* * 字符串如果是变量相加,先开空间,再拼接。 * 字符串如果是常量相加,是先加,然后在常量池找,如果有 就直 接返回,否则,就创建。 */ public class StringDemo public static void main(String args) String s1 = hello; String s2 = world; String s3 = helloworld; System.out.println(s3 = s1 + s2);/ false System.out.println(s3.equals(s1 + s2);/ true System.out.println(s3 = hello + world);/ false 这个我们错了,应该是true System.out.println(s3.equals(hello + world);/ true / 通过反编译看源码,我们知道这里已经做好了处 理。 / System.out.println(s3 = helloworld); / System.out.println(s3.equals(helloworld); 面试题: StringBuffer:同步的,数据安全,效率低。 StringBuilder:不同步的,数据不安全,效率高。 1:String,StringBuffer,StringBuilder的区别? A:String是内容不可变的,而StringBuffer,StringBuilder都是内容可 变的。 B:StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步 的,数据不安全,效率高 2:StringBuffer和数组的区别? 二者都可以看出是一个容器,装其他的数据。 但是呢,StringBuffer的数据最终是一个字符串数据。 而数组可以放置多种数据,但必须是同一种数据类型的。 3:形式参数问题 String作为参数传递 StringBuffer作为参数传递 形式参数: 基本类型:形式参数的改变不影响实际参数 引用类型:形式参数的改变直接影响实际参数 注意: String作为参数传递,效果和基本类型作为参数传递是一样的。 面试题 -128到127之间的数据缓冲池问题 注意:Integer的数据直接赋值,如果在-128到127之间,会直接从缓冲 池里获取数据 通过查看源码,我们就知道了,针对-128到127之间的数据,做了一个 数据缓冲池,如果数据是该范围内的,每次并不创建新的空间 注意: public class BigDecimalDemo public static void main(String args) System.out.println(0.09 + 0.01); System.out.println(1.0 - 0.32); System.out.println(1.015 * 100); System.out.println(1.301 / 100); System.out.println(1.0 - 0.12); /0.09999999999999999 /0.6799999999999999 /101.49999999999999 /0.013009999999999999 /0.88 面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集 合有没有length()方法呢? List:(面试题List的子类特点) ArrayList: 底层数据结构是数组,查询快,增删慢。 线程不安全,效率高。 Vector: 底层数据结构是数组,查询快,增删慢。 线程安全,效率低。 LinkedList: 底层数据结构是链表,查询慢,增删快。 线程不安全,效率高。 List有三个儿子,我们到底使用谁呢? 看需求(情况)。 要安全吗? 要:Vector(即使要安全,也不用这个了,后面有替代的) 不要:ArrayList或者LinkedList 查询多:ArrayList 增删多:LinkedList 如果你什么都不懂,就用ArrayList。 面试题: Collection和Collections的区别? Collection:是单列集合的顶层接口,有子接口List和Set。 Collections:是针对集合操作的工具类,有对集合进行排序和二分查找 的方法 1.Hashtable和HashMap的区别? Hashtable:线程安全,效率低。不允许null键和null值 HashMap:线程不安全,效率高。允许null键和null值 2.List,Set,Map等接口是否都继承子Map接口? List,Set不是继承自Map接口,它们继承自Collection接口 Map接口本身就是一个顶层接口 编译时异常和运行时异常的区别 编译期异常:Java程序必须显示处理,否则程序就会发生错误,无法通 过编译 运行期异常:无需显示处理,也可以和编译时异常一样处理 throws和throw的区别(面试题) throws 用在方法声明后面,跟的是异常类名 可以跟多个异常类名,用逗号隔开 表示抛出异常,由该方法的调用者来处理 throws表示出现异常的一种可能性,并不一定会发生这些异常 throw 用在方法体内,跟的是异常对象名 只能抛出一个异常对象名 表示抛出异常,由方法体内的语句处理 throw则是抛出了异常,执行throw则一定抛出了某种异常 finally关键字及其面试题 1:final,finally和finalize的区别 fin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年儿童辅导员面试流程与模拟题详解
- 2025年公共关系专员岗位素质测评试题及答案解析
- 2025年安全员面试资料及答案
- 课件不同步显示问题
- 2025年安全员C证考试重点题目解析
- 课件《宝葫芦的秘密》
- 2025年智能物业招聘面试题及解析
- 机电基础知识培训
- 初中语文教学课件运用
- 读懂彼此的心课件
- 矿山工程合同范本
- 商用中小型冷库知识培训课件
- 2025年黑龙江省水利水电集团有限公司招聘考试笔试试题(含答案)
- 抗战胜利八十周年纪念-2025-2026学年高二上学期爱国主义教育主题班会
- 银行理财规划配置方案(3篇)
- 2025-2030中国城市更新政策演变与实施路径专项调研报告
- 儿科川崎病课件
- 2025年书记员考试题库(附答案)
- 中成药合理使用培训课件
- 建筑材料绿色采购实施方案
- 学堂在线 劳动教育 章节测试答案
评论
0/150
提交评论