Java 基础知识第二部分。
面向对象
- 面向过程:强调步骤
- 面向对象:强调对象
- 特征:封装、继承、多态
- 类:一组相关属性和行为的集合。
- 属性:状态信息
- 行为:可以做什么
- 类和对象的关系
- 类是对一类事物的描述,是抽象的
- 对象是一类事物的实例,是具体的
- 类是对象的模板,对象是类的实体。
类的定义
- 成员变量(属性)
- 直接定义在类当中,在方法外边。
- 成员方法(行为)
- 无
static
关键字
- 无
一个类不能直接使用,需要根据类创建一个对象,才能使用。
步骤:
- 导包:指出需要什么类,在什么位置。
import 包名称.类名称
对于和当前类属于同一个包的情况,可以省略导包语句。 - 创建 =
类名称 对象名 = new 类名称();
- 使用
- 使用成员变量 =
对象名.成员变量名
- 使用成员方法 =
对象名.成员方法名(参数)
- 使用成员变量 =
一个对象的内存图
- 方法的进栈和出栈
- 堆中
成员方法
保存的是一个地址值 - 方法要执行,一定要进栈,执行完毕就出栈
- new之后有默认值
- 对象的名称也叫做对象的引用名
使用对象类型作为方法的参数:当一个对象作为方法的参数,传递到方法当中时,实际上传递进去的是对象的地址值。
使用对象作为方法的返回值:返回值其实就是对象的地址值。
成员变量与局部变量的区别:
- 定义位置不一样(重要)
- 成员变量:在方法外部,直接写在类中
- 局部变量:在方法内部
- 作用范围不一样(重要)
- 成员变量:整个类可以通用
- 局部变量:只有方法中可以使用,出了方法不能使用。
- 默认值不一样
- 成员变量:若没有赋值,会有默认值,规则和数组一样
- 局部变量:没有默认值,如果要想使用,必须手动进行赋值。
- 内存位置不一样(了解)
- 成员变量:位于堆内存
- 局部变量:位于栈内存
- 生命周期不一样
- 成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失。
- 局部变量:随着方法进栈而诞生,随着方法出栈而消失。
方法的参数也是局部变量,在调用的时候必然会被赋值。
面向对象 - 封装性
封装在java中体现
- 方法是一种封装
- 关键字
private
也是一种封装 使用private将需要保护的成员变量进行修饰。在本类中可以随意访问,但是超出本类范围之外不能直接访问。 间接访问private成员变量:设置一对getter/setter方法- setter方法:有参数,无返回值。方法名称必须是
set
+首字母变大写(setXxx) - getter方法:无参数,有返回值。方法名称必须是
get
+首字母变大写(getXxx)。 - 注意:对于基本数据类型中的
boolean
型,Getter方法一定要写成isXxx
形式,setXxx规则不变。
- setter方法:有参数,无返回值。方法名称必须是
封装:将一些细节信息隐藏起来,对于外界不可见。
this
关键字作用:在重名下起到区分的效果。
当方法的局部变量和类的成员变量重名时,根据“就近原则”,优先使用局部变量。
如果需要访问本类中的成员变量,需要使用这种格式 =
this.成员变量名
通过谁调用的方法,谁就是this.
构造方法
专门用来创建对象的方法。(使用构造方法创造对象可以更具体)
格式 =
public 类名称(参数) { 方法体 }
注意事项:
- 构造方法名称必须和所在类名称完全一样
- 构造方法不需要写返回值类型,void也不需要
- 构造方法不能产生返回值。
- 如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数且方法体什么都不做。
public Student() {}
- 一旦编写了至少一个构造方法,那么编译器将不再赠送。
- 构造方法也是可以进行重载的。
new对象就是在调用构造方法。
标准的类(Java Bean)
- 所有成员变量都要使用private关键字修饰
- 为每一个成员变量编写一对Getter/Setter方法
- 编写一个无参数构造方法
- 编写一个全参数构造方法
在idea中可以自动生成下面3项!!!菜单
Code -> Generate
API文档的查看
- 包路径
- 构造方法
- 方法摘要
Scanner类
引用类型一般使用步骤
- 导包 =
import 包路径.类名称;
- 如果需要使用的目标类,和当前类位于同一个包下,则可以省略包不写。
- 只有
java.lang
包下的内容需要导包,其他的包需要import语句。
- 创建:
类名称 对象名 = new 类名称();
- 使用: 对象名.成员方法();
System.in
代表从键盘输入。其实键盘输入的都是字符串。
- 导包 =
匿名对象
正常的创建对象格式 = 类名称 对象名 = new 类名称();
匿名对象创建格式 = new 类名称()
注意 = 匿名对象只能使用唯一的一次,下次只能创建新的匿名对象。
建议:如果确定有一个对象只需要使用一次,就可以使用匿名对象。
Random类
生成随机数字。
对象数组
数组可以存储任何数据类型
ArrayList集合
其长度可以随意改变。
对于ArrayList来说,有一个尖括号<E>
代表泛型。
泛型:装在集合中的所有元素,全都是统一的什么类型。
注意:泛型只能是引用类型,不能是基本类型。也就是说集合里面保存的都是地址,但是基本类型数据没有地址。
ArrayList<String> list = new ArrayList<>();
注意右侧的尖括号也是要写的。
注意:对于ArrayList集合,直接打印得到的不是地址值,而是内容。如果内容为空,则得到的是空的中括号[].
常用方法:
- 添加数据方法 =
public boolean add(E e)
- 从集合中获取元素 =
public E get(int index)
- 从集合中删除元素 =
public E remove(int index)
- 获取集合长度 =
public int size()
String
- 程序当中所有的双引号字符串,都是
String
类的对象(就算没有new, 也照样是)
字符串的特点 =
- 字符串的内容永不可变。(重要)
- 因为字符串不可改变,所以字符串是可以共享使用的。
- 字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组。
创建字符串的常见3+1种方式 =
- 3种构造方法
public String()
= 创建一个空白字符串public String(char[] array)
= 根据字符数组内容创建字符串。public String(byte[] array)
: 根据字节数组的内容,创建对应字符串。- 1种直接创建 =
String str = "Helo";
字符串常量池 = 程序当中直接写上的双引号字符串,就在字符串常量池中。new的不在池中。
注意:
- 对于基本类型来说,
==
是进行数值比较 - 对于引用类型来说,
==
是进行地址值的比较
常用String方法:
public boolean equals(Object obj)
= 参数可以是任何对象,只有参数是一个字符串并且内容相同的才会给true;否则返回false.equals
方法具有对称性,即a.equals(b)和b.equals(a)
效果一样。- 如果比较双方一个常量一个变量,推荐将常量字符串写在前面。推荐
"abc".equals(str)
, 不推荐str.equals("abc");
(原因,如果变量为null,比较后程序会报错。)
public boolean equalsIgnoreCase(String str)
public int length()
= 字符串长度public String concat(String str)
= 将当前字符串和参数字符串拼接public char charAt(int index)
= 获取指定索引位置的单个字符。public int indexOf(String str)
=查找参数字符串在本字符串中首次出现的索引位置
静态static关键字
一旦用了static关键字,那么这样的内容就不再属于对象自己,而是属于类的,所以凡是本类的对象,都共享一份数据。
static修饰成员变量
static修饰方法
一旦使用static修饰成员方法,这就成为了静态方法。静态方法不属于对象,而是属于类的。
- 如果没有static,那么必须首先创建对象,然后通过对象才能使用它。
- 对于静态方法来说,可以通过对象名进行调用,也可以直接通过类名称来调用。
类名称.静态方法
- 如果有static关键字,可以不创建对象,直接通过类名称调用它
- 对于本类当中的静态方法,可以省略类名称。
无论是成员变量还是成员方法,如果有static关键字修饰,都推荐用类名称进行调用
- 静态变量:类名称.静态变量
- 静态方法:类名称.静态方法
注意
静态不能访问非静态(重点)
原因:因为在内存当中是先有的静态内容,后有的非静态内容。(先人不知道后人,但是后人知道先人)
静态方法中不能用
this
原因:this代表当前对象,但是静态方法是通过类调用的,和对象没有关系。
static内存图
注意:根据类名称访问静态成员变量时,全程和对象没有关系,只和类有关系。
静态代码块
- 格式:
public class 类名称 { static { // 静态代码块内容 } }
- 特点:当第一次用到本类时,静态代码块执行唯一的一次。
- 静态内容优先于非静态,所以静态代码块优先于构造方法执行。
- 典型用途:用来一次性地对静态成员变量进行赋值。
Arrays类
两个常用的方法
public static String toString(数组)
: 将参数数组变成字符串public static void sort(数组)
: 按照默认升序对数组的元素进行排序。
Math类
常用方法
public static double abs(double num)
: 获取绝对值public statiic double ceil(double num)
: 向上取整public static floor double floor(double num)
: 向下取整public static long round(double num)
: 四舍五入