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

  • 相关阅读:
    C#生成PDF总结
    Oracle删除当前用户下所有的表的方法
    C#操作oracle 到ExecuteNonQuery卡死不执行
    C#中事件的使用
    初探three.js光源
    d3.js 地铁轨道交通项目实战
    初探three.js
    d3.js 绘制北京市地铁线路状况图(部分)
    d3.js 共享交换平台demo
    d3.js 实现烟花鲜果
  • 原文地址:https://www.cnblogs.com/inspred/p/9526275.html
Copyright © 2011-2022 走看看