(1)重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
(2)子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。
(3)重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。
(4)Animal a = new Dog(); a是Animal类型,但是它运行Dog类的的方法,因为在编译阶段,只是检查参数的引用类型(Animal类型),所以在调用方法时,得Animal类中有这样的方法,才能运行通过,单独写在子类的方法不可被调用。然而在运行时,java虚拟机(JVM)指定对象的类型(真正的对象–子类对象)并且运行该子类对象的方法(即重写方法)(父类对象引用指向的实际是一个子类对象)。这样new a的好处是:方便在代码中实现不同子类间的相互转换。
(5)Dog a = new Dog(); 由子类定义的指向子类对象的引用,全部子类和父类的方法均可调用。
(1)错误的分类:
a.Error:错误(不可控),一般指的是系统方面的异常,比如 蓝屏,内存溢出,jvm运行环境出现了问题。
b.Exception:是可控的异常,程序员可以在编写程序时解决的错误。(Exception是所有异常的父类,其下面可以派生出很多子类型。)
(2)异常处理机制:
try{
捕捉代码片段出现的异常信息,然后封装成异常对象//可能出
现异常的代码块放入try{}中,
}catch(异常类型的声明–引用捕捉到的异常对象){
//处理异常
}
例如:try{
代码….
}catch(Exceptionn e){
throw new RuntimeException("not implemented");
}
讲解:运行代码,如果遇到异常,则把代码中的异常信息封装成异常对象(e)传入异常类型Exception中,怎么处理呢,throw给RuntimeException(RuntimeException是Exception的子类)处理。
总结:jvm会进行检查try{}中的代码 如果有异常,jvm就会将异常信息封装成相应的异常对象,然后转移到catch(){}代码块中进行处理。
(3)throws:
定义方法时,声明要抛出的异常对象的类型,抛给调用者,让调用者处理。而这些异常可能是该方法体产生的。
throw new 一个异常对象:throw new NullPointerException();
throw IOException;
a.如果throw是运行时异常,可以不用 throws,因为编译器会忽略运行时异常。
b.如果throw是编译时异常,必须使用 throws。
String的concat()方法:用于将指定的字符串参数连接到字符串上。
深入了解原理:String有两点特殊性:长度不可变,值不可变。
源码中对String的声明:private final char[] value ;
final对应值的不可更改的特性;而char[](静态数组)对应String是长度不可更改的特性。
所以,当我们对String进行拼接后,产生的应该是一个新的字符串(用新的字符数组储存这个新的字符串)。concat()方法首先获取拼接字符串的长度,判断这个字符串长度是否为0(判断这个用来拼接的字符串是不是空串),如果是就返回原来的字符串(等于没有拼接);否则就获取源字符串的长度,创建一个新的char[]字符数组,这个字符数组的长度是拼接字符串的长度与源字符串的长度之和,通过Arrays类的copyOf方法复制源数组,然后通过getChars方法将拼接字符串拼接到源字符串中,然后将新串返回。
(1)== 表示判断2个变量或对象实例是否指向同一个内存空间,equals()表示
判断2个变量或对象实例所指向的内存空间的值是否相同。
(2)== 表示 对内存地址进行比较,equals()表示 对字符串的内容进行比较。
(3)== 表示引用是否相同,equals() 表示值是否相同。
File类
java中File是唯一可以直接操作文件的类。方法:
(1)delete() 删除文件或者一个空文件夹,不能删除非空文件夹,如果文件正在使用,则删除不了返回false,否则删除文件,返回一个true。
(2)exists() 判断文件或文件夹是否存在。
BufferedReader类:字符缓冲输入流。
(1)构造方法:
a.public BufferedReader(Reader in,int sz)创建一个使用指定大小输入缓冲区的缓冲字符输入流。in:一个 Reader,sz:输入缓冲区的大小。
b.public BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。
(2)常用方法:
a.public int read() throws IOException 读取单个字符。作为一个整数(其范围从 0 到 65535 (0x00-0xffff))读入的字符,如果已到达流末尾,则返回 -1。
b.public int read(char[] cbuf) throws IOException
一次读取一个字节数组cbuf(目标缓冲区)读取的字符数,如果已到达流的末尾,则返回 -1。
c.public String readLine() throws IOException
读取一个文本行。通过下列字符之一即可认为某行已终止:换行
(’\n’)、回车 (’\r’) 或回车后直接跟着换行。
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
ArrayBlockQueue是数组实现的线程安全的有界的阻塞队列,其内部是通过一个数组来维护的(所以队列大小即数组容量是创建时指定的),该队列采用尾部插入,头部返回,通过FIFO(先进先出)的原则对元素进行排序添加删除的。
(1) Offer方法:将指定的元素插入到队列的尾部,若成功则返回true,若队列已满,可以给一定时间去等待空位置,不一定是尾部了(add方法是插不进去就返回false).
(2) Poll方法:获取并移除队列的头部,并在一定时间里等待可入队的元素
1.格式:
(1)assert [boolean 表达式]
a.如果[boolean表达式]为true,则断言为真,程序继续执行。
b.如果为false,则断言失败,程序抛出AssertionError对象,(AssertionError继承于Error对象,而Error继承于Throwable,Error是和Exception并列的一个错误对象,通常用于表达系统级运行错误),并终止执行。
(2)assert[boolean 表达式 : 错误表达式 (断言失败后的错误信息)]
a.如果[boolean表达式]为true,则程序继续执行。
b.如果为false,则程序抛出java.lang.AssertionError,输出[错误信息](( 是一个传到AssertionError构造函数的值,如果断言失败,该值被转化为它对应的字符串,并显示出来)。
(3) assertTrue(boolean condition);
condition:如果condition结果为true,则通过测试.
(4)assertFalse(boolean condition);
condition:如果condition结果为false,则通过测试.
assertEquals()
如果预期值与真实值相等,则运行success,反之Failure
(1)用来初始化该类的一个新的对象
(2)构造方法与类名同名,且不返回数据类型,直接:
类名(参数,参数,…){
代码….
}
(3)构造方法中this的使用:
a.访问字段和方法
b.解决局部变量和域同名的问题
例子:
public class ShadowTest {
public int x = 0;
class FirstLevel {
public int x = 1;
void methodInFirstLevel(int x) {
System.out.println("x = "+ x);
System.out.println(“this.x =” + this.x);
System.out.println("ShadowTest.this.x = " +ShadowTest.this.x);
}
}
public static void main(String... args) {
ShadowTest st = new ShadowTest();
ShadowTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(23);
}
}
注意如何在main函数中ne一个内部类的写法,和this的用法,在同名字段和属性的访问上有重要作用。
上述测试例子输出为:
x = 23
this.x = 1
Shadow Test.this.x = 0、
1.对象为Null,表示空对象,未指向任何内存地址
2.一旦New一个对象,就为这个对象分配了内存地址,就不为null,即使对象没有初始化。比如构造函数没有要求传入参数,在后面才init(初始化)。但是也创建了对象就不是null。null 代表不存在这个对象。
3.但是没有new,仅仅 public 类名 变量名; java是不容许变量悬空即避免它乱指空间,会让它为null。这时候在写代码时特别注意空指针异常的情况,容易在写代码时出现指空而报错的情况,一般不建议如此写代码。
char toLowerCase(char ch) 用于将大写字符转换为小写,ch为要转换的字符,如果有相应的小写字符,则返回字符的小写形式,否则返回字符本身。
(1) Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键(key)与值(value)两部分组成,通过键可以找对所对应的值。Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
(2) get方法:获取指定键(key)所对应的值(value)。
(3) put方法:将指定的键与值对应起来,并添加到集合中, 使用put方法时,若指定的键(key)在集合中存在,则返回值为集合中键对应的值value(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。
(4) remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value)。
(5)Replace方法:jdk8后新增加的Map.replace方法,replace(K
key,V newvalue) 只要key 存在,不管对应值是否为null,则用传入的newvalue替代原来的值,即使传入的newvalue是null也会用来替代原来的值,而不是删除,注意这对于value不能为null值的Map实现将会造成NullPointerException。Key 不存在不会修改Map的内容,返回值总是原始的map.get(key)。
(6)keyset方法:map.get(key)是返回一个key对应的value,如果需要得到所有key对应的value,需要遍历所有key,比较麻烦。所以用map.keyset(),返回的是一个set,里面存放的是所有key, 然后因为set具备迭代器,所以用迭代方式取出所有的key再根据get()方法,获取每一个键对应的值。
1 通常,创建类的时候,就是在描述这个类的外观行为,除非用new创建那个类的对象,否则实际上并没有获取任何对象,new来创建对象时,数据存储空间才被分配,其方法才供外界调用。
但是,有两种情形是上述方法无法解决的。一种情形是,只想为某特定域分配单一存储空间而不去考虑究竟要创建多少对象,甚至是根本不创建任何对象;另外一种情形是,希望通过某个方法而不与包含他的类的任何对象关联在一起。也就是收即使没有创建对象,也能够调用这个方法。
这样通过static就能满足以上的要求。当被声明为static时,就意味着这个域或者方法不会与包含他的类的任何对象关联在一起。因此即使没有创建这个类的对象,也可以调用static方法或者static变量。
另外就是,不论创建多少个类的实例,静态变量和静态方法,只会占用一份内存。
因此,当一个方法会被反复调用的时候,我们可以考虑将他申明为static,这样,不必每次调用的时候,都初始化类实例,分配内存空间。
2.是类的字段,不属于任何一个实例对象,不保存在某个对象实例的内存空间而是保存在类的内存空间的公共存储空间。一般代表一个不属于任何一个实列对象属于宏观概念的一个变量,比如:全人类的数量。可以通过类名.变量名或者对象名.变量名来访问。
3.静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存,而非静态方法是属于对象的,对象是在类加载之后创建的,也就是说静态方法先于对象存在,当你创建一个对象时,程序为其在堆中分配内存,一般是通过this指针来指向该对象。静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。因此在对象未存在时非静态方法也不存在,静态方法自然不能调用一个不存在的方法。
4.表示全局变量。