面向对象
类和对象
1、类是一组具有共同属性和行为的事物的抽象,简单理解,类就是对【事物】的一种【描述】
描述事物,则需要【属性】和【行为】
属性:事物具备的各个特征,例如 -> 手机这个事物的特征(品牌,价格..)
行为:事物能执行的操作,例如 -> (打电话,发短信)
2、 对象的理解
对象代表客观存在的事物
3、 类和对象的关系理解
类是对象的抽象(描述),对象是类的实体
在程序中需要现有类,才能创建出对象!
类的定义
1、类的编写步骤
定义类
编写成员变量
编写类的成员方法
public class //类名{
//成员变量
变量一的数据类型 变量一;
变量二的数据类型 变量二;
……
//成员方法
方法一;
方法二;
……
}
2、成员变量的定义格
【位置发生了变化】在类中方法外
3、成员方法的定义格式
跟之前定义方法的格式相同【static关键字暂时不加】
例题
对象的使用
1、创建对象的格式
格式:类名 对象名 = new 类名();
范例:Phone p = new Phone();
2、成员变量的使用
可输出使用,可赋值使用
格式:对象名.变量名
范例:p.brand
3、成员方法的使用
格式:对象名.方法();
范例:p.call();
例题
练习
对象内存图
1、单个对象
对象在内存中的创建过程:
在堆内存中开辟空间,产生地址值
成员变量在堆内存中出现,并产生默认初始化值(例如:null,0)
将对象地址值,给对象名记录,便于通过对象名调用堆内存中的成员变量
对象的使用:
使用对象名找到堆内存空间中存储的成员变量,替换默认初始值
具体代码: s.age = 28;
将替换后的成员变量取出使用
具体代码:System.out.println(s.age);
使用对象名调用成员方法
具体代码:s.study();
2、多个对象
3、多个对象指向相同内存图
例题
成员变量和局部变量
成员变量定义在类中方法外
局部变量定义在方法当中
区别 | 成员变量 | 局部变量 |
类中位置不同 | 类中方法外 | 方法内或方法声明上 |
内存中位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的存在而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的调用完毕而消失 |
初始化值不同 | 有默认初始化值 | 没有默认初始化值,必须先定义,赋值才能使用 |
例题
封装
1、private关键字
![](https://i-blog.csdnimg.cn/blog_migrate/f2e7f48aab3e906815ccf6307c015e12.png)
练习
2、this关键字
![](https://i-blog.csdnimg.cn/blog_migrate/28923de49fb677f429d80311618efbf4.png)
this内存原理
3、封装
1. 封装 2. 继承 3. 多态
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问成员变量private,提供对应的getXxx()/setXxx()方法
通过方法来控制成员变量的操作,提高了代码的安全性,把代码用方法进行封装,提高了代码的复用性
public class类名{
修饰符 类名 (参数) {
}
}
修饰符:一般都是public
构造方法在创建对象的时候调用执行
举例:Student s = new Student();
例题
构造方法注意事项
练习
一个标准类的制作和测试
API
API
应用程序编程接口
说白了就是java提供好的一些核心类库
2、如何查看API帮助文档?
打开API帮助文档
点击索引选项卡
在搜索框输入要搜索的类
查看该类中的组成部分
例题
String
代表字符串类型的对象
java.lang包,使用不需导包
字符串不可改变、它的值在创建后不可更改
虽然值不可改变、但是值可以被共享使用
字符串效果上相当于字符数组,但底层原理是字节数组
String() 创建一个空的字符串对象,不含任何内容
String(char[] arr) 根据字符数组创建字符串对象
String(byte[] arr) 根据字节数组创建字符串对象
String 变量名 = “字符串内容”
例题
String对象的特点
构造方法每创建一次对象,都会在堆内存中开辟不同的对象空间。
所以,每new一次,都是不同的对象(内存地址不同)
直接定义的字符串内容会存储到堆内存中的常量池里。
字符串内容如果相同,则直接共享使用。
字符串的比较
==号如果比较的是基本数据类型,比较的是具体的值
==号如果比较的是引用数据类型,比较的是对象的地址值
比较字符串内容是否相同,使用equals()方法
例题
StringBuilder
每拼接一个字符串,都会产生新的字符串对象。
这种操作会比较浪费内存空间!
StringBuilder是一个字符串缓冲区。
它可以在原有的空间上继续拼接字符串内容
StringBuilder() 创建一个内容为空的字符串缓冲区对象
StringBuilder(String s) 根据指定字符串创建字符串缓冲区对象
StringBuilder的添加和反转方法
StringBuilder append(Object obj) 向缓冲区添加内容
StringBuilder reverse() 将缓冲区内容进行反转
当一个方法调用后、返回的还是该对象本身,就可以连续调用该方法
StringBuilder与String相互转换
调用toString()方法即可返回一个字符串
通过StringBuilder的有参构造方法将字符串添加即可
ArrayList
介绍
ArrayList集合是一个长度可变的容器
ArrayList集合的长度是可变的
ArrayList集合底层是数组实现
泛型是一种广泛的数据类型,用于约束集合存储的元素数据类型
例如:
我们想存储字符串类型的数据,就可以这样写:ArrayList<String>
我们想存储学生类型的数据,就可以这样写:ArrayList<Student>
ArrayList的构造和添加
public ArrayList() 创建一个空的集合容器
public boolean add(E e) 向集合中添加元素
public void add(int index,E e) 向集合中指定索引位置添加元素
注意:索引参数要保证在集合索引长度范围之内
例题
ArrayList常用方法
public boolean add(E e) 向集合中添加元素
public void add(int index,E e) 向集合中指定索引处添加元素
public boolean remove(Object obj) 删除集合中指定元素
public E remove(int index) 删除集合中指定索引处的元素
public E set(int index,E e) 修改集合中指定索引处的元素
public E get(int index) 获取集合中指定索引处的元素
public int size() 获取集合的长度
例题
学生管理系统
继承
继承的概念
继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重 新定义,以及 追加属性和方法
实现继承的格式
继承通过extends实现 格式:class 子类 extends 父类 { } 举例:class Dog extends Animal { }
继承带来的好处
继承可以让类与类之间产生关系,子父类关系,产生子父类后,子类则可以使用父类中非私有的成员。
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
继承的弊端
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削 弱了子类的独立性
继承的使用
使用继承,需要考虑类与类之间是否存在is..a的关系,不能盲目使用继承