java序列化的意义程序中,有实例化对象a,这对类成员属性的的调用格式是什么,对类方法的调用格式又是什么?

A abstract类只能用来派生子类,不能用来创建abstract类的对象。
B final类不但可以用来派生子类,也可以用来创建final类的对象。

1、abstract类不能用来创建abstract类的对象;抽象类和接口都不可以实例化。
2、final类不能用来派生子类,因为用final修饰的类不能被继承;
3、如2所述,final不能与abstract同时修饰一个类,abstract类就是被用来继承的;

注意:abstract是用来修饰类和方法的:


 加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。

A:属于运行时常量池导致的溢出,设置-XX:MaxPermSize可以解决这个问题,

B:属于堆空间不足导致的错误,问题比较少见,解决方式和C相同,

C:属于java堆内存问题,一般的手段是通过内存映像分析工具,对Dump出来的堆转储存快照进行分析,重点是确认内存中的对象是否是有必要的,也就是要判断是出现了内存泄漏,还是出现了内存溢出,如果是内存列楼,通过工具检查泄露对象打GC Roots的引用链信息,可以准确的确定出泄露代码的位置,不存在泄露,就应该检查虚拟机的堆参数,如果可以继续调大,可以设置-Xmx解决问题

A final是java中的修饰符,可以修饰类、接口、抽象类、方法和属性
B final修饰的类肯定不能被继承
C final修饰的方法不能被重载
D final修饰的变量不允许被再次赋值

2.final修饰方法中的参数,称为最终参数。

3.final修饰类,则类不能被继承

4.final修饰方法,则方法不能被重写。

6.final修饰的方法可以被重载 但不能被重写

6.结构型模式中最体现扩展性的模式是(A)

  适配器模式是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

  两个成熟的类需要通信,但是接口不同,由于开闭原则,我们不能去修改这两个类的接口,所以就需要一个适配器来完成衔接过程。

  桥接模式将抽象部分与它的实现部分分离,是它们都可以独立地变化。它很好的支持了开闭原则和组合锯和复用原则。实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这些多角度分离出来让他们独立变化,减少他们之间的耦合。

  组合模式将对象组合成树形结构以表示部分-整体的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

装饰模式动态地给一个对象添加一些额外的职责,就增加功能来说,它比生成子类更灵活。也可以这样说,装饰模式把复杂类中的核心职责和装饰功能区分开了,这样既简化了复杂类,有去除了相关类中重复的装饰逻辑。 装饰模式没有通过继承原有类来扩展功能,但却达到了一样的目的,而且比继承更加灵活,所以可以说装饰模式是继承关系的一种替代方案。

 外观模式为子系统中的一组接口提供了同意的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

外观模式中,客户对各个具体的子系统是不了解的,所以对这些子系统进行了封装,对外只提供了用户所明白的单一而简单的接口,用户直接使用这个接口就可以完成操作,而不用去理睬具体的过程,而且子系统的变化不会影响到用户,这样就做到了信息隐蔽。

 享元模式为运用共享技术有效的支持大量细粒度的对象。因为它可以通过共享大幅度地减少单个实例的数目,避免了大量非常相似类的开销。.

      享元模式是一个类别的多个对象共享这个类别的一个对象,而不是各自再实例化各自的对象。这样就达到了节省内存的目的。

7关于java编译和运行命令叙述不正确的是?  ( A)

A  错误 运行命令是 java + 你的 Java 程序的名字但是不加后缀 所以这道题错在多了 .class这个后缀

泛型仅仅是java的语法糖,它不会影响java虚拟机生成的汇编代码,在编译阶段,虚拟机就会把泛型的类型擦除,还原成没有泛型的代码,顶多编译速度稍微慢一些,执行速度是完全没有什么区别的. 

9.java语言中,按照一定格式生成程序的文档的工具是?(C)

javadoc 它从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。

10.判断对错。在java的多态调用中,new的是哪一个类就是调用的哪个类的方法。(B)

java多态有两种情况:重载和覆写

在覆写中,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法;

