一.概述
1.Java只支持类之间的单继承。在java运行环境中,始终有一个系统级的系统级的线程,专门跟踪内存的使用情况,每过一段时间检查是否有不再使用的内存,有就自动回收。
2.关键词static表示该方法是一个静态方法,允许调用main方法,表示无需创建类的实例。
main方法固定格式:
public static void main(String[] args){ }
3.文件名和类名应该一致。
4.java application是一个与浏览器无关并能作为一个独立程序运行的程序。
java applet是嵌入web页面的小程序
二.简单的数据类型及运算
1.异常处理语句
try{}
catch(Exception e){
e.printStackTrace();
}
2.常量的定义需要在数据类型之前加上final
3.布尔型 boolean,在java语言中,布尔类型的值不能转换为任何数据类型。
4.所有的基本数据类型的大小都是明确规定好的,在各种平台上保持不变,这一特性有助于提高java程序的可移植性
5.单精度浮点型
float price=12.3f
双精度浮点型
double price=12.3d
6.自动类型转换需要满足两个条件:两种数据类型彼此兼容;目标类型的取值范围大于源数据类型。
当不满足上述条件时可以进行强制类型转换 a=(int)b
7.按位逻辑运算符:&, | , ^, ~
算术移位运算符: >> << >>>
8.从键盘接收数据
工具类:java.util.Scanner
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();
三.流程控制语句
1.对字符串进行截取并添加省略号
rtnStr=parStr.substring(0,5)+"……”
2.foreach循环语句
该语句是JAVA的新特性之一,它是一种特殊的for循环,用于遍历数组、集合的所有元素。
for(类型 变量名:集合)
{
语句块
}
四.类与对象
1.类的声明
【public】[abstract] [final] class<class_name> [extends <class_name>] [implements<interface_name>]
抽象类不能被实例化
内部类
public class Test4{
private String name;
private String sex;
private int age;
public class Test3 extends Test4{
private String address;
private int tel;
}
}
Test3类中有Test4类的所有变量和方法,这些变量和方法都继承于父类中的定义。
2.类的实例化
类的实例化有4种途径:使用new操作符;调用反射机制中的newInstance()方法;类的clone()方法,对现有实例的复制;通过解串行化使用的objectInputStream中的readobject()方法反序列化类。
类名 对象名;
对象名=new 类名();
或
类名 对象名=new 类名();
3.面向对象和对象
OO(Object Oriented)面向对象的简称
可重用性 可扩展性 可管理型
隐式创建对象
String s1="I love Java";
String s2="I love Java";//s1和s2引用同一个String对象
4.
public String xxtoString()
该方法是Object里面已经有的方法,所有类都继承自Object,所以所有对象都有这个方法,通常只是为了方便输出。比如System.out.println(xx)。括号里面的xx如果不是String类型的话,就自动调用xx的toString()方法。
5.释放对象时,只需要将对象所有引用赋值为null。
6.抽象方法不提供具体实现,并且所属类型必须为抽象类。
7.使用this关键字调用构造方法
public class Student{
public Student(){
this("Mary");
}
public Student(String name){
}
}
return this //返回某个类的引用
8.常用修饰符
friendly 该类只能被同一个包的类访问和引用,而不能被其他包中的类使用,即使其他包中有该类的子类。
protected 被其修饰的类、属性或方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
static 静态成员能通过对象进行访问,也能通过成员函数进行访问,还能通过类名访问,它们是所有对象共有的。
java虚拟机只为静态变量分配一次内存,对于实例变量,每创建一个实例就会为其分配一次内存。
9.静态方法和静态变量一样,不需要创建类的实例,可以直接通过类名来访问。
类的静态方法只能访问其他的静态成员,不能直接访问所属类的实例变量和实例方法。
静态方法不需要通过它所属类的任何实例就可被调用,因此在静态方法中不能使用1关键词this和super。
静态方法不能被覆盖为非静态方法。
静态代码块:静态块仅在该类被加载时执行一次,类中不同的静态代码块按他们在类中出现的顺序被依次执行。
10.final修饰符
用final修饰的方法不能被替换或隐藏(重定义)
使用final修饰的变量最多只能赋值一次。
五.深入面向对象编程
Java语言只支持单继承,那么接口的存在就弥补了单继承的不足。
1.接口
接口就是方法定义和常量值的集合。
引入接口是为了克服Java单继承机制带来的缺陷,实现类的多继承功能。它只有常量定义和方法的声明,没有变量和方法的实现。接口可以用来实现不同类之间的常量共享。
Java接口的方法只能是抽象的和公开的
接口名称通常是以"I"开头,比如ICourse等
如果类已经继承了一个父类,则以逗号分隔父类和接口。
Java语言中的接口和抽象类最大的区别在于Java抽象类可以提供某些方法的部分实现。
2.内部类和匿名类
内部类能够访问外部类的一切成员变量和方法,包括私有的,而实现接口或继承类做不到。
(1)局部内部类
该类是一个在方法中定义的内部类,它的可见范围是当前方法。和局部变量一样,局部内部类不能用访问控制修饰符及static修饰符来修饰。
局部内部类只能在当前方法中使用;局部内部类和实例内部类一样,不能包含静态成员;和实例内部类一样,可以访问外部类的所有成员,此外,局部内部类还可以访问所在方法中的final类型的参数和变量,不可以访问没有被final修饰的局部变量。
(2)静态内部类
静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,就必须通过外部类的实例去访问。
在静态内部类中可以定义静态成员和实例成员。
外部类可以通过完整的类名直接访问静态内部类的静态成员,访问内部类的非静态成员1通过实例化内部类。
(3)匿名类
new <类或接口>{
//类的主体
}
匿名类就是重写父类或接口的方法
3.public boolean equals(Object obj){
return (this==obj);
}
Object类中的方法,比较两个对象的内容是否相等。
4.super调用父类的构造方法,但不构造对象,放在方法体的首个语句。
5.创建包
在Java源程序的第一行输入package命令,任何在此文件中声明的类都属于这个包。包名通常是小写。如果在Java源程序中没有使用package定义报名,那么所创建的类就属于默认的包。
在Java中可以创建一个多层次的包,报名之间使用点进行分隔即可。包名的个数没有限制,其中前面的包名包含后面的包名。
创建包的语句必须是程序中的第一条可执行语句。
使用包
import +引用的类名/*,*表示Java编译器将引用整个包中的所有类
六.数组与集合
1.创建数组
int[] num={1,2,3};
int[] num=new int[]{1,2,3};
int[] a=new int[3];
int[][] num={{1,2,3},{4,5,6}}
2.快速排序法主要是运用了Arrays类中的一个静态方法sort()
3.集合
为了保存数量不确定和具有映射关系的数据,Java提供了集合类,也称为容器类。
Java集合中实际存放的是对象的引用值,不能存放基本数据类型。
任何的集合框架都包含三大块内容,对外的接口、借口的实现类和对集合运算的算法。
(1)集合框架是一个类库的集合,包含了实现集合的接口。
collection接口:最基本的接口,一个collection代表一个元素。
List接口:有序集合,允许有相同的元素,使用List精确控制元素的插入位置,用户能够使用索引来List中的元素,与数组类似。
set接口:不能包含重复的元素。SortedSet是按升序排列的set集合。
Map接口:包含键值对,不能包含重复的键。SortedMap是一个按升序排列的Map集合。
实例中通常都应该使用HashMap,只有在需要使用排序的功能时,才能使用TreeMap。
(2)接口实现类
HashSet:为优化查询速度而设计的Set.它是基于HashMap实现的,HashSet底层使用HashMap来保存所有的元素,实现比较简单。
TreeSet:是一个有序的Set,能从Set里面提取一个有序的序列。通过Comparable接口实现排序
ArrayList:用数组实现的List,能进行快速的随机访问,效率高而且实现了可变大小的数组。
自动增长会带来数据向新数组的重新复制,因此如果可预知数据量的多少,可在构造ArrayList时指定其容量。
LinkedList:对顺序访问进行了优化,但随机访问的速度相对较慢。能把它当成栈或队列使用。
4泛型集合
泛型是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。
定义泛型集合
Map<Integer,Staff> staffs=new HashMap<Integer,Staff>();
七.异常
1.异常主要有两个来源:Java运行时环境自动抛出系统生成的异常,而不管程序员是否愿意捕获或处理;第二种是程序员自己定义的,也可以是Java语言定义的异常;用throw关键字抛出,这种异常主要来向调用者报告某些异常信息。
任何异常对象都是java.lang.Throwable类或子类的对象。
2.在方法中使用try-catch语句来捕获并处理异常,catch语句可以有多个,用来匹配多个异常。
对于处理不了的异常或要转型的异常,在方法声明处通过throws语句抛出异常,即用上层的调用方法来处理。
3.Java异常处理
Java中的异常处理是通过try,catch,throw,throws和finally 5个关键词来实现的。
throw语句用于抛出异常,throws语句用于声明可能出现的异常。
在一段代码执行中引发多个错误的情况下,就可以使用一个try语句块后面跟多个catch语句块的格式来分别处理多个不同的异常。执行其中一个语句块后,其他的catch语句块将被忽略。如果程序所发生的异常和所有catch处理的异常不匹配,那么这个异常将被java虚拟机捕获并处理,此时和不使用异常处理的效果是一样的。
catch语句块中,异常的类型必须是从特殊到一般,最后一个一般是Exception类型。
八.线程
线程对象和其他对象一样,在堆上创建、运行和死亡。线程是一个轻量级的进程,有它自己的调用栈。在运行Java程序时一个main()方法对应一个主线程,一个新线程一旦被创建,就产生一个新的调用栈,与主线程并发执行。
1.线程实现
Java中线程的实现主要有两种方式,分别是继承java.lang.Thread类和实现java.lang.Runnable接口。
Thread类是java.lang包中的一个类,这个类中实例化的对象代表线程。启动一个新线程需要建立Thread实例,Thread本质上也是实现了Runnable接口的一个实例。启动线程的唯一方法就是Thread类的start()实例方法,start方法是一个native方法,它将启动一个新线程,并执行run()方法。Thread类常用的两种构造方式:
public Thread(String threadName);
public Thread();
第一个方法是创建一个名称为threadName的新线程对象。
继承Thread类
public class Thread1 extends Thread{……}
子类可以覆盖父类的run()方法
start()方法启动一个线程,也就是调用其run()方法。用start()方法启动线程,真正的实现了多线程,不需要等待run()方法体中的线程执行完毕而直接执行下面的代码,直接调用run()方
法,这时只是一个普通的方法。
当类中出现还要继承的其他类的情况,就无法再继承Thread类,这时编程人员可以使用Runnable接口来实现。
使用参数形式的内部类实现
public class Test3{
public static void main(String[] args){
Thread test=new Thread(new Runnable(){
@override
public void run(){
for(int i=0;i<3;i++){
System.out.println("这里是run方法体"+i);
}
}
};
test.start();
}
}
2.线程的生命周期
7种状态:新建状态、就绪状态、运行状态、等待状态、休眠状态、阻塞状态、死亡状态
新建状态:创建线程调用start()之前
就绪状态:调用start()之后
运行状态:获取到系统资源后
系统资源被剥夺,进入就绪状态
等待状态:调用Thread类的wait()方法,线程就处于等待状态,只能被notify()/notifyAll()方法唤醒。
休眠状态:调用sleep()方法
阻塞状态:当一个正在运行的线程发出输入/输出请求时,该线程进入阻塞状态
死亡:线程运行完毕
3.线程的调度
Thread类有3个有关线程优先级的静态常量,分别是Thread.MIN_PRIORITY、Thread.MAX_PRIORITY和Thread.NORM_PRIORITY,他们的值分别是1,10和5.
可以通过Thread的setPriority()方法来设置线程的优先级,设置值必须是在1到10之间。
如果有一个线程A正在运行,而用户希望插入一个其他线程B,要求线程B先于线程A执行完毕,这使可以用join()方法来完成。如果加入的线程处理的时间太久,不想一直等下去,可以在join()上指定时间,例如join(10000),表示加入的线程最多处理10000毫秒。这样加入的线程到规定时间还没有执行完毕的话不会再对它进行处理,原线程继续执行。
sleep(10)线程休眠10ms,可以减轻cpu的压力。
线程让步 Thread.currentThread().yield();不一定会礼让资源
4.线程同步
为了防止资源访问的冲突,Java提供了进程的同步机制。
在多线程访问冲突的情况下,基本都会采用给定时间内只允许一个线程访问访问共享资源的方法解决,主要采用锁机制实现。实现这种机制一般采用同步块或同步方法来完成。
同步块
synchronized(Object){}
同步方法
调用同步方法后该对象上的其他同步方法必须等待该同步方法执行完毕后才能被执行,必须将能访问共享资源的每个方法都加上synchronized关键字。
synchronized void func(){ }