数组
数组也可以用引用类型
数组类型[]数组名
数组遍历
1 | int[] num=new int[]{1,2,3,4}; |
数组必须初始化
✪动态初始化 (指定数组长度)
数组类型[]数组名=new 数组类型[数组长度];
1
int[] arr = new int[5];
数组类型[]数组名;
数组名=new数组类型[数组长度];
静态初始化 (不指定数组长度,直接赋值)
- 数组类型 []数组名=new 数组类型[] {数据值…}
- 数据类型[] 数组名 = {数据值…}、
局部变量在栈里,new出来的东西在堆里
方法
定义:把一堆要重复执行的代码封装起来,如果别的程序要用到这段代码,直接调用这个方法名即可
如何?
1
2
3
4
5
6
7访问修饰符 返回值类型 方法名(参数类型 参数名){
代码块;
return 返回值;
}访问修饰符:格式是固定的
返回值类型:方法最终返回数据类型
方法名:首字母小写
参数类型:进入方法的数据类型
return:返回值返回给调用值
返回值:方法最终产生的结果
重载
重载和返回类型无关
方法名必须相同,参数列表必须不同
参数个数不同,参数类型不同,参数类型顺序不同
类和对象
一个类不能直接使用,类似一个汽车图纸不能直接跑
需要根据这个类创建一个真正的对象
1 | 类名 对象名 = new 类名(); |
如果成员变量没有赋值,会有默认值
成员变量,局部变量区别
- 成员变量在堆里,局部变量在栈里
- 成员变量声明在类内部,方法外部,局部变量在方法内部
- 成员变量有默认值,局部变量没有默认值
- 局部变量和成员变量重名时,方法会根据就近原则使用局部变量,为了区分,用this关键字(this关键字可以理解为当前使用或正在创建的对象)
面向对象的三大特性
封装
当我创建好对象以后,如果直接用对象名.属性的方式给属性赋值的话,可能会出现一些不符合实际的情况,所以不考虑“对象名.属性”的方法进行赋值
- 属性私有化
- 提供公用的get set 方法实现调用
修饰符 | 类内部 | 同一个包 | 子类 | 任何地方 |
---|---|---|---|---|
private | √ | |||
缺省 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
构造方法:
用来创建对象
有参构造方法可以直接给属性赋值
定义构造函数
1
2
3public 构造方法名(参数){
}
//注意(1.)没有返回值(2.)构造方法名必须和类名完全一致构造方法是一个方法,可以重载;
注意:构造方法如果没有自己定义,系统会自动提供一个无参构造方法;如果自己定义了构造方法,系统不再提供构造方法
super()指向离自己最近的父类
继承
定义父类
定义子类 extends
1
2public class 子类名 extends 父类名{
}子类继承父类之后,可以继承父类所有的属性和方法;
子类除了通过继承获取父类属性和方法外,还可以定义自己独有的属性和方法
一个子类只能有一个父类,一个父类可以有多个子类
重写:子类继承父类之后,如果父类方法满足不了子类要求,子类可以对父类进行重写。
- 子类的方法名,返回值类型,参数列表必须和父类一样
- 子类的访问修饰符权限不能小于父类的访问修饰符权限
- 子类和父类必须同时为“static”或者非“static”
多态
多态就是一个对象的多种形态
使用多态的前提是有继承或接口的实现
方法的重载和重写是多态
子类对象的多态性:父类引用指向子类对象(子类必须重写父类方法,而且子类继承了父类)
1
2
3
4
5
6
7Person p2 = new Man();
p2.eat(); //√
p2.sleep();//✕
//通过p2调用man的eat,但不能调用子类独有的方法(编译期间,程序会把p2看成是person类型,而person类种没有子类独有方法,编译不通过,也不能运行)
//对多态来说,第一行编译看左边,运行看右边
//如果要调用。需要类型转换
Man m1=(Man)p2;
static关键字
成员变量:**如果成员变量加了static,那么这个变量不属于对象,属于类本身,实现多个对象之间的数据共享
方法:普通方法需要创建对象才能用,静态方法不用创建对象就可使用;静态方法不能访问非静态成员变量和非静态成员方法,成员方法可以访问静态成员变量
抽象类和接口
如果父类的方法必须被子类重写的话,可以把父类方法定义成抽象方法
抽象方法,抽象类
动物吃饭
特点:
- 只有方法定义,没有方法体、
- 抽象方法必须在抽象类里
- 抽象类不能实例化
- 如果想实现抽象类,必须创建一个子类去继承他
- 子类继承一个抽象类,必须重写抽象类里所有的抽象方法
- 抽象类里可以定义普通方法,
- 抽象类里可以定义构造方法
接口(一个特殊的抽象类)
接口就是多个类的共用规范
接口里面的方法都是抽象方法
接口中没有变量,都是常量,默认被public static 修饰
1
2
3
4
5public abstract void start();
public void add();
abstract void run();
void stop();
//以上都是一样的,接口中抽象方法默认被public abstract修饰接口不能实例化,如果用接口,实现接口
要实现一个接口,必须重写接口里的所有抽象方法
父类和接口区别:一个类可以实现多个接口,但是只能继承一个类
接口里不能定义普通方法,也不能定义构造方法
接口可以继承接口,并且可以继承多个接口
1
Traffic tr = new ElectricVehicle();//推荐这种多态,更安全
Java常用类
Object
所有类的父类
equals和==
==:判断基本数据类型值是否相等那个,相等返回true,不相等返回false,在Object类中比较的是地址值
equals:只用在引用数据类型,在Object类中比较的也是地址值,String类重写了Object的equal方法,比较的是值
tostring()
String类也重写了tostring()方法
String
length()
:返回字符串长度
substring(int startpoint)
:根据startpoint的值截取字符串,截取后面的所有从0开始
substring(int start,int end)
:根据start位置开始,直到end结束 ,截取的字符串包含start不包含end
replace(char oldchar,char newchar)
:把oldchar替换成newchar
split(String regex)
:把一个字符串根据regex拆分成多个字符串,返回值为数组(可以用for-each读出)
封装类
八种基本数据类型对应的类
主要进行数据类型转成包装类
基本数据类型和包装类互换
装箱:基本数据类型→ 包装类
拆箱:包装类→ 基本数据类型
基本数据类型、包装类→ String
- 第一种(最简单)
1 | int a=10; |
第二种
1
String str1 = String.valueOf(a);
String→基本数据类型、包装类
1 | String str2 = "1123"; |
Date
获取当前系统时间,有数据库,用java.sql
SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
对日期进行格式化
format(date):把日期转成字符串
集合框架(升级版数组)
- 存多个对象:数组,集合框架
- 集合只能存对象
- 数组特点:
Student[] stu = new Student[10];
一旦创建,数组长度不可改变 - 集合有collection接口和map接口
List接口
void add(int index, Object ele)
:添加元素
Object get(int index)
:根据index查找元素
Object remove(int index)
:根据index删除指定元素,返回值为删除的内容
Object set(int index,Object ele)
:根据坐标修改内容值,返回值为被修改原内容
size()
:获取集合长度
map接口
key-value的形式存储,二者什么类型都可
key不可重复,value可以重复,如果key重复,会覆盖之前的数据
一个key-value称为一个Entry,Entry是不可重复的,无序的,如果键出现重复,会把上一个覆盖掉
key重写了equals方法,保存的内容,不是地址所以
1
2
3map.put(new String("aaa"), "bbb");
map.put(new String("aaa"), "bbb");
//也会覆盖
主要实现类:
HashMap
Object put (key,value)
:键值对的方式向map集合中添加元素
Object remove(key)
:根据key删除map元素;
Set keyset()
:查询所有的key
Collection values()
:查询所有value
get(key)
:根据key查询value
entryset()
:获取所有entry返回到set里