* 类:描述事物的属性和行为(事物的描述)
* 对象:其实就是该类事物实实在在存在的个体。(该类事物的实例,在java中通过new来创建。)
成员变量与局部变量的区别:
1. 成员变量定义在类中,整个类中都可以访问。
局部变量定义在函数,语句,局部代码块中,只在所属的区域有效。
2. 成员变量存在于堆内存的对象中。
局部变量存在于栈内存的方法中。
3. 成员变量随着对象的创建而存在,随着对象的消失而消失。
部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
4. 成员变量都有默认的初始化值。
局部变量都没有默认的初始化值。
实例化过程:person p= new person();
1. JVM会读取指定路径下的person.class文件,并加载进内存,并会先加载person的父类(如果有直接的父类的情况下)。
2. 在堆内存中开辟空间,分配地址。
3. 并在对象空间中,对对象中的属性进行默认初始化。
4. 调用对应的构造函数进行初始化。
5. 在构造函数中,第一行会先调用父类中的构造函数进行初始化。
6. 父类初始化完毕后,在对子类的属性进行显示初始化。
7. 在进行子类构造函数的特定初始化。
8. 初始化完毕后,将地址值给引用变量。
构造函数:
构建创造对象时调用的函数。
* 特点:
1. 函数名与类名相同
2. 不需要定义返回值类型
3. 没有具体的返回值
* 作用:给对象进行初始化。
* 抽象类和接口的异同点:
- 相同点:
都是不断向上抽取而来
- 不同点:
1. 抽象类需要被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2. 抽象类中可以定义抽象方法和非抽象方法,子继承后,可以直接使用非抽象方法。
接口中只能定义抽象方法,必须由子类去实现
3. 抽象类的继承,是is a关系,在定义该体系的基本共性内容。
接口的实现是like a关系,在定义体系额外功能。
exception(异常):
是在运行时期发生的不正常情况。
在java中用类的形式对不正常情况进行了描述和封装对象。描述不正常的情况的类,就称为异常类。
问题很多,意味着描述的类也很多,将其共性进行向上抽取,形成了一场体系。
最终问题(不正常情况)就分成了两大类。
Throwable:无论是error,还是exception,问题发生就应该可以抛出,让调用者知道并处理。
该体系的特点就在于Throwable及其所有的子类都具有可抛性。
可抛性到底指的是什么呢?怎么体现可抛性呢?
其实就是通过两个关键字来体现的。
throws throw,凡是可以被这两个关键字所操作的的类和对象都具有可抛性。
1. 一般不可以处理的。
Error特点:是有jvm抛出的严重性问题。这种问题发生一般不针对性处理。直接修改程序。
2. 可处理的。Exception
* 该体系的特点:
子类的后缀都是用其父类名作为后缀。
* 注意:如果让一个类称为异常类,必须要继承异常体系,因为只有成为异常体系的子类才有资格具备可抛性。才可以被两个关键字所操作。
* 异常的分类
1. 编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeExcption体系。
这种问题一旦出现,希望在编译时就进行检测。让这种问题有对应的处理方式。这样的问题都可以针对性的处理。
2. 编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类。
这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的而或者引发了内部状态的改变导致的。那么这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让调用者对代码进行修正。
所以自定义异常时,要么继承Exception,要么继承RuntimeException。
1. throws使用在函数上
throw使用在函数内
2. throws抛出的是异常类,可以抛出多个,用逗号隔开。
throw抛出的是异常对象。
* 创建线程的第二种方式:实现Runnable接口。
1. 定义类实现Runnable接口。
2. 覆盖接口中的run方法,将线程的任务代码封装到run方法中。
3. 通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。
4. 调用线程对象的start方法开启线程。
* 实现Runnable接口的好处:
1. 将线程的任务从线程的子类中分离出来,进行了单独的封装。按照面向对象的思想将任务封装成对象。
2. 避免了java单继承的局限性。
所以,创建线程的第二种方式较为常用。
* 线程安全问题产生的原因:
1. 多个线程在操作共享的数据。
2. 操作共享数据的线程代码有多条。
当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算。就会导致线程的安全问题的产生。
* 解决思路:
就是将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程不可以参与运算。必须要当前线程把这些代码都执行完毕后,其他线程才可以参与运算。
在java中同步代码块就可以解决这个问题。
* IO流用来处理设备之间的数据传输
* Java对数据的操作是通过流的方式
* Java用于操作流的对象都在IO包中
* 流按操作数据分为两种:字节流与字符流。
* 流按流向分为:输入流,输出流。
字符流的由来:其实就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字,在对这个文字进行操作。简单说:字节流+编码表。
IO流常用基类
* 字节流的抽象基类:
1.InputStream 2.OutputStream
* 字符流的抽象基类:
1.Reader 2.Writer
字符流
* FileWriter
1、创建一个可以往文件中写入字符数据的字符输出流对象。既然是往一个文件中写入文字数据,那么创建对象时,就必须明确该文件用于存储数据的目的地。
如果文件不存在,则会自动创建。如果文件存在,则会被覆盖。
如果构造函数中加入true,可以实现对文件进行续写!
FileWriter fw = new FileWriter(“demo.txt”);
2、调用Writer对象中的writer(string);方法,写入数据。其实数据写入到临时存储缓冲区中。
fw.writer(“baby”);
3、进行刷新,将数据直接写入到目的地中。
fw.flush();
4、关闭此流。但要先刷新它。会自动进行刷新后再关闭。
fw.close();
* FileReader
1、创建读取字符数据的流对象
在创建对象时,必须要明确被读取数据的文件,一定确定该文件是存在的。
FileReader fr=new FileReader(“demo.txt”)
2、调用Reader对象中的read方法读取字符。
* 字符流的缓冲区
1. 缓冲区的出现提高了对数据的读写效率。
2. 对应类:BufferedWhiter、BufferedReader。
3. 缓冲区要结合流才可以使用。
4. 在流的基础上对流的功能进行的增强。
字节流
基本操作与字符流相同,但他不仅可以操作字符,还可以操作其他媒体文件。
* FineOutputStream
1.创建一个字节输出流对象。用于操作文件
2.写入数据。直接写入到目的地中。
3.关闭此流。
* FineInputStream
available();返回返回可读字节的长度。 |
|