类和对象


类的介绍
  • 对象是类的实例化,类是对象的抽象
  • 可以通过new关键字来实例化一个类
类名 +  实例名称 = new 类名();
  • 类的三大特性
  • 封装
  • 继承
  • 多态
  • 类的构造器也叫做构造方法,实例化的对象可对类的构造器进行调用
  • 一个类即使什么也不写,也会存在一个构造器(构造方法
  • 构造方法的名称必须和类名相同,且无返回值
  • 构造器本质是用于给实例化对象初始化

生成构造器的快捷键:alt + insert

1.弹出来的窗口选择ok创建 带参的构造器

2.弹出来的窗口选择取消选择创建 不带参数的构造器


类的封装
  • 高内聚,低耦合
  • private 实现封装(一般来说对属性封装,对方法公开)
  • 封装的好处
  1. 提高程序的安全性,保护数据
  2. 隐藏代码的实现细节
  3. 统一接口
  4. 提高系统的可维护性
  • 属性私有,get/set

一个设置get方法和set方法的快捷键:alt + insert

弹出来的窗口选择 Getter和Setter


类的继承
  • 继承的本质其实是类的抽象
  • Java只有单继承,没有多继承
    一个父类可以有多个子类,但是一个子类只能有一个父类
  • 关键字 extends:子类(派生类)是父类(基类)的扩展
  • 子类和父类之间是“is a”的关系
  • 子类继承父类,可以继承父类的所有公开属性和方法

public 公共的

protected 受保护的

default 默认的

private 私有的

  • 在Java中,所有的类都默认直接或者间接继承Object类
  • this与super
  • this用于类里头调用类本身的方法或者属性
  • super用于类里头调用其父类的公开的属性和方法
    super的注意点
  1. super调用父类的构造方法,必须在构造方法的第一行
  2. super必须只能出现在子类的方法或者构造方法之中
  3. super和this不能同时调用构造方法(因为this调用构造方法也应该在出现在构造方法的第一行)
  4. main方法中调用子类的无参构造函数时,会默认先调用父类的无参构造函数,如果父类没有无参构造函数(比如在父类中声明了有参构造函数,原本系统默认生成的无参构造函数就会被覆盖,此时子类就无法调用其无参构造函数),则子类也无法生成构造函数
  • 重写
  1. 前提:需要有继承关系,且是子类重写父类的方法
  2. 注意事项:
  • 方法名必须相同,方法体不同
  • 参数列表必须相同
  • 修饰符:子类相较于父类范围可以扩大但不能缩小 public>protected>default>private
  • 抛出的异常:子类相较于父类范围可以缩小但不能扩大
  1. 重写的必要性
  • 父类的功能不一定满足子类的需要,或者父类的功能过于多
  1. 快捷键

alt + insert 选择 方法重写


类的多态
  • 注意事项
  1. 多态是方法的多态,属性没有多态的概念
  2. 父类和子类得有联系,否则会出现类型转换异:ClassCastException!
  3. 一个对象的实例类型是确定的,但是可以指向的引用类型是不确定的。只能由父类的引用指向子类对象!
Person s1 = new Student();   正确
Student s2 = new Person();   错误
  1. 多态的存在条件:存在继承关系,方法需要重写
  • static方法是属于类的,不属于实例,不能重写
  • final是常量,不能重写
  • private是私有方法,不能重写
  1. 子类重写父类的方法之后,如果在main方法中用父类实例调用方法,将执行子类的方法
  • instanceof关键字
  1. 判断一个对象是什么类型
    x instanceof y一般来说,前面的x为一个引用类型的变量,后面的y为一个类或者接口,instanceof用于判断前面的变量是否是后面的类,如果是,结果返回true,否则返回false
  2. 因为引用类型的转换只能在具有继承关系的两个类型之间进行,有时候我们在编译的时候可能没有考虑到这一点,或者我们无法分辨两个类型之间是否具有继承关系,使用instanceof可以帮助我们进行判断,防止出错
if(obj instanceof String)
{
    String str=(String)obj;
}
  • 子类与父类的转换
  1. 把子类转换为父类,向上转型(自动转换)
    可能会丢失自己一部分原本的方法
  2. 把父类转换为子类,向下转型(强制转换)