java自学笔记

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集合来说,有一个尖括号<E>代表泛型
泛型:也就是装在集合当中的所有元素,全都是统一的类型
注意:泛型只能是引用类型,不能是基本类型
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<k,v> 集合 implements Map<k,v>接口

HashMap集合的特点:

1.HashMap集合底层是哈希表,查询的速度特别快

2.HashMap集合是一个无序的集合,存储元素和取出元素的是顺序可能不一致。

java.util.LinkedHashMap<k,v>集合 extends  HashMap<k,v>集合

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 .

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值