好久未曾启用我的博客,最近来上海找工作,想将笔试面试的过程做个记录,毕竟有总结才有提高嘛。今天算是笔试面试正式开始第一天吧,以下就是我的笔试总结(没有原题了,只有知识点):

笔试题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笔试面试第一天的更多相关文章

  1. Java 笔试面试(6)异常处理

    Java 笔试面试(6)异常处理 1. finally的代码何时执行? 问题描述:try{}里有一个return语句,那么在这个try后面的finally{}中的代码是否为执行?如果会,是在retur ...

  2. java笔试面试(转载)

    Java面试笔试题大汇总(最全+详细答案) 2016-02-01 15:23 13480人阅读 评论(8) 收藏 举报  分类: Java面试题(1)  声明:有人说, 有些面试题很变态,个人认为其实 ...

  3. Java 笔试面试 算法编程篇 一

    方法 1 /* ********************************************************************************** 1.编写一个程序, ...

  4. Java 笔试面试 基础篇 一

    1. Java 基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法, 线程的语法,集合的语法,io 的语法,虚拟机方面的语法. 1.一个".java& ...

  5. java笔试面试01

    今天给大家分享一下小布去广州华南资讯科技公司笔试和面试的过程. 过程:1.HR面试  2.笔试  3.技术面试 小布下午两点到达,进门从前台领了一张申请表,填完之后带上自己的简历到4楼就开始HR面试. ...

  6. Java笔试面试总结—try、catch、finally语句中有return 的各类情况

    前言 之前在刷笔试题和面试的时候经常会遇到或者被问到 try-catch-finally 语法块的执行顺序等问题,今天就抽空整理了一下这个知识点,然后记录下来. 正文 本篇文章主要是通过举例的方式来阐 ...

  7. java笔试面试第二天

    没想到第二次面试到了第二周,也是我在上海找工作的第二周,说实话,没有真本事找工作是真的难,虽然正在召开的十九大上,大大们纷纷表态国力正盛,经济稳步增长,就业压力逐渐缓解,但是社会终究是社会,要么靠实力 ...

  8. java笔试面试二

    http://www.cnblogs.com/lanxuezaipiao/p/3371224.html

  9. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

随机推荐

  1. java架构之路-(Redis专题)Redis的高性能和持久化

    上次我们简单的说了一下我们的redis的安装和使用,这次我们来说说redis为什么那么快和持久化数据 在我们现有的redis中(5.0.*之前的版本),Redis都是单线程的,那么单线程的Redis为 ...

  2. RSA-演变过程、原理、特点(加解密及签名)及公钥私钥的生成

    本篇是iOS逆向开发总结的第一篇文章,是关于iOS密码学的相关技术分析和总结,希望对大家有所帮助,如果有错误地方欢迎指正. 一.前言 密码学的历史追溯到2000年前,相传古罗马凯撒大帝为了防止敌方截获 ...

  3. CVE-2019-0708(非蓝屏poc)远程桌面代码执行漏洞复现

    玩了几天 刚回成都  玩电脑复现一下~ 内核漏洞原理暂时 没看懂 别问 ,问就是不懂 0x01 复现环境和Exp准备 漏洞影响范围 Windows 7 Windows Server 2008 R2 W ...

  4. python的递归函数怎么用

    在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数 理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰 使用递归函数需要注意防止栈溢出.由于栈的大小不 ...

  5. 修改springfox-swagger源码,使example中时间格式默认为“yyyy-MM-dd HH:mm:ss”

    修改swagger源码,使example中时间格式默认为"yyyy-MM-dd HH:mm:ss" 前言 简单点说,在swagger中,怎么能针对以下vo中的java.util.D ...

  6. MySQL开发篇(4)表类型(存储引擎)的选择

    一.查看支持的存储引擎以及设置修改存储引擎 1.查看默认存储引擎:show variables like '%storage_engine%'; 2.查看当前数据库支持的存储引擎:show ENGIN ...

  7. Leetcode Tags(5)Hash Table

    一.500. Keyboard Row 给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词. 输入: ["Hello", "Alaska", &q ...

  8. Mysql数据库(八)存储过程与存储函数

    一.创建存储过程与存储函数 1.创建存储过程(实现统计tb_borrow1数据表中指定图书编号的图书的借阅次数) mysql> delimiter // mysql> CREATE PRO ...

  9. Dubbo 优雅停机演进之路

    一.前言 在 『ShutdownHook- Java 优雅停机解决方案』 一文中我们聊到了 Java 实现优雅停机原理.接下来我们就跟根据上面知识点,深入 Dubbo 内部,去了解一下 Dubbo 如 ...

  10. UNIX环境高级编程 使用方法

    1.解压文件到apue.2e目录2.修改相应平台的文件,我使用的是linux,所以修改Make.defines.linux你修改的只需要这一行WKDIR=/home/your_dir/apue2e_s ...