java学习笔记

2017-07-13  本文已影响0人  巨狮座

基础语法:

①java源文件名必须和public类名相同,一个java文件中只能有一个public类

②每个类都有构造方法。在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名。一个类可以有多个构造方法。

③接口和抽象类:java通过接口实现多重继承,而一个类只能继承一个类(包括抽象类)或者使用内部类可以实现多继承。Java8中接口也可以有方法体。

变量类型:

①成员变量和类变量:类变量有static修饰符,修改类变量的值会令new出来的任何一个实例中具有相同的值,而不同实例对象间的成员变量相互独立。

②局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。

基本数据类型:

① Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

② 引用类型: 强引用 软引用 弱引用 虚引用

引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象(数组),指向对象的变量是引用变量。

③ 对于==,如果作用于基本数据类型的变量,则直接比较其存储的“值”是否相等;如果作用于引用类型的变量(  例如string类型),则比较的是所指向的对象的地址

④ 对于equals方法(注意:equals方法不能作用于基本数据类型的变量),如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

修饰符:

① final(表示常量) 变量能被显式地初始化并且只能初始化一次。被声明为 final 的对象的引用不能指向不同的对象,但是 final对象里的数据可以被改变。

② 一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。

抽象方法不能被声明成 final 和 static。

任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。

③ 静态变量也被称为类变量。局部变量不能被声明为 static 变量。

④ synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。(保证原子性)

⑤ volatile 修饰的成员变量在每次被线程访问时,都强制从公共内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。(不保证原子性)

循环:

① do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。

Number&Math类:

① Integer b = Integer.valueOf("444",16);  // 使用 16 进制

② 产生随机数有两种方法,一种是内置Random对象:  Random rand=new Random(); int j=rand.nextInt(100);

// 这里是一个方法的重载,参数的内容是指定范围

一种是Math类的random方法:int i=(int)(Math.random()*100);

//生成0-100的随机数

String类:

① String类是不可改变的解析,因此当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类。和String类不同的是,StringBuffer和 StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象。

② StringBuilder类在Java 5中被提出,它和StringBuffer之间的最大不同在于StringBuilder的方法不是线程安全的(不能同步访问)。

Collection接口类:

① Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。

② Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>

③ List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。

④ ArrayList只能通过get(int i)方法获取索引 i 的值,不能通过x[i](数组的方法)方法获取

Stream、File、IO:

PS:按照ANSI编码标准,标点符号、数字、大小写字母都占一个字节,汉字占2个字节。按照UNICODE标准所有字    符都占2个字节。在Java当中字符是采用Unicode编码标准的。

① File类创建文件

② FileInputStream\FileOutputStream负责从file对象读取原始字节流

③ 如果要以指定的字符编码方式(字符流)写入或读取文件,就需要InputStreamReader

④ 上面只能读\写一个字符,读\写多个字符需要BufferedReader

⑤ Scanner是一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器

异常:

(1)如果调用者发现这个方法抛出异常,那么他必须

①捕获处理这个异常(try...catch...finally...)

②抛出这个异常(使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。)

(2)声明自定义异常类

①如果希望写一个检查性异常类,则需要继承 Exception 类。

②如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

③一个异常类和其它任何类一样,包含有变量和方法。

继承:

(1)子类的构造过程中必须调用父类的构造方法

(2)子类可在自己的构造方法中使用super()来调用父类的构造方法

①使用this来调用子类的另外的构造方法,调用的代码只能出现在该构造方法内部的第一行可执行代码,      另外的构造方法必定使用super()              调用父类构造方法

②如果调用super必须写在子类构造方法的第一行

(3)如果子类的构造方法中没有显示的调用父类的构造方法,则系统默认的调用父类的无参的构造方法。

(4)如果子类的构造方法中既没有显示调用父类的构造方法,而父类中又没有无参的构造方法,则编译出错。

(5)this用法:

①用于区分成员变量和局部变量同名的时候,在成员变量名前面带上this.用于区分

②表示当前引用this的对象名。

③在一个类中如果构造函数间有重复,为增加程序的复用性,利用this调用重复的构造函数

重写(Override)和重载(Overload):

① 方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载是一类中多态性的一种表现。

② 重写是在子类里面,方法名字相同,参数相同。返回类型相同。异常可以减少或删除。访问修饰符只可以降低限制。

③ 重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。异常可以修改。访问修饰符可以修改。

④ 虚方法:编译的时候检查父类是否有该方法,而运行的时候则是调用特定对象(子类)的方法。要想调用父类中被重写的方法,则必须使用关键字super。

抽象类:

① 抽象类不能被实例化。

② 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

③ 构造方法、类方法(用static修饰的方法)不能声明为抽象方法。

④ 抽象类的子类必须重写抽象父类中的所有抽象方法,除非该子类也是抽象类。

接口:

① 接口不能用于实例化对象。

② 接口没有构造方法。

③ 接口中所有的方法必须是抽象方法。

④ 接口中的变量会被隐式的指定为 public static/final 变量

⑤ 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法)。

⑥ 接口允许多重继承,但是要注意,继承的多个接口可能包含相同名字方法,注意返回类型要一致,不然编译报错(原因:名字、参数相同,不符合重载规范)

Java多线程编程

① Java 线程的优先级是一个整数,其取值范围是1(Thread.MIN_PRIORITY )- 10(Thread.MAX_PRIORITY )。  具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源。但是,线程优先级不能保证线程执行的顺序,而且非常依赖于平台。

② Thread.currentThread().getName()是获得调用这个方法的线程的名字(用户可通过setName()方法定义线程名字);this.getName()也是获取当前线程对象的名字,但是必须在thread子类中调用,表示当前thread实例。如果没有自定义线程名字,系统自动以线程编号命名(格式:Thread-X)。

例子:

③ Thread.join(),是用来指定当前主线程等待其他线程执行完毕后,再来继续执行Thread.join()后面的代码。

④ Thread.join(long millis),当前主线程等待该线程终止的时间最长为 millis 毫秒,超过时间没完成则跳回  主线程,执行join()后面的代码。

匿名内部类

1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者  实现一个接口。

2、匿名内部类中是不能定义构造函数的。(初始化匿名内部类使用构造代码块)

3、匿名内部类中不能存在任何的静态成员变量和静态方法。

4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法

上一篇下一篇

猜你喜欢

热点阅读