1.集合
1.1集合概述
提供一个存储空间可变的存储模型,存储的数据容量可以发生变化
集合类有很多,目前我们先学习一个: ArrayList
ArrayList
可调整大小的数组实现
怎么使用泛型
在出现E的地方我们使用引用数据类型替代即可
ArrayListArrayList
1.2ArrayList构造方法和添加方法
| 方法名 | 说明 |
| public ArrayList() | 创建一个空的集合对象 |
| public boolean add(E e) | 将指定的元素追加到此集合的末尾 |
| public void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
1.3ArrayList的常用方法
| 方法名 | 说明 |
| 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() | 返回集合中的元素个数 |
2.继承
2.1继承概述
继承是面向对象三大特征之一。可以使得子类具有雷夫的属性和方法,还可以在子类中重新定义,追加属性和方法
2.1.1继承格式
格式: public class 子类名 extends 父类名{}
public class Zi extends Fu{
}
Fu: 是父类,也被称为基类、超类
Zi: 是子类,也被称为派生类
2.1.2继承中子类的特点
子类可以有父类的内容
子类可以有自己特有的内容
2.2继承的好处和弊端
继承好处
提高了代码的复用性(多个类相同的成员可以放到一个类中)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
继承弊端
继承让类与类之间产生关系,类的耦合性增强了,当父类发生变换时子类实现也不得不跟着变换,削弱了子类的独立性
2.2.1什么时候使用继承
继承体现的关系: is a
假设法: 我有两个类A和B,如果他们满足A是B的一种,或者B是A的一种,就说明他们存在继承关系,这个时候就可以考虑使用继承来体现,否则就不能滥用继承
2.3继承中变量的访问特点
在子类方法中访问一个变量
子类局部范围找
子类成员范围找
父类成员范围找
如果都没有就报错(不考虑父亲的父亲...)
2.4super
super关键字和this关键字的用法相似
this: 代表本类对象的引用
super: 代表父类存储空间的标识(可以理解为父类对象引用)
| 关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
| this | this.成员变量 访问本类成员变量 | this(...) 访问本类的构造方法 | this.成员方法(...) 访问本类成员方法 |
| super | super.成员变量 访问父类成员方法 | super(...) 访问父类构造方法 | super.成员方法(...) 访问父类成员方法 |
2.5继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类中无参的构造方法
因为子类汇集成父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化
每一个子类构造方法的第一条语句默认都是: super()
如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?
通过使用super关键字去显示的调用父类的带参构造方法
在父类中自己提供一个无参构造方法
推荐: 自己给出无参构造方法
2.6继承中成员方法的访问特点
通过子类对象访问一个方法
子类成员范围找
父类成员范围找
如果都没有就报错(不考虑父亲的父亲...)
2.7方法重写
方法重写概述
子类中出现了和父类中一模一样的方法声明
方法重写的应用
当子类需要父类的功能,二功能主体子类有自己特有内容时,可以重写父类中的方法,这样,既沿袭了父类的功能,又定义了子类特有的内容
@Override
是一个注解
可以帮助我们检查重写方法的方法声明的正确性
2.8方法重写的注意事项
私有方法不能被重写(父类私有成员子类是不能继承的)
子类方法访问权限不能更低(public>默认>私有)
2.9Java中继承的注意事项
Java中类只支持单继承,不支持多继承
Java中类支持多层继承
3.修饰符
3.1包
其实就是文件夹
作用: 对类进行分类管理
3.1.1包的定义格式
格式: package 包名;
package test;
3.1.2带包的Java类编译和执行
手动建包:
按照意见的格式编译java文件 javac HelloWorld.java
手动创建包 在E盘建立文件夹com,然后在com下建立文件夹test
把class文件放到包的最里面 把HelloWorld.class文件放到com下的test文件夹下
带包执行 java.com.test.HelloWorld
自动建包: javac -d .HelloWorld.java java.com.test.HelloWorld
3.2导包
使用不同包下的雷士,使用的时候要写写的全路径,写起来太麻烦了
为了简化带包的操作,Java就提供了导包的功能
3.2.1导包格式
格式: import 报名;
import java.util.Scanner;
3.3修饰符
3.3.1修饰符分类
权限修饰符
状态修饰符
3.3.2权限修饰符
| 修饰符 | 同一个类中 | 同一个包中子类 无关类 | 不同包中子类 | 不同包中的无关类 |
| private | √ | |||
| 默认 | √ | √ | ||
| protected | √ | √ | √ | |
| public | √ | √ | √ | √ |
3.3.3状态修饰符
final(最终态)
static(静态)
3.4final
final关键字是最终的意思,可以修饰成员方法,成员变量,类
3.4.1final修饰的特点
修饰方法: 表明该方法是最终方法,不能被重写
修饰变量: 表明该变量是常量,不能再次被赋值
修饰类: 表明该类是最终类,不能被继承
3.5final修饰局部变量
变量是基本类型: final修饰指的是基本类型的数据值不能发生改变
变量是引用类型: final修饰指的是引用数据类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的
3.6static
static关键字是静态的意思,可以修饰成员方法,成员变量
3.6.1static修饰的特点
被类的所有对象共享
这也是我们判断是否使用静态关键字的条件
可以通过类名调用
当然,也可以通过对象名调用
推荐使用类名调用
3.7static访问特点
非静态的成员方法
能访问静态的成员变量
能访问非静态的成员变量
能访问静态的成员方法
能访问非静态的成员方法
静态的成员方法
能访问惊天的成员变量
能访问静态的成员方法
总结成一句话就是: 静态成员方法只能访问静态成员
4.多态
4.1多态概述
同一个对象,在不同时刻的表现出的不同形态
举例: 猫
我们可以说猫是猫: 猫 cat = new 猫();
我们也可以说猫是动物: 动物 animal = new 猫();
这里猫在不同的时刻表现出来了不同的形态,这就是多态
多态的前提和体现
有继承/实现关系
有方法重写
有父类引用指向之类对象
4.2多态中成员访问特点
成员变量: 编译看左边,执行看左边
成员方法: 编译看左边,执行看右边
为什么成员变量金额成员方法的访问不一样呢?
因为成员方法有重写,而成员变量没有
4.3多态的好处和弊端
多态的好处: 提高了程序的扩展性
具体体现: 定义方法的时候,使用父类作为参数,将来在使用的时候,使用具体的子类类型参与操作
多态的弊端: 不能使用子类特有功能
4.4多态中的转型
向上转型
从子到父
父类引用指向子类对象
向下转型
从父到子
父类引用转为子类对象
5.抽象类
5.1抽象类概述
在Java中,一个没有方法体的方法应该定义为抽象方法,二类中如果有抽象方法,该类必须定义为抽象类
5.2抽象类的特点
抽象类和抽象方法必须使用abstract关键字修饰
public abstract class 类名{}
public abstract void eat();
抽象类中不一定有抽象方法,有抽象方法一定是抽象类
抽象类不能实例化
抽象如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态
抽象类的子类
要么重写抽象类中的所有抽象方法
要么是抽象类
5.3抽象类的成员特点
成员变量
可以是变量
也可以是常量
构造方法
有构造方法,但是不能实例化
那么,构造方法的作用是什么呢?用于子类访问父类数据的初始化
成员方法
可以有抽象方法: 限定子类必须完成某些动作
也可以有非抽象方法: 提高代码复用性
6.接口
6.1接口概述
接口就是一种公共的规范标准,只要符合规范标准,大街都可以通用
Java中的接口更多的体现在对行为的抽象
6.2接口的特点
接口用关键字interface修饰
public interface 接口名{}
类实现接口implement表示
public class 类名 implement 接口名{}
接口不能实例化
接口如何实例化呢?参照多态的方式,通过实现对象实例化,这叫接口多态
多态的形式: 具体类多态,抽象类多态,接口多态
多态的前提: 有继承或者实现关系;有方法重写;有父(类/接口)引用指向(子/实现)类对象
接口的实现类
要么重写接口中的所有抽象方法
要么是抽象类
6.3接口的成员特点
成员变量
只能是常量
默认修饰符: public static final
构造方法
接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在
一个类如果没有父类,默认继承自Object类
成员方法
只能是抽象方法
默认修饰符: public abstract
关于接口中的方法,JDK8和JDK9中有一些新特性,后面再讲解
6.4类和接口的关系
类和类的关系
继承关系,只能单继承,但是可以多层继承
类和接口的关系
实现关系,可以但实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口和接口的关系
继承关系,可以单继承,也可以多继承
6.5抽象类和接口的区别
成员区别
抽象类 变量,常量;有构造方法;有抽象方法,也有非抽象方法
接口 常量;抽象方法
关系区别
类与类 继承,单继承
类与接口 实现,可以单继承,也可以多实现
接口与接口 继承,单继承,多继承
抽象类是对事物的抽象,而接口是对行为的抽象
7.形参与返回值
7.1类名作为形参和返回值
方法的形参是类名,其实需要的是该类的对象
方法的返回值是类名,其实返回的是该类型的对象
7.2抽象类名作为形参和返回值
方法的形参是抽象类名,其实需要的是该抽象类的子类对象
方法的返回值是抽象类名,其实返回的是该抽象类的子类对象
7.3接口名作为形参和返回值
方法的新参是接口名,其实需要的是该接口的实现类对象
方法的返回值的接口名,其实返回的是该接口的实现类对象