在重载中,运用的是静态多分派,即根据静态类型确定对象,因此不是根据new的类型确定调用的方法

11.下列修饰符中,能够使得某个成员变量可被它所在包访问到和它的子类访问到的是(A )

1.静态内部类才可以声明静态方法

2.静态方法不可以使用非静态变量

3.抽象方法不可以有函数体

B JVM在判定两个class是否相同时,只用判断类名相同即可,和类加载器无关
C ClassLoader使用的是双亲委托模型来搜索类的

JVM根据两个方面判断两个类是否相同:一是类的全称;另一个是类加载器.

即使类的全称相同,而使用的加载器不同那Class对象也是不同的.
JDK中提供了三个ClassLoader,根据层级从高到低为:

    参数来修改当前程序使用的Classpath)

14.对于JVM内存配置参数:

,其最小内存值和Survivor区总大小分别是(D)

-Xms初始堆大小即最小内存值为10240m

新生代大部分要回收,采用Copying算法,快!

ResultSet跟普通的数组不同,索引从1开始而不是从0开始

3、使用enum定义、非抽象的枚举默认修饰符为public final,因此枚举不能派生子类。
4、枚举的构造器只能使用private访问控制符,如果省略了枚举的访问修饰符其默认为private修饰;因为枚举的字段不能初始化,对象类型的必须调用构造方法,所有有多少个成员构造方法就会运行多少次;
5、枚举的所有实例必须在枚举的第一行显示列出,否则这个枚举永远都不能生产实例,列出这些实例时系统会自动添加public static final修饰,无需程序员显式添加

6、所有的枚举类都提供了一个values方法,该方法可以很方便的遍历所有的枚举值

7、关键字:枚举是enum,类是class

8、枚举是类类型,类是引用类型

3、使用enum定义、非抽象的枚举默认修饰符为public final,因此枚举不能派生子类。
4、枚举的构造器只能使用private访问控制符,如果省略了枚举的访问修饰符其默认为private修饰;因为枚举的字段不能初始化,对象类型的必须调用构造方法,所有有多少个成员构造方法就会运行多少次;
5、枚举的所有实例必须在枚举的第一行显示列出,否则这个枚举永远都不能生产实例,列出这些实例时系统会自动添加public static final修饰,无需程序员显式添加

6、所有的枚举类都提供了一个values方法,该方法可以很方便的遍历所有的枚举值

7、关键字:枚举是enum,类是class

8、枚举是类类型,类是引用类型

1.减少了代码的冗杂,提高代码的复用性
3.为之后多态性的使用,提供了前提

体现:一旦子类A继承父类B后,子类A中就获得了父类B中声明的所有结构:属性、方法
特别的,父类中声明的private的属性和方法,子类继承父类以后,仍然认为获取了父类私有的结构。
子类继承父类以后,还可以声明自己特有的属性和方法:实现功能的拓展

三、Java中关于继承的规定

1.一个类可以被多个子类继承
2.一个类只能有一个父类:Java中类的单继承性
3.子父类是相对的概念
4.子类直接继承的父类,称为:直接父类。间接继承的父类称为:间接父类
5.子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法

1.定义:在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在执行程序时,子类的方法将覆盖父类的方法。
①子类重写的方法必须和父类重写的方法具有相同的方法名称、参数列表
②子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
③子类重写的方法使用的访问权限不能小于父类重写的方法的访问权限;子类不能重写父类中声明为private权限的方法
④子类方法抛出的异常不能大于父类被重写方法的异常
3.注意:子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。

面试题:区分方法的重载与重写

方法的声明:权限修饰符 返回值类型 方法名(形参列表)throws 异常的类型
 
约定俗称:子类中叫重写的方法,父类中叫被重写的方法
父类被重写的方法的返回值类型是void,则子类重写的方法的返回值只能是void
父类被重写的方法类型是A类型,则子类重写的方法的返回值是A类或A的子类
父类被重写的方法的返回值类型是基本数据类型(eg.double),则子类重写的方法的返回值
必须是相同的基本数据类型

六、super关键字的使用

