类和对象简介
📔 类和对象
📄 客观存在的事物都可以看作对象;
📄 类是对现实生活中一类具有共同属性和行为的事物的抽象;
📄 对象是能够看得见摸得着的真实存在的实体。
📔 类的定义
📄 类是Java程序的基本单位;
📄 类的组成:属性和行为
- 属性:在类中通过成员变量来体现(类中方法外的变量);
- 行为:在类中通过成员方法来体现(和前面的方法相比去掉static即可);
📔 类的定义步骤
- 定义类;
- 编写类的成员变量;
- 编写类的成员方法;
public class ClassName{//成员变量变量1的数据类型 变量1;变量2的数据类型 变量2;……//成员方法方法1;方法2;……}/*创建对象 *类名 对象名 = new 类名(); */
面向对象中的内存分配
📔 对象内存
📄 **Student s = new Student();**
📄 其中,s 指向栈内存,new Student() 地址在堆内存中;
📔 类中成员变量和局部变量区别
| 区别 | 成员变量 | 局部变量 |
|---|---|---|
| 类中位置不同 | 类中方法外 | 方法内或者方法声明上 |
| 内存中位置不同 | 堆内存 | 栈内存 |
| 生命周期不同 | 随着对象的存在而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的调用完毕而消失 |
| 初始化值不同 | 有默认初始化值 | 没有默认的初始化值,必须先定义,赋值,才能使用 |
封装
📔 private关键字
📄 权限修饰符;
📄 可以修饰成员(成员变量和成员方法);
📄 作用是保护成员不被别的类使用,被private修饰的成员只能在本类中才能访问;
📔 this关键字
📄 this修饰的变量指代成员变量;
📄 解决局部变量隐藏的成员变量;
📄 代表所在类对象的引用;
📔 封装
📄 将某些信息隐藏在类内部,不允许外部直接访问,必须通过方法访问;
📄 提高安全性;
构造方法
📔 构造方法又叫做构造器,是类的一个特殊成员,它会在类实例化对象的时候自动调用;
📄 作用:创建对象;
📄 功能:创建对象时完成初始化;
📄 语法:
[修饰符] 方法名 ([参数列表]){//方法体}
📔 构造方法注意事项
📄 当类中没有构造方法时,系统会默认生成一个无参的方法;
📄 构造方法创建:
- 如果没有定义构造方法,系统将给出一个默认的无参数构造方法;
- 如果定义了构造方法,系统将不再提供默认的构造方法;
📄 构造方法重载:如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法;
📄 推荐形式:无论是否使用,都手工书写无参的构造方法;
📔 API(Application Programming Interface):应用程序编程接口(们只需关注使用方法,不需要关注其实现的过程。)
String类
📄 String类在java.lang包下,所以使用的时候不需要导包;
📄 String类代表字符串,Java程序中的所有字符串文字都被实现为此类的实例,也就是说,Java程序中所有的使用双引号的字符串,都是String类的对象;
字符串的特点
📄 字符串不可改变,它们的值在创建后不能被更改;
📄 虽然String的值不能被更改,但是它们可以被共享;
📄 字符串效果上相当于字符数组(char[])——jdk8及以前是字符数组,jdk9及以后是字节数组,但是底层原理是字节数组(byte[]);
| 方法名 | 说明 |
|---|---|
| public String() | 创建一个空白字符串对象,不含任何内容 |
| public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
| public String(byte[] bys) | 根据字节数组的内容,来创建字符串对象 |
| String s = “abc” | 直接赋值的方式创建字符串对象,内容就是abc |
String s1 = new String();System.out.println("s1:" + s1);/*控制台输出:s1:*/
char[] chs = {'a','b','c'};String s2 = new String(chs);System.out.println("s2:" + s2);/*控制台输出s2:abc*/
byte[] bys = {97,98,99}; //字节直接输入整数String s3 = new String(bys);System.out.println("s3:" + s3);/*控制台输出s3:abc*/
String s4 = "abc";System.out.println("s4:" + s4);/*控制台输出s4:abs*/
String 对象的特点
- 通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址不同;
- 以 “” 给出的字符串对象,只要字符序列相同(顺序和大小写),无论在程序代码中出现多少次,JVM都只会建立一个String对象,并在字符串池中维护。
字符串比较
📔 使用 == 做比较
📄 基本类型:比较的是数据值是否相同;
📄 引用类型:比较的是地址值是否相同;
📔 字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫做:**equals()**;
📄**public boolean equals(Object anObject)**: 将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串。
public static void main(String[] args) {char[] chs = {'a','b','c'};String s1 = new String(chs);String s2 = new String(chs);String s3 = "abc";String s4 = "abc";System.out.println("s1 and s2:" + (s1 == s2));System.out.println("s1 and s3:" + (s1 == s3));System.out.println("s3 and s4:" + (s3 == s4));System.out.println("_____________________");//比较内容System.out.println("s1 and s2:" + s1.equals(s2));System.out.println("s1 and s3:" + s1.equals(s3));System.out.println("s3 and s4:" + s3.equals(s4));}/*控制台输出:s1 and s2:falses1 and s3:falses3 and s4:true_____________________s1 and s2:trues1 and s3:trues3 and s4:true*/
String 中的方法
| 方法名 | 说明 |
|---|---|
| public boolean equals(Qbject anObject) | 比较字符串的内容,严格区分大小写 |
| public char charAt(int index) | 返回指定索引处的 char 值 |
| public int length() | 返回此字符串的长度 |
StringBuilder
public static void main(String[] args){String s = "hello";s += "world";System.out.println(s);}
📔 在此段代码中,在堆内存中:
- 首先在常量池中,生成一个
**"hello"**字段; - 再在常量池中生成
**"world"**字段; - 最后再生成
**"helloworld"**字段;
📄 即生成了三个字段,这种操作耗费空间;Java提供了 StringBuilder 类来避免这种操作。
**StringBuilder**是一个可变的字符串类,我们把它看成一个容器;- 这里的可变指的是
**StringBuilder**对象中的内容是可变的; **StringBuilder**和**String**类的区别:**String**:内容不可变;**StringBuilder**:内容可变;
StringBuilder 的构造方法
StringBuilder 类中的方法使用
📔 **append()**方法:添加数据,返回对象本身;
public static void main(String[] args) {StringBuilder sb = new StringBuilder();sb.append("Hello ");sb.append("World");System.out.println("sb:" + sb);}/*控制台输出sb:Hello World*/
public static void main(String[] args) {StringBuilder sb = new StringBuilder();//链式编程sb.append("Hello ").append("World");System.out.println("sb:" + sb);}/*控制台输出sb:Hello World*/
📔 **reverse()** 反转方法:
public static void main(String[] args) {StringBuilder sb = new StringBuilder();sb.append("Hello ");sb.append("World");sb.resver();System.out.println("sb:" + sb);}/*控制台输出sb:dlroW olleH*/
StringBuilder 和 String 相互转换
📄 StringBuilder 转化为 String 使用 **toString()** 方法;
📄 String 转化为 StringBuilder 通过构造方法实现;
public static void main(String[] args) {//StringBuilder 转化为 StringStringBuilder sb = new StringBuilder();sb.append("Hello World");String s = sb.toString();System.out.println("s:" + s);//String 转化为 StringBuilderString s1 = "Hello World";StringBuilder sb1 = new StringBuilder(s1);System.out.println("sb1:" + sb1);}/*控制台输出:s:Hello Worldsb1:Hello World*/
集合基础
📔 集合的特点:提供一种存储空间可变的存储模型,存储的数据容量可以方法改变;
📄 集合类很多,介绍 ArrayList
📔 使用之前要导包
📄**ArrayList<E>**
- 可调整大小的数组实现
**<E>**:是一种特殊的数据类型,泛型;- 在出现
的地方使用引用数据类型替换即可;
📃**ArrayList<String>**;
📃**ArrayList<Student>**;
| 方法名 | 说明 |
|---|---|
| public ArrayList() | 创建一个空的集合对象 |
| public boolean add(E e) | 将指定的元素追加到此集合的末尾 |
| Public void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
📑 插入元素不能索引越界,最多只能多一个位置——即有2个元素,则索引为0,1;插入位置最多只能2,不能超过2;
import java.util.ArrayList;public class day11_test3 {public static void main(String[] args) {//jdk1.7后新特性,new 后面的<>中类型可以自动从前面推导ArrayList<String> array = new ArrayList<>();//使用 add()方法添加元素array.add("Hello");array.add("World");System.out.println("array:" + array);//使用 public void add(int index,E element)在指定位置添加(插入)元素array.add(1, "javaSE");System.out.println("array:" + array);}}/*控制台输出:array:[Hello, World]array:[Hello, javaSE, World]*/
📔 ArrayList 常用方法
| 方法名 | 说明 |
|---|---|
| public boolean remove(Object o) | 删除指定的元素,返回删除是否成功 |
| public E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
| public E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
| public E get(int index) | 返回指定索引处的元素 |
| public int size() | 返回集合中元素的个数 |
