文章标签 ‘JavaSE’
集合(集合类的对象)是用来管理其他若干对象的。 集合中保存的是对象的引用,数组是最基本的集合
集合框架
1,接口 集合中用到的类,接口在java.util包中,在使用时注意将其引入import。
Collection
用来管理多个对象,集合中的每个元素都是对象。
1)List 一个List的实现类的对象在管理多个对象时会按顺序组织对象(即按照将对象放入的顺序存储)List实现类的对象是有顺序的,List实现类对象中的内容是可重复的。(注意,顺序和排序的区别) 2)Set 一个Set的实现类表示一个数学概念上的集合,Set的实现类的对象中的元素是无顺序的,也就是不会按照输入顺序来存放,Set的实现类对象中的元素是不重复的。 3)SortedSet,他是Set的子接口,他的实现类会对集合中的元素进行排序。但是要指定排序规则,他会按排序规则进行排序。
Map,Map中没有对象,而是键值对,由Key,value组成的键值对 Key是没有顺序,不可重复的。 value是可以相同的,一个Key和一个value一一对应。
Map 接口(以下介绍其子接口) SortedMap,这个接口的实现类同样可以实现,不过是对键值对中的Key进行排序,这个接口的实现类也是要指定排序规则的。
Java中的内部类,内部类也就是定义在类内部的类。是编译时语法。
内部类的分类:
成员内部类
局部内部类
静态内部类
匿名内部类(图形监听时要用到,要掌握)。
一、成员内部类
四个访问权限修饰符都可以修饰成员内部类。
内部类和外部类在编译时是不同的两个类,内部类对外部类没有任何依赖。
内部类是一种编译时语法,在编译时生成的各自的字节码文件(Outer.class和Outer$Inner.class),内部类和外部类没有关系。
内部类中可以访问外部类的私有成员。(与C++的友员相比,不破坏封装)
作为外部类的一个成员存在,与外部类的属性、方法并列。
内部类和外部类的实例变量可以共存。
在内部类中访问实例变量:this.属性
在内部类访问外部类的实例变量:外部类名.this.属性。
在外部类的外部访问内部类,使用out.inner.
一、复习
1、Object 所有的类直接或间接的父类 finalize:垃圾收集的时候调用 toString:返回对象的字符串形式 equals:判断两个对象内容是否相同 2、包装类 8种基本类型各自提供了对象形式 3、异常处理 提高容错性 异常的分类:Throwable Error :错误,不可避免,不可处理 [...]
1、异常的处理
(1)声明抛出
是方法声明的第五部分 throws+异常名字(多个异常用“,”分隔) 出现异常,不处理,抛给上一级处理 并且子类抛出异常的范围不能比父类抛出异常的范围更宽。
(2)捕获异常
try – catch try – catch – finally try – finally //不捕获异常,当异常发生,返回上一级之前,要运行finally中的代码 以上语句可以嵌套
返回类型 方法名(参数){ try{ 可能出错语句 [...]
Java中的异常是为了在错误发生的时候减少损失,提高程序的容错性。
1、异常的分类
Throwable有两个子类:Error和Exception。
一个Error对象表示一个程序错误,指的是底层的、低级的、不可恢复的严重错误。此时程序一定会退出,因为已经失去了运行所必须的物理环境。
对于Error错误我们无法进行处理,因为我们是通过程序来应对错误,可是程序已经退出了。
我们可以处理的Throwable类中只有Exception类的对象(例外/异常)。
Throwable | —————— | | Error Exception | ————– | | RuntimeException 非Runtime异常 未检查异常 已检查异常 [...]
接口是一种程序结构,是特殊的抽象类。
接口中的方法必须都是公开的抽象方法(public abstract),接口中的属性都是公开静态常量(public static final)。
接口中没有构造方法
1
2
3
4
5
6
7
8
9
10
11
12
abstract class ClassA{
public static final int A [...]
static
属性:类变量;全类共有;类加载时初始化;类名访问
方法:静态方法;类名调用;静态方法中不能访问类的非静态成员,可以覆盖,只能被静态方法覆盖;没有多态初始代码块;类加载时运行
类加载: 一个类编译之后会形成.class文件,储存了类的全部信息。 当JVM第一次使用一个类的时候,会根据ClassPath找到对应的.class文件,用输入流把文件中的信息读入JVM并保存起来,这样,JVM就“认识”了这个类
类加载时机:第一次用这个类的时候
第一次创建类的对象,会加载
访问类的静态成员,会加载
声明类的引用,不会加载
加载子类,必然先加载父类
如果调用的是子类从父类中继承下来的静态方法,只会加载父类
如果访问的是类的静态常量,如果在编译的时候能够确定这个常量的值,则运行时不会加,否则,编译时无法确定常量值,那么运行时就会加载
abstract修饰符可以用来修饰类(Class)和方法(method)
一、abstract修饰类Class 抽象类
abstract修饰的类为抽象类:
不能创建对象,可以声明引用,并通过引用调用类中的方法
主要用于被子类继承的,可以用父类引用指向子类对象
二、abstract修饰方法method
abstract修饰的方法只有声明,没有实现,用“;”代替“{ }”
需要子类继承实现(覆盖)。
如果一个类中有抽象方法,那么这个类必须是抽象类。
抽象类中不一定有抽象方法
在Java中final修饰符可以用来修饰变量、方法、类。
一、final修饰变量
被fianl修饰的变量就是常量(常量名大写),一旦赋值不能改变
修饰局部变量: 修饰基本数据类型 -> 变量的值不能改变 修饰引用 -> 引用只能指向固定的对象
修饰实例变量: 默认值不生效,可以再赋值 有两次赋值机会: 1)初始化变量的时候 final int a = 20; 对于直接在初始化时赋值,final修饰符常和static修饰符一起使用,避免浪费空间 2)构造方法中设置 this.a = [...]
类加载就是指:JVM虚拟机通过I/O流把一个类的信息从字节码文件中读入虚拟机并保存起来
那么一个类在什么时候被加载?
总体思想就是:找时机 (延迟加载,能不加载就不加载)
new 一个对象的时候,类加载
没有创建对象,访问类中静态成员(方法和属性),类加载
声明一个类的引用,不加载
创建子类,先加载父类,再加载子类
父类中的公开静态方法,子类继承,使用子类的类名调用此方法,加载父类
1
2
3
4
5
6
7
class Super{
public static m(){}
}
class Sub extends Super{}
//在主函数中运行以下代码:
Sub.m(); //加载了父类之后,虚拟机已经知道m()方法的调用了,就不会再加载子类,延迟加载
没有创建对象,访问类中静态常量(能计算出结果的常量,在编译的时候会用计算出来的结果替换表达式),不加载
没有创建对象,访问类中静态常量(不确定的值),类加载
上面七种就是Java中的类是否进行加载的时机。
