Java面试题详解二:java中的关键字
一,final
1.被final修饰的类不可以被继承
2.被final修饰的方法不可以被重写
3.被final修饰的变量不可以被改变
重点就是第三句。被final修饰的变量不可以被改变,什么不可以被改变呢,是变量的引用?还是变量里面的内容?还是两者都不可以被改变?
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public static void main(String[] args) {
final User user=new User("张三");
user.setName("李四");
System.out.println(user.getName());//运行没问题,输出:李四
}
}
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public static void main(String[] args) {
final User user=new User("张三");
final User user2=new User("李四");
user=user2;//编译都通不过,Error:(21, 9) java: cannot assign a value to final variable user
}
}
可见,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的
总结:
被final修饰的变量,不管变量是在是哪种变量,切记不可变的是变量的引用而非引用指向对象的内容。
被final修饰的常量,在编译阶段会存入调用类的常量池中
二,static
1.静态变量和静态方法
static关键字最基本的用法:
(1).被static修饰的变量属于类变量,可以通过类名.变量名直接引用,不需要new出一个类
(2).被static修饰的方法属于类方法,可以通过类名.方法名直接引用,不需要new出一个类
被static修饰的变量和方法统一属于类的静态资源,是类实例之间共享的,即一处变,处处变。
2.问题:为什么jdk把不同的静态资源放在不同的类中,而不把所有静态资源放在一个类中?
(1).不同类有自己的静态资源,可以实现静态资源分类。参见:Utils包下的工具类
(2).避免重名。放在不同类中可以有重名静态变量和静态方法
(3).避免静态资源类无限增长
说了这么多就是为了分类
3.静态资源和非静态资源之间的引用问题
静态资源是类初始化时加载的,非静态资源是类new的时候加载的。类的初始化早于类的new
所以:
静态方法不可以引用非静态资源
静态方法可以引用静态资源
非静态方法可以引用静态资源
4.静态块
静态块里面的代码只执行一次,且只在初始化类的时候执行
结论:
(1).静态资源的加载顺序是严格按照静态资源的定义顺序来加载的
(2).定义在静态代码块之后的静态变量,可以赋值,但不能访问
static{
c = 3;//没有定义就可以赋值
System.out.println(c);//报错,不能访问
}
private static int c;
(3).静态代码块是严格按照父类静态代码块--->子类静态代码块的顺序加载的,且只加载一次
三,java对象表示方式1:序列化Serizaliable和transient
平时java内存中的对象,是无法进行IO操作或网络通信的,因为进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,所以必须将对象以某种方式表示出来,即4存储对象中的状态。java对象的表示有很多样式,java本身也提供了用户一种表示对象的方式,那就是序列化。即序列化只是表示对象的一种方式
序列化:将一个对象转换成一串二进制表示的字节数组,通过保存或转移这些字节数据达到持久化的目的
反序列化:将字节数组重新构造成对象
四,java对象表示方式2:XStream实现对对象的XML化
1.对象的表示有各种各样的方式,序列化只是其中的一种而已。还可以将数据json化,xml化。(google的protobuf在redis序列化中用到了)
2.利用XStream表示一个对象
XStream就是一种java对象和xml之间相互转换的工具。XStream中的核心类就是XStream类。(需要导入jar包)
java代码:
XStream xs = new XStream();//XStream对象
XmlObject xo = new XmlObject(10, 10.5, "110");//java对象
String str = xs.toXML(xo);
java对象用Xml方式的表示方式:
<com.xrq.test.XmlObject>
<count>10</count>
<price>10.5</price>
<phone>110</phone>
</com.xrq.test.XmlObject>
3.Xml转换成java对象
XStream xs = new XStream();
String xmlStr = "<com.xrq.test.XmlObject><count>10</count><price>10.5</price><phone>110</phone></com.xrq.test.XmlObject>";
XmlObject xo = (XmlObject)xs.fromXML(xmlStr);
五,接口和抽象类
1.接口interface的作用
(1).接口是对于行为的抽象。从设计的角度来说,接口的存在可以帮助理清楚业务,利用接口可以告诉开发人员需要实现哪些业务,并且也将命名规范限制住了
(2).弥补了Java类单继承的不足,一个类可以实现多个接口。同时接口也可以多继承
(3).降低了代码的耦合性。由于java多态的特性,接口的引用可以接受子类的对象,用实现的子类实例化声明的接口后,就可通过接口调用子类重写的方法。即调用接口的地方和实现接口的地方法无关。(想想平时的接口的调用)
2.抽象类和接口区别
(1).接口是对动作的抽象,表示的是这个对象能做什么,如人可以吃东西,猫也可以吃东西,只要有相同的行为。
抽象类是对根源的抽象,表示的是这个对象是什么,如猫是动物,狗也是动物
(2).可以实现多个接口,只能继承一个抽象类
(3).接口中只能定义抽象方法 public abstract void add(); 注意方法不能用private修饰,通常public abstatic省略
抽象类中可以有普通方法
(4).接口中只能有静态的不能被改变的数据成员
抽象类可以普通的数据成员
Java面试题详解二:java中的关键字的更多相关文章
- Twitter算法面试题详解(Java实现)
最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...
- Java io流详解二
原文地址https://www.cnblogs.com/xll1025/p/6418766.html 一.IO流概述 概述: IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间 ...
- 【转】Twitter算法面试题详解(Java实现)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://androidguy.blog.51cto.com/974126/1319659 ...
- 整理最全的Android开发工程师面试题,面试题详解。java、Android程序员
1. 请描述下Activity的生命周期. 必调用的三个方法:onCreate()--> onStart() --> onResume(),用AAA表示 (1)父Activity启动 ...
- [转载] java多线程学习-java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger
转载自http://janeky.iteye.com/blog/770393 ------------------------------------------------------------- ...
- Java面试题详解四:==和equals的去别
一,功能 1.对于== 作用于基本数据类型的变量,比较的存储的值是否相等, 作用于引用类型的变量,比较的是其所指向的对象的地址是否相同(即是否是同一个对象) 2.对于equals Object的equ ...
- Java面试题详解一:面向对象三大特性
一,多态:1.面向对象四大基本特性:抽象,封装,继承,多态抽象,封装,继承是多态的基础.多态是抽象,封装,继承的表现.2.什么是多态不同类的对象对同一消息作出不同的响应叫做多态3.多态的作用简单来说: ...
- Java面试题详解三:比较器
一,Comparable和Comparator1.Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较.Comparable接口中只有一 ...
- Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...
随机推荐
- JS一些实用的方法
1.首次为变量赋值时务必使用var关键字 变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量. 2.使用===取代== ==和!=操作符会在需要的情况下自动转换数据类型.但 ...
- ASP.NET -- WebForm -- 缓存Cache的使用
ASP.NET -- WebForm -- 缓存Cache的使用 把数据从数据库或文件中读取出来,放在内存中,后面的用户直接从内存中取数据,速度快.适用于经常被查询.但不经常变动的数据. 1. Te ...
- JavaScript -- 时光流逝(三):js中的 String 对象的方法
JavaScript -- 知识点回顾篇(三):js中的 String 对象的方法 (1) anchor(): 创建 HTML 锚. <script type="text/javasc ...
- C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法
使用反射(Reflect)获取dll文件中的类型并调用方法 需引用:System.Reflection; 1. 使用反射(Reflect)获取dll文件中的类型并调用方法(入门案例) static v ...
- June 9. 2018, Week 23rd, Saturday
I know nothing except the fact of my ignorance. 除了自己的无知,我一无所知. Believe it or not, true wisdom exists ...
- 用static声明外部变量与内、外部函数
1.用static声明外部变量 若希望某些外部变量只限于被本文件引用,而不能被其他文件引用,可以在定义外部变量时加一个static声明. 例:(file1.c) #include <stdafx ...
- WebAPI HelpPage支持Area
WebAPI原生的HelpPage文档并不支持Area的生成,需进行如下改造: WebApiConfig: public static class WebApiConfig { public stat ...
- Linux /var/log下的各种日志文件详解
1)/var/log/secure:记录登录系统存取数据的文件;例如:pop3,ssh,telnet,ftp等都会记录在此. 2)/var/log/wtmp:记录登录这的信息记录,被编码过,所以必须以 ...
- (转)Spring Boot(七):Mybatis 多数据源最简解决方案
http://www.ityouknow.com/springboot/2016/11/25/spring-boot-multi-mybatis.html 说起多数据源,一般都来解决那些问题呢,主从模 ...
- A - Subarrays Beauty gym 位运算 &
You are given an array a consisting of n integers. A subarray (l, r) from array a is defined as non- ...