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).接口中只能有静态的不能被改变的数据成员  
    抽象类可以普通的数据成员

原文地址:https://www.cnblogs.com/inspred/p/9526275.html

时间: 2024-11-13 08:21:05

Java面试题详解二:java中的关键字的相关文章

[转载] java多线程学习-java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger

转载自http://janeky.iteye.com/blog/770393 ----------------------------------------------------------------------------- 3. Semaphore     我们先来学习一下JDK1.5 API中关于这个类的详细介绍: “一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从

Twitter算法面试题详解(Java实现)——Trapping Rain Water

[算法题:求出高低不同的砖中能存多少水] 「Trapping Rain Water」 Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

Java面试题详解一:面向对象三大特性

一,多态:1.面向对象四大基本特性:抽象,封装,继承,多态抽象,封装,继承是多态的基础.多态是抽象,封装,继承的表现.2.什么是多态不同类的对象对同一消息作出不同的响应叫做多态3.多态的作用简单来说:解藕.详细点就是,多态是设计模式的基础(既然是基础,那么一些设计模式中肯定有多态的下面三个条件)4.多态存在的三个条件有继承关系子类重写了父类方法父类引用指向子类对象5.注意:因为多态存在必须要有"子类重写父类方法"这个条件,那么下面三种类型的方法没办法表现出多态的特性(因为不能被重写)s

Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更改实现类或参数信息时,只需要修改配置文件即可,这种方法在上例的基础上更进一步的降低了类与类之间的耦合.我们还可以对某对象所需要的其它对象进 行注入,这种注入都是在配置文件中做的,Spring的IOC的实现原理利用的就是Java的反射机制, Spring还充当了工厂的角色,我们不需要自己建立工厂类.S

Java路径操作详解

1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如: C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://www.sun.com/index.htm也代表了一个 URL绝对路径. 相对路径:相对与某个基准目录的路径.包含Web的相对路径(HTML中的相对目录),例如:在 Servlet中,"/"代表Web应用的根目录.和物理路径的相对表示.例如:". /" 代表当前目录, &q

Java线程池详解(二)

一.前言 在总结了线程池的一些原理及实现细节之后,产出了一篇文章:Java线程池详解(一),后面的(一)是在本文出现之后加上的,而本文就成了(二).因为在写完第一篇关于java线程池的文章之后,越发觉得还有太多内容需要补充,每次都是修修补补,总觉得还缺点什么.在第一篇中,我着重描述了java线程池的原理以及它的实现,主要的点在于它是如何工作的.而本文的内容将更为上层,重点在于如何应用java线程池,算是对第一篇文章的一点补充,这样对于java线程池的学习和总结稍微完整一些. 使用过java线程池

Java多线程详解(二)

评论区留下邮箱可获得<Java多线程设计模式详解> 转载请指明来源 1)后台线程 后台线程是为其他线程服务的一种线程,像JVM的垃圾回收线程就是一种后台线程.后台线程总是等到非后台线程死亡之后,后台线程没有了服务对象,不久就会自动死亡,不再复活.利用setDaemon方法可以把一个线程设置为后台线程,但必须在线程启动之前调用. 例如 : /* * @author [email protected] */ public class DaemonThread extends Thread { pu

Java多线程编程详解

线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synch

java环境变量详解---找不到或无法加载主类

刚学java,配置好环境变量之后,在DOS下却运行java小程序却始终出现"找不到或无法加载主类"然后返回配置环境变量折腾了好久,查看书籍.网上的资料,最终OK了!安装Eclipse始终出现 "could not find Java SE runtime environment"."could not find java dll"这样的问题,按照网上提供的资料却始终解决不了问题,最后将最新版本的Eclipse换了,才可以用. 以下是安装JDK的总