第一节:
- 异常:
- try{被监测的代码} catch(抛出的异常类型,例如:Exception、IOException等){};
- 被检测的代码:如果是系统自己抛出的异常则不需要throw,如果是自己定义的异常则需要throw异常,catch才能抓到。
- 自定义异常:
- 也就是可以自己定义异常的类,这些类必须继承自java定义的异常类,像Exception、IOException等,然后可以在自己定义的衍生类里面定义方法均可。 java的异常类有两个构造函数:(这两个构造函数不是必须在类里实现的!)
- public BatteryUsageException() {} //无参数
- public BatteryUsageException(String msg){super(msg);} //String参数
- IO和装饰器:
- 所谓的装饰器,指的其实就是将一个类的引用传进装饰器之后,可以得到一个一个新的类的引用(我觉得实现应该就是,装饰器的类的构造函数参数是某个类的引用。)。这个新的引用功能比较强大而已,例如下面的装饰器例子:
- 下面的这个例子就很能解释了,BufferedWriter装了一下fw,然后得到了类引用bw。
File file=new File("new.txt"); if(!file.exists()){ file.createNewFile(); } FileWriter fw=new FileWriter(file.getAbsoluteFile()); BufferedWriter bw=new BufferedWriter(fw);
- IO就是对一些IO操作进行不同的组合装饰,得到自己想要的操作类之后就可以很好的对文件进行操作了。
- RTTI(运行时类型识别):
- RTTI就是运行的时候用来进行类型识别的,例如一个Human对象one和一个Woman对象two,将Woman对象强制转换为Human对象后,还能识别这两个对象所属于的类就是RTTI。
- RTTI机制是基于名为Class的类。当上面two对象强制转换为Human类之后,可以通过one.getClass();获得one里面的Class类的对象class,然后通过class.getName(),可以获取到one对象的类的类型。对象two也是一样的。
- 当Human和Woman没有创建对象的时候,也可以通过Class.forName("Human");或者Human.class来获得Human类中Class的对象class,然后通过class. getName()来获得类的类型;看下面代码就明白了:
public class Test { public static void main(String[] args) { //第一种方法 Human aPerson = new Human(); Class c1 = aPerson.getClass(); System.out.println(c1.getName()); //第二种方法 Class c3 = Class.forName("Human"); System.out.println(c3.getName()); //第三种方法 Class c4 = Woman.class System.out.println(c4.getName()); } }
- 我的理解:Class类的对象是在类定义后就会由java虚拟机自动生成一个Class对象保存在.class文件中,然后在new自己定义的类的对象的时候,就会去加载 .class文件中的Class类对象,当然,加载前会现在自己的内存扫描一下是不是原来加载过了,如果加载过了就不在加载了。找到这个加载的Class对象后,就可以通过这个对象来创建自己定义的对象了。
- 所以!就我的理解!每个类型的类只会在内存中保存一个该类型下的Class对象。然后可以通过getClass/.class/Class.forName("类名")来获得这个类的Class类的对象!!
- 补充:Class类中有一个函数newInstance(),可以用来创建一个新对象。例子如下:
Human newPerson = c1.newInstance();
其中c1是Human类的对象;
第二节:
- 多线程:
- 继承类Thread来实现多线程。自己定义Thread的衍生类,然后这个衍生类创建的多个对象就是多个线程了。
- 使用接口(interface)Runnable。自己定义一个使用接口Runnable的类,然后通过下面的代码就可以创建多线程。每创建一个Thread对象,就实现一个多线程。
Thread thread1 = new Thread(new NewThread(), "first"); //NewThread是自己定义的使用接口Runnable的类,first是线程名称
- 多线程中的几个问题:
- toString函数,这个函数主要是将现在对象转换为字符串,如果在类中实现了这个函数,则通过System.out.println(this);打印出来的内容就是这个类对象的名称。
- Thread的基本构造函数可以传入一个字符串参数,这个字符串就是线程的名字。
- start()函数,创建了多线程的对象后,每个对象必须调用start函数后才会开始执行,该函数可以在自定义线程类的构造函数中调用,则会在创建线程对象的同时开始执行。
- run()函数,个人理解:在线程类调用的start函数中调用了run函数,开始执行的内容。次函数不需要人为的调用。
- 线程间的同步:在多线程公用的一个类对象中,为了防止多个线程同时使用对象中的方法造成类对象的成员数据冲突,可以在方法前面加上synchronized关键字。加上这个关键字后,只有当一个线程调用完之后才会有另一个线程来调用该对象的该函数。
- java的每个对象中都自动包含了一个记录synchronized方法调用次数的计数器,类中的synchronized方法被调用一次计数器就会加一,调用结束一次就会减一。线程每次调用对象的synchronized函数时就会先检查这个计数器,为0的时候才能调用。不为0的时候就只能等待啦!
- 除了多线程同步外还有关键代码的同步,就是使用“synchronized(obj){关键代码}”这种方法!obj为任意对象,主要是使用该对象中的synchronized计数器。
第三节:
- 容器:
- 数组、List(表)、Set(集合)、Map
- 数组很好理解,和C中的数组没有什么区别,只是C中写成int a[5],而java中写成int[ ] a=new int[5]. PS:发现java哪里都需要new!
- List(表)和Set(集合),这两个比较难理解。其实说白了这两个就是接口! 他们两个都继承字Collection这个接口。而众所周知,接口是没有方法的实现的。于是需要通过不同的实施方法来创建这个有关这个接口类的相关对象。
List<String> l1 = new ArrayList<String>(); //List是接口,ArrayList是实施了List这个接口,可以更换ArrayList而得到不同类型的List对象!!
- Set(集合)和List是相同的,只是Set中不能存在相同的元素,并且不像List中的元素存在顺序,Set中的元素是没有顺序的。
- 嵌套类:
- 所谓的嵌套类指的就是在类里面再定义类,外面的类叫做外部类,类里面的类叫做内部类
- 内部类是可以访问外部类里面的所有成员变量的,私有与否都可以访问,并且同一个外部类对象的内部类对象访问到的外部类对象的成员变量是一样的。这种情况叫做闭包!
- 但是如果内部类定义的是static的类,则只能访问外部类的static成员变量,其他成员不得访问!
- 嵌套类的使用:
- 如果是非static修饰的内部类,使用方法如下:
Human.Cup myFirstCup=me.new Cup();//非static内部类创建对象,Cup是Human的内部类
- 如果是static修饰的内部类,使用方法如下:
Human.Mongolian him= new Human.Mongolian(); //Mongolian是Human的Static内部类
- 如果是非static修饰的内部类,使用方法如下:
- 阿斯达