new一个类即为对象
使用new时除了分配内存空间以外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
构造器(构造方法)
类中的构造器也叫构造方法,是在创建对象是必须调用的,并且构造器有以下两个特点;
- 必须与类的名字相同
- 必须没有返回类型,也不能写void
super和this
super调用父类的的构造方法,必须在构造方法的第一个
super必须只能出现在子类的方法或者构造方法中
super和this不能同时调用构造方法
重写
重写是方法的重写,和属性无关
子类重写父类的方法
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以放大
- 抛出的异常:范围可以缩小,不可以放大
重写即为子类和父类的方法一致,方法体不同
alt+insert即可补充各种方法,override即为重写
多态
多态是方法的的多态,属性没有多态
即同一方法可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象 Father a=mew Son
父类转换为子类需要强制转换 强制转换可能会丢失一些东西
面向对象的三大特点:封装,继承,多态
abstract抽象
抽象类不能去实例化(不能new一个抽象类),只能通过子类去实现它(抽象类只有被继承才能使用):约束!有些情况下,父类只知道其子类应该包含怎样的方法,而无法准确知道这些子类如何去实现该方法。也就是说抽象类是约束子类必须要实现哪些方法,并不关注子类如何去实现它(不关注实现细节)。
抽象类中有构造方法,但是不能new,其构造方法是给子类用的
抽象类里面可以写普通方法,但只要有抽象方法就是抽象类
抽象的抽象:约束!
接口interface
声明类的关键字是class,声明接口的关键字是interface
普通类:只有具体实现
抽象类;具体实现和规范(抽象方法)都有
接口:只有规范!自己无法写方法(专业的约束)约束和实现分离:面向接口编程
接口就是规范,定义的一组规则
接口的本质是契约
接口中定义的属性都是public static final的常量(一般不在接口中定义属性)方法都是public static
接口不能被实例化(new),接口没有构造方法
类实现接口implement 类 implement 接口
实现了接口的类需要重写接口中的方法
内部类
将一个类的定义放在另一个类的定义内部,这就是内部类。而包含内部类的类被称为外部类。
内部类的主要作用如下:
- 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
- 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
- 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
- 内部类允许继承多个非接口类型
注:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为 outer 的外部类和其内部定义的名为 inner 的内部类。编译完成后出现
outer.class
和outer$inner.class
两类。所以内部类的成员变量 / 方法名可以和外部类的相同。
定义成员内部类后,必须使用外部类对象来创建内部类对象,即 内部类 对象名 = 外部类对象.new 内部类();
静态内部类
- 静态内部类不能直接访问外部类的非静态成员,但可以通过
new 外部类().成员
的方式访问。 - 如果外部类的静态成员与内部类的成员名称相同,可通过
类名.静态成员
访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过成员名
直接调用外部类的静态成员。 - 创建静态内部类的对象时,不需要外部类的对象,可以直接创建
内部类 对象名 = new 内部类();
。
匿名内部类
匿名内部类,顾名思义,就是没有名字的内部类。正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写。但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。