java笔试面试第一天
好久未曾启用我的博客,最近来上海找工作,想将笔试面试的过程做个记录,毕竟有总结才有提高嘛。今天算是笔试面试正式开始第一天吧,以下就是我的笔试总结(没有原题了,只有知识点):
笔试题1:java static对象的使用:包括静态方法,静态变量,静态代码块,main方法,构造器,普通成员方法等的执行顺序,以代码的形式展现吧。
public class TestMain { static {
System.out.println("执行静态代码块");
} public TestMain(){
System.out.println("执行构造方法");
} public static void main(String[] args) {
System.out.println("执行main方法");
System.out.println("第一次创建类的实例对象");
System.out.println("------------------");
new TestMain();
System.out.println("第二次创建实例对象");
System.out.println("------------------");
new TestMain();
System.out.println("第三次创建实例对象");
System.out.println("------------------");
new TestMain().printHello(); } static {
System.out.println("执行静态代码块2");
} {
System.out.println("代码块1");
} {
System.out.println("代码块2");
} public void printHello(){
System.out.println("执行普通方法"); {
System.out.println("执行普通方法里的代码块");
}
} }
以下是控制台打印结果:
总结:
1.类的静态代码块执行顺序先于main方法(不论声明位于main前还是main后),并且在类加载完成期间只执行一次。
2.类的普通代码块(相当于类的实例属性)在new实例的时候执行,并且顺序先于构造器,与普通成员方法一样,只有实例存在才能执行,与普通成员方法不一样的是,不显示调用就被执行。
3.被static修饰的方法叫静态方法,也叫类方法,是类被加载后就被存放于内存里的,并且只存一次(公共方法,静态变量同理),静态方法只能调用静态成员(方法与变量),不能调用非静态成员,是因为非静态成员在没有实例化之前是不存在的!所以同理,静态方法里不能出现this或者super;静态方法可以用:类名.方法名的方式调用,也可以用:对象.方法名的方式调用(不推荐)。
笔试题2:java 中 if ()语句,括号里需要的是boolean类型,if (0)是错误的,if语句后面没有花括号时,紧跟的第一句是判断之后是否执行的语句,与花括号内的语句作用相同。
@Test
public void testFor(){
if (false)
System.out.println("true");
System.out.println("false");
}
控制台打印:
笔试题3:一般for循环:for (int i = 0; true; i++),这种方式不会报错,会无限执行。for循环里的变量“i”作用域仅限后面的花括号(或者紧跟的第一条语句)。
笔试题4:变量的作用域问题:Java用一对大括号作为语句块的范围,称为作用域。下面是有成员变量的情况下变量作用域的代码分析:
public class TestScope {
private String name = "name1";
private static String num = "1"; public static void main(String[] args) { {
String name = "name2";
System.out.println(name); // name2
} // 作用域失效,所以下面的变量为“name”不会报错。 String name = "name3";
System.out.println(name); // name3 System.out.println(new TestScope().name); // name1 TestScope ts_1 = new TestScope();
ts_1.setName("name_mod");
System.out.println(ts_1.getName()); // name_mod System.out.println(new TestScope().name); // name1
System.out.println(new TestScope().getName()); // name1 // 静态成员变量--相当于共有变量,类加载后只存一次,即位置固定
TestScope ts_2 = new TestScope();
System.out.println(ts_2.getNum()); // 不推荐用对象调用静态成员 1
ts_2.setNum("2");
System.out.println(ts_2.getNum()); // 2
System.out.println(new TestScope().getNum()); //2
} public void setName(String name){
this.name = name;
} public String getName(){
return this.name;
} public static String getNum() {
return num;
} public static void setNum(String num) {
TestScope.num = num;
} }
控制台输出结果:
总结:以上代码也可以说明静态变量与普通成员变量的区别。普通成员变量的初始化值不能通过实例化对象的方法修改,因为每次生成一个新的对象,句柄指向的都是复制过来的新的成员变量,而不是指向真正的成员变量。通过反射进行修改。
笔试题5:java 重写问题:重写(Overriding)是子类与父类之间的多态性的体现,子类重写父类方法,要求:方法名、返回类型、参数表相同,访问权限大于等于父类。
注意:java重载(Overloading)是一个类多态性的体现,即同一个方法根据传参不同实现不同功能。要求:方法名相同,参数表(类型或者个数)不同(只能根据这两个条件判断是否重载,返回值与访问权限不能作为区分标准)。
笔试题6:java equals()方法与"=="的区别:"=="如果比较两个基本数据类型的时候,是比较数据值,但对于对象来说,"=="比较的就是对象(地址),equals()方法只能被对象调用来进行比较操作,它也是比较对象(地址),只是某些包装类里的equals()方法被重写了,所以看起来像是可以比较对象的值,比如String类就重写了这个方法,所以可以进行以下比较:
public static void main(String[] args) { String s1 = "a";
String s2 = "a";
String s3 = new String("a"); System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
System.out.println(s1.equals(s3)); // true
}
除了String重写了equals()方法外,大部分能用到的类库里的类都重写了,像Integer,Boolean,Float等包装类,还有Vector,Pair,List,HashMap,Collection,Enum,Set等等,如果自定义类需要用到equals()方法,是需要手动重写的,因为自定义类都继承了Object的类,而Object的equals()方法是没有重写过的,即:只能比较对象的地址,不能比较对象的值(可以看一下API里equals方法的代码)。
这里我也自己写了自定义类重写equals()方法的代码:如果两个对象都是TestString的对象,而且name与num的值都相等,则两个对象相等。
public class TestString { private String name;
private int num; /**
* 重写equals方法:如果是TestString的对象而且name与num的值都相等则两个对象相等
*/
public boolean equals(Object obj){
// 如果是对象自己与自己比较
if (this == obj){
return true;
}
// 如果对象为空,直接返回false
if (obj == null){
return false;
}
// 如果不是该自定义类的对象,直接返回false
if (!(obj instanceof TestString)){
return false;
}
TestString ts = (TestString) obj;
return this.num == ts.num && this.name == ts.name ;
} public static void main(String[] args) { TestString ts1 = new TestString();
ts1.setName("a");
ts1.setNum(1); TestString ts2 = new TestString();
ts2.setName("a");
ts2.setNum(1);
System.out.println(ts1 == ts2); // false
System.out.println(ts1.equals(ts2)); // true
System.out.println(ts1.equals(new String("a"))); // false
} public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
控制台输出:
总结:Object类里边有这几个方法:equals()、hashCode()、
笔试题7:String类创建对象的问题,这个问题说实话很让我头疼,从上学那会就对这个“String创建了几个对象”的问题搞的晕头转向,既然笔试到了,那么是时候来个了断了T_T
@Test
public void testAdd(){
String str1 = "a";
String str2 = "a";
String str3 = "b";
String str4 = "ab";
String str = new String("b");
final String str5 = "a";
final String str6; {
str6 = "a";
} String s1 = "a" + "b"; // 运行时没有生成新的对象,编译过的代码里已经存在 "ab",即str4
String s2 = str2 + str3; // 运行时生成了新的对象,s2编译过之后不能确定值
String s3 = str5 + "b"; // 运行时没有生成新对象,str5是常量,所以编译之后是"ab",即str4
String s4 = str6 + "b"; // 运行时生成了新对象,str6是变量,虽然在代码块里赋了值,但是这条语句编译时还是按变量来算的,只有运行后代码块才被执行 System.out.println(str1 == str2); // true
System.out.println(s1 == str4); // true
System.out.println(s2 == str4); // false
System.out.println(s3 == str4); // true
System.out.println(s4 == str4); // false
System.out.println(str3 == str.intern()); // true intern()方法:手动向常量池中添加常量,如果常量池已存在,直接返回地址
System.out.println(str1 == str6); //ture 说明只要是在代码里出现的,编译时都会被存进常量池里(已知字面量)。
}
总结:在代码中存在的变量的”赋值“叫“已知字面量”,这些已知字面量在编译后会被存到jvm的常量池中(常量池的问题有待深究),栈里存句柄(引用),堆里存数据,常量池里存常量数据,引用在指向数据的时候会先在常量池中查找,如果有,指向常量池的地址,如果没有从堆里找,这样来思考的话,在用"=="进行比较的时候就知道比较的地址是不是一样了。由于常量池里的数据如果存在就不会再复制,所以可以被多个引用指向,而指向同一个地址的引用 "==" 就是true。(仅仅是本人见解,有错误的地方欢迎指出)。
PS:以上说了半天好像是没有解决到底创建了几个对象的问题【捂脸】,例如:String a = new String("a"); 为什么是创建了两个对象呢? 我理解应该是这样的:字面量"a",在编译后于常量池创建了对象"a",然后程序运行后,在堆中又new了一个实例对象,所以是两个对象。
String a = "a" + "b" + "c" + "d"; 创建了一个对象,网上说法众多,但是我觉得其中一种说的有道理,就是因为它是一行定义的对象,编译时只会初始化一次常量池的数据,所以”abcd“是在常量池一次定义的对象。。。欢迎各路大神前来指导。
java笔试面试第一天的更多相关文章
- Java 笔试面试(6)异常处理
Java 笔试面试(6)异常处理 1. finally的代码何时执行? 问题描述:try{}里有一个return语句,那么在这个try后面的finally{}中的代码是否为执行?如果会,是在retur ...
- java笔试面试(转载)
Java面试笔试题大汇总(最全+详细答案) 2016-02-01 15:23 13480人阅读 评论(8) 收藏 举报 分类: Java面试题(1) 声明:有人说, 有些面试题很变态,个人认为其实 ...
- Java 笔试面试 算法编程篇 一
方法 1 /* ********************************************************************************** 1.编写一个程序, ...
- Java 笔试面试 基础篇 一
1. Java 基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法, 线程的语法,集合的语法,io 的语法,虚拟机方面的语法. 1.一个".java& ...
- java笔试面试01
今天给大家分享一下小布去广州华南资讯科技公司笔试和面试的过程. 过程:1.HR面试 2.笔试 3.技术面试 小布下午两点到达,进门从前台领了一张申请表,填完之后带上自己的简历到4楼就开始HR面试. ...
- Java笔试面试总结—try、catch、finally语句中有return 的各类情况
前言 之前在刷笔试题和面试的时候经常会遇到或者被问到 try-catch-finally 语法块的执行顺序等问题,今天就抽空整理了一下这个知识点,然后记录下来. 正文 本篇文章主要是通过举例的方式来阐 ...
- java笔试面试第二天
没想到第二次面试到了第二周,也是我在上海找工作的第二周,说实话,没有真本事找工作是真的难,虽然正在召开的十九大上,大大们纷纷表态国力正盛,经济稳步增长,就业压力逐渐缓解,但是社会终究是社会,要么靠实力 ...
- java笔试面试二
http://www.cnblogs.com/lanxuezaipiao/p/3371224.html
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
随机推荐
- 下载linux历史版本
http://blog.csdn.net/u012453843/article/details/52819756
- Eureka错误解决方法
# Eureka错误解决方法 ## security.basic.enabled 配置过时或不可用默认情况下:用户名:user密码:启动应用在控制台会输出,如下图: 也可以通过如下属性配置:sprin ...
- TensorFlow2.0(9):TensorBoard可视化
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- 使用IIS部署网站
使用IIS部署网站的步骤: IIS安装:控制面板->启用或关闭Windows功能->Internet信息服务->应用程序开发功能,勾选.net和asp相关的,和服务器端包含 ASP. ...
- fullpage.js报如下错的解决办法
控制台报错:fullPage: Fullpage.js version 3 has changed its license to GPLv3 and it requires a `licenseKey ...
- 使用 Hexo,Material Theme 以及 Github Pages 搭建个人博客
准备条件 Node.js npm Git GitHub账号 开始搭建 hexo init Blog cd Blog npm install hexo-deployer-git --save npm i ...
- 基准测试了 ArrayList 和 LinkedList ,发现我们一直用 ArrayList 也是没什么问题的
ArrayList 应该是 Java 中最常用的集合类型了,以至于我们说到集合就会自然而然的想到 ArrayList.很多同学都没有用过除了 ArrayList 之外的其他集合,甚至于都已经忘了除了 ...
- springboot使用spring配置文件
1.如何在springboot中使用spring的配置文件,使用@Configuration和@ImportResource注解 package com.spring.task; import org ...
- .Net轻量状态机Stateless的简单应用
对于大部分系统中流程的变更,是十分正常的事情,小到一个状态的切换,大到整个系统都是围绕业务流再走,复杂点的有工作流引擎,简单点的几个if/else收工,但是往往有那种,心有余而力不足的,比简单复杂,比 ...
- [正确配置]win7 PL/SQL 连接Oralce 11g 64位
PL/SQL 版本号:15.0.5.1710 32位 win7 64位系统 instantclient 12.1 32位,PL/SQL不支持64位 关键问题 1.Not logged on 2.没有c ...