1. java文件名和类的名字是一致
2.java数据类型: 整数常量 小数常量 字符常量 字符串常量 布尔常量(true false 且不能用01来表示) 空常量(null)
3.方法:就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。
方法的调用:方法在定义完毕后,方法不会自己运行,必须被调用才能执行,我们可以在主方法main中来调用我们自己定义好的方法。在主方法中,直接写要调用的方法名字就可以调用了。
方法定义注意事项:
方法必须定义在一类中方法外
方法不能定义在另一个方法的里面
4.流程控制语句:
if else ;switch ;for循环;while循环; do while循环;跳出语句break,continue;都与c++用法相同。
5.一个标准的类通常需要拥有下面四个组成部分
1.所有的成员变量都要使用private关键字修饰
2.为每一个成员变量编写一对儿Getter/Setter方法
3.编写一个无参数的构造方法
4.编写一个全参数的构造方法
public class Person {
private String name;//只有两行是生成的 其他的都是通过alt +ins 自动生成的
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
6.java的两个变量或者方法之间的复制,都是传递地址,类似于c++中的引用传递。在java中没有值传递。
7.数组有一个缺点:一旦创建,程序运行期间长度不可以改变。
8.ArrayList类。
数组的长度不可以发生改变,但是ArrayList集合的长度是可以随意改改变的
对于ArrayList集合来说,有一个尖括号代表泛型
泛型:也就是装在集合当中的所有元素,全都是统一的类型
注意:泛型只能是引用类型,不能是基本类型
Arraylist当中的常用方法有(最好背住,其他的可以查阅手册):
public boolean add(E e);向集合当中添加元素,参数的类型和泛型一致
备注;对于ArrayList集合来说,add添加动作一定是成功的,所以返回值可用可不用
但是对于其他的集合来说,add添加动作不一定成功。
public E get(int index);从集合当中获取元素,参数是索引编号,返回值就是对应位置的元素。
public E remove(int index);从集合当中删除元素,参数是索引编号,返回值就是被删除掉的元素。
public int size();获取集合的尺寸长度,返回值是集合中包含的元素个数。
如果希望向集合Arraylist当中存储基本数据类型,必须使用基本类型对应的“包装类”
基本类型 包装类(引用类型,包装类都位于java.lang包下)
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
9.String 类
java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现,
就是说,程序当中所有的双引号字符串,都是String类的对象。(就算没有new,也照样是)
创建字符串的常见3+1种方法
三种构造方法:
public String():创建一个空白字符串,不含有任何内容
public String(char[] array): 根据字符数组的内容,来创建对应的字符串
public String(byte[] array): 根据字节数组的内容,来创建对应的字符串
一种直接创建方法
String str="Hello"
字符串常量池:程序当中直接写上的双引号字符串,就在字符串常量池中
对于基本类型来说,==是进行数值的比较
对于引用类型来说,==就是地址值的比较
==是进行对象的地址值比较,如果确实需要字符串内容的比较,可使用两个方法
public boolean equals(object obj);参数可以是任何对象,只有参数是一个字符串并且内容相同的才会给true,否则返回false
备注;
1.任何对象都能用object进行接收
2.equals方法具有对称性,也就是a.equals(b)何b.equals(a)效果一样。
3.如果双方一个常量一个变量,推荐把常量字符串写在前面
publuic boolean equalsIgnoreCase(String str) 忽略大小写,进行内容比较
String int length();获取字符串当中含有的字符个数 拿到字符串长度
public String concat(String str) 将当前字符串和参数字符串拼接常返回值新的字符串
public char charAt(int index) 获取指定索引位置的单个字符(索引从0开始)
public int indexof(String str) 查找参数字符串在本字符串当中首次出现的索引位置 如果没有返回-1值
字符串的截取方法
public String substring(int index);截取从参数位置一直到字符串末尾,返回新字符串
public String substring(int begin,int end);截取从begin开始,一直到end结束,中间的字符串
备注:[begin,end) 包含左边 不包含右边
String当中与转换相关的方法有:
public char[] toCharArray();将当前字符串拆分为字符数组作为返回值
public byte[] getBytes();获得当前字符串底层的字节数组
public String replace(CharSequence oldString,CharSequence newString)
将所有出现的老字符串替换成为新的字符串,返回替换之后的结果新字符串,CharSequence意思就是说可以接受字符串类型
分割字符串的方法:
public String[] split(String regex);按照参数的规则,将字符串切分成若干部分
注意事项: spilt方法的参数其实是一个"正则表达式",如果按照英文句点"."进行切分,必须写"\\."
10.static关键字
关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属
于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。反过来说,如果没加static,则该成员变量或者成员方法必须首先创建对象,然后通过对象才能使用它。
对于静态方法来说,可以通过对象名来调用(不推荐),也可以通过类名来调用。
类名称.静态变量 类名称.静态方法 对于本类当中的静态方法,可省略类名称 直接使用方法名进行调用
静态方法不能直接访问非静态的变量和方法,因为在内存中是先有的静态内容,后有的非静态内容。
静态方法当中不能使用this 原因是this 代表当前对象,通过谁调用的方法,谁就是对象。但静态不通过对象来调用。
静态代码块: 特点是: 当第一次用到本类时,静态代码块执行唯一的一次。静态内容总是优先于非静态,所以静态代码比构造方法先执行。 静态代码块的典型用途: 用来一次性的对静态成员变量进行赋值。
11.数组工具类 Arrays
java.util.Arrays 此类包含用来操作数组的各种方法,比如排序和搜索等。其所有方法均为静态方法。
public static String toString(int[] a) :返回指定数组内容的字符串表示形式
public static void sort(int[] a) :对指定的 int 型数组按数字升序进行排序
备注:如果是数值 sort默认按数值大小升序排列。如果是字符串,sort默认按照字母升序。如果是自定义类型,则需要该自定义的类有相应的接口的支持。
12.数学工具类 Math类
java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具
类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单。
public static double abs(double a) :返回 double 值的绝对值。
public static double ceil(double a) :返回大于等于参数的最小的整数。
public static double floor(double a) :返回小于等于参数最大的整数
public static long round(double a) :返回最接近参数的 long。(相当于四舍五入方法)
13.继承
通过 extends 关键字,可以声明一个子类继承另外一个父类,定义格式如下:
class 子类 extends 父类 {
……
}
区分子类中三种重名变量的方法:
局部变量: 直接写成员变量名
本类的成员变量:this.成员变量名
子类的成员变量:super.成员变量名
在父子类的继承关系中,创建子类对象,访问成员方法的规则:创建的对象是谁,就优先用谁,如果没有则向上找。
注意事项:无论是成员方法还是成员变量,如果没有都是向上找父类,绝对不对向下找子类的。
方法覆盖重写的注意事项:
1.必须保证父子类之间的方法的名称相同,参数列表也相同
@override写在方法前面,用来检测是不是有效的正确覆盖重写,这个注解就算不写,只要满足要求,也是争取的覆盖重写
2.子类方法的返回值必须小于等于父类方法的返回值类型
扩展提示:java.lang.object类是所有类的公共最高父类,java.lang.String就是object的子类
3.子类方法的权限必须大于等于父类方法的权限修饰符
扩展提示:public>protect>(default即留空)>private
继承关系中,父子类构造方法的访问特点:
1.子类构造方法当中有一个默认隐含的“super()”调用,所以一定是先调用的父类构造,后执行的子类构造。
2.子类构造可以通过super关键字来调用父类重载构造
3.super的父类构造调用,必须是子类构造方法的第一个语句,不能一个子类构造调用多次super构造。
总结:子类必须调用父类构造方法,不写则赠送super(); 写了则用写的指定的super调用,super只能有一个,还必须是第一个。
super关键字的用法有三种:
1.在子类的成员方法中,访问父类的成员变量
2.在子类的成员方法中,访问父类的成员方法
3.在子类的构造方法中,访问父类的构造方法。
super用来访问父类内容,而this用来访问本类内容,用法也有三种:
1.在本类的成员方法中,访问本类的成员变量
2.在本类的成员方法中,访问本类的另一个成员方法
3.在本类的构造方法中,访问本类的另一个构造方法
注意:this和super两中构造调用,不能同时使用
14.抽象类
父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有
意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方法
的类就是抽象类。
抽象方法 : 没有方法体的方法。 格式:修饰符 abstract 返回值类型 方法名 (参数列表);
抽象类:包含抽象方法的类。 如果一个类包含抽象方法,那么该类必须是抽象类。
注意事项:1.抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
2.抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
3.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
15.接口
接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么
接口的内部主要就是封装了方法。接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会被编译成.class文件,但一定要明确它并不是类,而是另外一种引用数据类型。
类与接口的关系为实现关系,即类实现接口,该类可以称为接口的实现类,也可以称为接口的子类。实现的动作类
似继承,格式相仿,只是关键字不同,实现使用 implements 关键字
在java9+版本中,接口的内容可以有:
1.成员变量 其实是常量 格式如下
【public】【static】【final】数据类型 常量名称=数据值
注意:常量必须进行赋值,而且一旦赋值不能改变。常量名称完全大写,用下划线进行分隔
2.接口中最重要的就是抽象方法:格式如下
【public】【abstract】返回值类型 方法名称(参数列表);
注意:实现类必须覆盖重写接口所有的抽象方法,除非实现类是抽象类
3.从java8开始,接口里允许定义默认方法,格式如下
【public】default 返回值类型 方法名称(参数列表){方法体}
注意:默认方法也可以被覆盖重写
4.从java8开始 接口里允许定义静态方法,格式如下:
【public】static 返回值类型 方法名称(参数列表){方法体}
注意:应该通过接口名称进行调用,不能通过实现类对象调用静态接口方法
5.从java9开始,接口里允许定义私有方法 格式如下
普通私有方法: private 返回值类型 方法名称(参数列表){方法体}
静态私有方法: private static 返回值类型 方法名称(参数列表){方法体}
注意:privatefe的方法只有接口自己才能调用,不能被实现类或别人使用。
使用接口的注意事项有:
1.接口是没有静态代码块或者构造方法的
2.一个类的直接父类是唯一的,但是一个类可以实现多个接口
3.如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。
4.如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类
5.如果实现类所实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写
6.一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先使用父类当中的方法。可以用覆盖重写。
类于接口之间的关系
1.类于类之间是单继承的。直接父类只有一个
2.类于接口之间是多实现的。一个类可以实现多个接口
3.接口与接口之间是多继承的。就是说接口也可以继承多个接口。
注意事项:
1.多个父接口当中的抽象方法如果重复,没关系
2.多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写(而且带着default关键字)
16.多态
多态体现的格式:
父类类型 变量名 = new 子类对象;
变量名.方法名();
父类类型:指子类对象继承的父类类型,或者实现的父接口类型。
17.Map集合
Map集合的特点:
1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
2.Map集合中的元素,key和value的数据类型可以相同,也可以不同
3.Map集合中的元素,key是不允许重复的,value是可以重复的
4.Map集合中的元素,key和value是一一对应的
java.util.HashMap
HashMap集合的特点:
1.HashMap集合底层是哈希表,查询的速度特别快
2.HashMap集合是一个无序的集合,存储元素和取出元素的是顺序可能不一致。
java.util.LinkedHashMap
LinkedHashMap集合的特点:
HashMap集合是一个有序的集合,存储元素和取出元素的是顺序是一致的。
18.Hashtable集合
Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢
HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快
HashMap集合(包括之前所学的所有集合):可以存储null值,null键
Hashtable集合:不能存储null值,null键
Hashtable和Vector集合一样。在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了.但Hashtable的子类Properties依然活跃在历史舞台。Properties集合是一个唯一与IO流相结合的集合
19.线程
单线程的缺点:出现异常后,程序立即停止。影响后面代码的运行。
创建多线程方法一步骤:
1.创建一个Thread类的子类
2.在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么)
3.创建Thread类的子类对象
4.调用Thread类中的start方法,开启新的线程,执行run方法
void start() 使该线程开始执行;java虚拟机使用该线程的run方法。
多次启动一个线程是非法的,特别是当线程已经结束执行后,不能再重新启动。
java程序属于抢占式调度,哪个线程的优先级高,哪个线程优先执行;同一个优先级,随机选择一个执行
创建多线程程序的第二种方式:实现Runnable接口
java.lang.Runnable
Runnable接口应该由那些打算通过某一线程执行其实例的类实现。类必须定义一个称为run的无参方法
实现步骤:
1.创建一个Runnable接口的实现类
2.在实现类中重写Runable接口的run方法,设置线程任务
3.创建一个Runnable接口的实现类对象
4.创建Thread类对象,构造方法中传递Runnable接口的实现类对象
5.调用Thread类中的start方法,开启新的线程执行run方法
获取线程的方法:
1.使用Thread类中的方法getName()
String name=getName() 再sout name返回该线程的名称
2.可以先获取到当前正在执行的线程,使用线程中的方法getName()获取线程的名称 Thread t=Thread.currentThread();再sout t返回线程名称
线程的名称:
主线程:main
新线程:Threa-0,Thread-1,Thread-2
20.线程安全问题
当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题。
要解决上述多线程并发访问一个资源的安全性问题:也就是解决重复票与不存在票问题,Java中提供了同步机制
(synchronized)来解决。
有三种方法可以操作
1. 同步代码块。
2. 同步方法。
3. 锁机制。
/*解决线程安全问题的一种方案:使用同步代码块
格式:
synchronized(锁对象){
可能会出现线程安全问题的代码(访问了共享数据的代码)
}
注意:
1.通过代码块中的锁对象,可以使用任意的对象
2.但是必须保证多个线程使用的锁对象是同一个
3.锁对象作用:
把同步代码块锁住,只让一个线程在同步代码块中执行
* */
21 .