2.super可以用来调用:属性、方法、构造器
3.1 我们可以在子类的方法或构造器中,通过使用“super.属性”或“super.方法”的方式,显式的调用父类中声明的属性和方法。但是,通常情况下,习惯省略“super.”
3.2 特殊情况:当子类和父类中定义了同名的属性时,要想在子类中调用父类中声明的属性,则必须显式的使用“super.属性”的方式,表明调用的是父类中声明的属性
3.3 特殊情况:当子类重写了父类中方法以后,想在子类的方法中调用父类中被重写的方法时,则必须显式的使用“super.方法”的方式,表明调用的是父类中被重写的方法

4.1 我们可以在子类的构造器中显式的调用“super(形参列表)”的方式,调用父类中声明的指定构造器
4.2 “super(形参列表)”的使用,必须在子类构造器的首行
4.3 我们在类的构造器中,针对与“this(形参列表)”或“super(形参列表)”只能二选一
4.4 在构造器的首行,没有显式的声明“this(形参列表)”或“super(形参列表)”,则默认调用的是父类中空参的构造器
4.5 在类的多个构造器中,至少有一个类的构造器中使用了“super(形参列表)”,调用父类中的构造器

七、子类对象实例化的全过程

(继承性)子类继承父类以后就获取的父类中声明的属性和方法。创建子类的对象,在堆空间中,就会加载所有父类中声明的属性
当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器,直到调用了java.lang.Object类中的空参构造器为止。正因为加载过所有的父类的结构,所以才可以看到内存中有父类中的结构,子类对象才可以考虑调用。
明确:虽然创建子类对象时,调用了父类的构造器,但是自始至终就创建过一个对象,即为new的子类对象


八、面向对象特征之三:多态性

1.理解:一个事物的多种形态
2.父类的引用指向子类的对象(或子类的对象赋值给父类的引用)
3.使用:(虚拟方法调用)当调用子父类同名同参数的方法时,编译时,只能调用父类中声明的方法,实际执行的是子类重写父类的方法

4.使用前提:① 类的继承关系 ② 方法的重写

父类的引用指向子类的对象

5.对象的多态性:只适用于方法,不适用于属性(编译和运行都看左边)

有了对象的多态性以后,内存中实际加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致编译时,只能调用父类的属性和方法,子类特有的不能调用。

Q:如何才能调用子类特有的方法?
A:使用强制类型转换符,即向下转型

a instanceof A:判断对象a是否为类A的实例。如果是,返回true,如果不是,返回false

十一、Object类的使用

可以使用在基本数据类型和引用数据类型变量中
如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等(不一定类型要相同)
如果比较的是引用数据类型变量:比较两个对象的地址值是否相同,即两个引用是否指向同一个实体
2.equals()方法是一个方法,而非运算符,只能适用于引用数据类型
4.像String、Date、File、包装类等都重写了Object类中的equals()方法。重写之后,比较的是两个对象的“实体内容”是否相同
5.通常情况下,自定义的类如果使用equals()的话,也通常是比较两个对象的“实体内容”是否相同。那么,我们就需要对Object类中的equals()进行重写

1.当我们输出一个对象的引用时,实际上就是调用当前对象的toString()

4.自定义类也可以重写toString()方法,当调用此方法时,返回对象的“实体内容”

2.创建Java类,进行单元测试,此时的Java类要求:public、提供公共的、无参的构造器
3.此类中声明单元测试方法:方法权限是public、返回值为void、没有形参
5.声明好单元测试方法以后,就可以在方法体内测试相关的代码
6.左键双击单元测试方法名,右键运行
说明:执行结果没有任何异常:绿条,出现异常:红条

十五、包装类(Wrapper)的使用


1.Java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征

基本数据类型---->包装类:调用包装类的构造器

包装类—>基本数据类型:调用包装类的xxxValve()

JDK5.0新特性:自动装箱与自动拆箱

o1 为 1.0 ,原因:由于类型须统一,装箱后发生了类型提升,输出时进行再拆箱

我要回帖

更多关于 java序列化的意义 的文章

 

随机推荐