类和对象
类的介绍
- 对象是类的实例化,类是对象的抽象
- 可以通过new关键字来实例化一个类
类名 + 实例名称 = new 类名();
- 类的三大特性
- 封装
- 继承
- 多态
- 类的构造器也叫做构造方法,实例化的对象可对类的构造器进行调用
- 一个类即使什么也不写,也会存在一个构造器(构造方法)
- 构造方法的名称必须和类名相同,且无返回值
- 构造器本质是用于给实例化对象初始化
生成构造器的快捷键:alt + insert
1.弹出来的窗口选择ok创建 带参的构造器
2.弹出来的窗口选择取消选择创建 不带参数的构造器
类的封装
- 高内聚,低耦合
private
实现封装(一般来说对属性封装,对方法公开)- 封装的好处
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 提高系统的可维护性
- 属性私有,get/set
一个设置get方法和set方法的快捷键:alt + insert
弹出来的窗口选择 Getter和Setter
类的继承
- 继承的本质其实是类的抽象
- Java只有单继承,没有多继承
一个父类可以有多个子类,但是一个子类只能有一个父类 - 关键字 extends:子类(派生类)是父类(基类)的扩展
- 子类和父类之间是“is a”的关系
- 子类继承父类,可以继承父类的所有公开属性和方法
public 公共的
protected 受保护的
default 默认的
private 私有的
- 在Java中,所有的类都默认直接或者间接继承Object类
- this与super
- this用于类里头调用类本身的方法或者属性
- super用于类里头调用其父类的公开的属性和方法
super的注意点
- super调用父类的构造方法,必须在构造方法的第一行
- super必须只能出现在子类的方法或者构造方法之中
- super和this不能同时调用构造方法(因为this调用构造方法也应该在出现在构造方法的第一行)
- main方法中调用子类的无参构造函数时,会默认先调用父类的无参构造函数,如果父类没有无参构造函数(比如在父类中声明了有参构造函数,原本系统默认生成的无参构造函数就会被覆盖,此时子类就无法调用其无参构造函数),则子类也无法生成构造函数
- 重写
- 前提:需要有继承关系,且是子类重写父类的方法
- 注意事项:
- 方法名必须相同,方法体不同
- 参数列表必须相同
- 修饰符:子类相较于父类范围可以扩大但不能缩小 public>protected>default>private
- 抛出的异常:子类相较于父类范围可以缩小但不能扩大
- 重写的必要性
- 父类的功能不一定满足子类的需要,或者父类的功能过于多
- 快捷键
alt + insert 选择 方法重写
类的多态
- 注意事项
- 多态是方法的多态,属性没有多态的概念
- 父类和子类得有联系,否则会出现类型转换异:ClassCastException!
- 一个对象的实例类型是确定的,但是可以指向的引用类型是不确定的。只能由父类的引用指向子类对象!
Person s1 = new Student(); 正确
Student s2 = new Person(); 错误
- 多态的存在条件:存在继承关系,方法需要重写
- static方法是属于类的,不属于实例,不能重写
- final是常量,不能重写
- private是私有方法,不能重写
- 子类重写父类的方法之后,如果在main方法中用父类实例调用方法,将执行子类的方法
- instanceof关键字
- 判断一个对象是什么类型
x instanceof y
一般来说,前面的x为一个引用类型的变量,后面的y为一个类或者接口,instanceof用于判断前面的变量是否是后面的类,如果是,结果返回true,否则返回false - 因为引用类型的转换只能在具有继承关系的两个类型之间进行,有时候我们在编译的时候可能没有考虑到这一点,或者我们无法分辨两个类型之间是否具有继承关系,使用instanceof可以帮助我们进行判断,防止出错
if(obj instanceof String)
{
String str=(String)obj;
}
- 子类与父类的转换
- 把子类转换为父类,向上转型(自动转换)
可能会丢失自己一部分原本的方法 - 把父类转换为子类,向下转型(强制转换)