面向对象的语言中包含了三大基本特征,封装、继承和多态
public class people {
//属性
int age=22;
String name="limu";
//成员方法 没有static关键字
public void sleep() {
System.out.println("进入休息状态...");
} //休息
public void eat() {
System.out.println("进入吃饭状态");
} //吃饭
public void study() {
System.out.println("进入学习状态");
}//学习
}
创建people的类
通常情况下 一个类并不能直接使用 需要根据类创建一个对象 ,才能使用
import 导包 、也就是指出需要使用的类 在什么位置
import 包名称 类名称
当和当前类属于同一个包的情况 可以省略不写
通过类创建一个对象
类名称 对象名 =new 类名称()
使用 :
使用成员变量 :对象名.成员变量名
使用成员方法 : 对象名.成员方法名
带有static 的方法就是普通的方法 不需要类和对象就能生成
使用对象类型作为方法的参数
java成员变量和局部变量的区别
// 定义的位置不一样
局部变量 :在方法的内部
成员变量:在方法的外部直接写在类当中
//作用范围不一样
局部变量:只有在方法中能使用
成员变量:整个类都可以通用
//默认值不一样
局部变量:没有默认值
成员变量:如果没有赋值,会有默认值
面对对象的三大特性:之封装性
封装性在java里的体现
1、方法就是一种封装
2、关键字private也是一种封装 代表私有化
间接访问private成员变量 就是定义一对Getter/Setter方法
必须叫setxxx或者getxxx命名规则
对于Getter来说 不能有参数 返回值类型和成员变量对应
对于Setter来说 不能有返回值 参数类型和成员变量对应
this 关键字
//当方法的局部变量和类的成员变量重名的时候,根据就近原则,优先使用局部变量
//如果需要访问本类中的成员变量 需要使用格式
//this.成员变量名
//谁调用的方法,谁就是this
//在方法的内部才能用this
构造方法
构造方法是专门用来创建对象的方法 当我们用new来创建对象的时候 其实就是在调用构造方法
public 类名称(参数类型 参数名称){
//方法体
}
注意事项:
1、构造方法的名称必须和所在的类名称完全一样
2、构造方法不要写返回值类型 连void也不要写
3、用途 用来使用对象
4、new 就是在调用构造方法 用new创建对象的时候就执行了构造方法里的语句
5、如果没有编写任何构造方法 那么编译器就会赠送一个构造方法 没有任何参数、方法
6、一旦编写了任何一个构造方法 那么编译器将不再赠送
7、构造方法也是可以进行重载的、方法名称相同、方法参数不同 这个叫重载
抽象的概念
子类就是一个父类,所以是继承关系
抽象类的关键字 abstract
如果父类当中的方法不确定如何进行{}方法体实现,那么这就应该是一个抽象方法
抽象类不能直接new 创建对象
抽象类可以有构造方法
publuc abstract class abc{}
public abstract void abc(){}
接口的概念
接口就是一种公共的规范标准。
只要符合规范标准 就可以大家通用。
接口定义的基本格式:
//接口就是多个类的公共规范
//接口是一种引用数据类型,最重要的内容就是其中的:抽象方法。
//如何定义一个接口的格式
/* public interface 接口名称{
// 接口内容
* 备注:换成了关键字interface之后,编译生成的字节码文件
* 仍是.java --》 .class
* 如果是java7 那么接口中可以包含的内容有:
*1、常量
*2、抽象方法
* 如果是java8,还可以额外包含有:
*3、默认方法
*4、静态方法
* 如果是java9,还可以包含有:
*5、私有方法
*/
* 接口使用步骤
* 1、接口不能直接使用,必须有一个“实现类”来实现该接口
* 格式:
* public class 实现类名称 implements 接口名称{
* //.......
* }
* 2、接口的实现类必须覆盖重写(实现)接口中所有的抽象方法
* 实现 :去掉abstract 关键字 进行使用
* 3、 创建实现类的对象,进行使用
*注意事项:
*如果实现类并没有覆盖重写接口当中所有的抽象方法
*那么这个实现类自己就必须是抽象类
*
/*
* 在任何版本的java中,接口都能定义抽象方法
* 格式:
* public abstract 返回值类型 方法名称(参数列表);
* 注意事项:
* 1、接口当中的抽象方法,修饰符必须是两个固定的关键字
* 2、public abstract
* 这两个关键字修饰符,可以选择性省略
* 3、方法的三要素,可以随意定义
* 4、 接口中的所有方法不能有具体的实现,
* 也就是说接口中的方法必须是抽象方法
*/
/*
* 从java8开始 ,接口里允许定义默认方法。
* 格式:
* public default 返回值类型 方法名称(参数列表){
* 方法体
* }
* 备注:接口当中的默认方法可以解决接口升级的问题
*/
/*
* 接口的默认方法,可以通过接口实现类对象,直接调用
* 接口的默认方法,也可以被接口实现类进行覆盖重写
*/
接口的私有方法定义
/*
* 从java9开始 java允许接口中定义私有方法。
* 1、普通私有方法,解决多个默认方法直接重复代码问题
```
* 格式 private 返回值类型 方法名称(参数列表){
* 方法体
* }
```
*/
多态性
面向对象三大特征:封装性、继承性、多态性
extends继承或者implementers实现,是多态性的前提
一个对象拥有多个形态 即成为多态性、例如 小明是一个学生,但同时也是一个人
小明同时具备了学生形态、和人类形态
多态的格式和使用:
发红包案例分析:
/*
* 发红包案例分析
* 1、群主的一笔金额,从群主余额中扣除,平均分成n等份
* 2、群友收到红包、分到的红包计到自己的余额中
*
* 用户类:
* 姓名、余额
*
* 群主类:(发红包的个数、发红包的金额)
* 发红包的方法
*
* 普通成员类:(收到的红包金额)
* 收红包的方法
*
* 发红包的逻辑:
* 返回值类型 :ArrayList<integer>
* 方法名称: send
* 参数列表: 1、总共发多少钱 ,2、分成多少份
* `public ArrayList<integer> send(int totalMoney,int count){}`
对象的向上转型和向下转型
/*
* 对象的向上转型,就是父类引用指向之类对象
* 向上转型一定是安全的 从小范围转向了大范围
* 但是向上转型有一个弊端:对象一旦向上转型为父类
* 那么就无法调用子类原本特有的内容
* 解决方案:用对象的向下转型(还原)
*/
/*
* 对象的向下转型,其实是一个还原的动作。
* 格式:
* 子类名称 对象名 = (子类名称) 父类对象;
* 含义:将父类对象,【还原】成为本来的子类对象。
* 本来是猫不能还原成为狗
* Animal animal = new Cat(); //本来是猫向上转型成为动物
* Cat cat = (Cat) animal; //本来是猫 ,
* 已经被当做动物了, 还原回来成为原来的猫
*
* 注意事项:
* A、必须保证对象本来创建的时候,就是猫,才能向下转型为猫
* B、如果对象创建的时候本来不是猫,现在非要向下转型成为猫,就会报错
*/