面向对象主要特征
继承:子类自动共享父类属性和方法的机制。
封装:隐藏对象的内部细节,只向外部提供接口,降低对象间的耦合度。
多态:对于子类,可以用不用的方法替代实现父类的服务的方法。
继承的含义
- 在Java中定义一个类时,让该类通过关键字extends继承一个已有的类,这就是类的继承(泛化)。
- 被继承的类称为父类(超类,基类),新的类称为子类(派生类)。
- 子类继承父类的所有属性和方法,同时也可以增加自己的属性和方法。
[修饰符] class 子类名 extends 父类名
规则:
- java只支持单继承
- 一个父类可以有多个子类
- 子类继承父类所有的属性和方法
调用构造方法
可用 this 或者 super 调用其他的构造方法
super():调用父类的构造器,只能出现在子类的构造器中,且必须是第一行。
this();调用本类的构造器,只能卸载构造器的第一行。
同一个构造器中不能同时出现 super() 和 this()。
super (参数1,参数2,…);
封装
权限修饰符:
方法的覆盖
还可以称为重写(rewrite),是对从父类中继承来的方法进行改造,只有在子类继承父类时发生。
规则:
- 相同的方法名
- 相同的参数列表(参数数量、参数类型、参数顺序都要相同)
- 相同的返回值类型
- 子类覆盖方法的访问权限要不小于父类中被覆盖方法的访问权限
abstract
访问权限修饰符] abstract 返回值类型 抽象方法名 (参数列表) ;
只有方法声明,没有方法实现的方法
抽象方法需要子类重写该方法,因此不能用private、final修饰
final
final可以修饰的元素
- 类:不能被继承
- 变量(属性和局部变量):不能被重新赋值 在声明时赋值,或在构造器中赋值 系统不会对final属性默认的赋初始值
- 方法:不能在子类中被覆盖,即不能修改
抽象类
[访问权限修饰符] abstract class 类名 {
……
}
抽象类是抽象方法和非抽象方法的集合,
抽象类中可以全部是抽象方法
抽象类中可以全部为非抽象方法
接 口(interface)
接口可以使方法的定义和实现相分离,降低模块间或系统间的耦合性
接口的成员:
- 常量(字段)
- 抽象方法
[访问权限修饰符] interface 接口名 {
接口的成员
}
注意:
- 接口不是一个类,没有构造器,不能被实例化
- 接口使用interface关键字来定义,而不是class
- 接口默认: 常量:public static final 抽象方法: public abstract
JKD8开始,添加了一种新功能-默认方法。默认方法允许接口方法定义默认实现,而所有子类都将拥有该方法及实现。
[访问权限修饰符] interface 接口名 {
default 方法返回值 方法名(形参){
方法体; } }
final常用方式
- 按照常量含义,对应放置在特定的抽象类或接口中;
- 把常量设置为静态static,多个实例共享该常量,没有必要每个对象保存一份;
- 常量设置为final类型,赋值以后不能再改变;
- 最后注意遵守常量命名规范,所有字母大写、单词之间用下划线。
引用数据类型的转换
上溯造型
向上转型(Upcasting)— 子类转换为父类,自动转换;
下溯造型
向下转型(Downcasting):强制转换
instanceof 运算符
通过
instanceof
来判断是哪一个子类的。
多态
多态存在的三个必要条件
- 要有继承,或实现
- 要有重写
- 父类引用指向子类对象
内部类
内部类特性
- 内部类就是定义在另一个类内部的类。
- 内部类对于同一包中的其它类来说,内部类能够隐藏起来。
[访问权限修饰符] class 类名{
[访问权限修饰符] class 类名{
内部类成员
}
外部类成员
}
注意:
- 内部类可以访问其外部类中所有的属性和方法,无需创建外部类的对象。
- 必须创建内部类的对象,否则无法从外部类访问内部类的变量和方法。
- 如果内部类中有和外部类同名的变量或方法,则内部类的变量和方法将获
- 得比外部类的变量和方法更高的优先级。
- 不能定义static变量
内部类权限
普通类的访问权限修饰符
- default
- public
内部类的访问权限修饰符
- default
- public
- protected
- private
静态内部类
用
static标识
的内部类为静态内部类。
静态内部类特点:
- 静态内部类作为外部类的静态成员,不能访问外部类非静态成员。
- 非静态内部类只能定义非静态成员,而静态内部类可以定义静态成员和非静态成员。
静态内部类实例化:
- 使用Outer.Inner inn=new Outer.Inner()方式实例化静态内部类。
- 非静态内部类不可以使用上面的方式实例化。
[访问权限修饰符] class 类名{
[访问权限修饰符] static class 类名{
内部类成员
}
外部类成员
}
局部内部类
在一个类的方法体中或程序块内定义的内部类。
局部内部类特点:
在方法定义的内部类中只能访问方法中的final类型的局部变
匿名内部类
没有定义类名
的内部类,称为匿名内部类
匿名内部类特点:
- 匿名内部类没有访问修饰符。
- new 匿名内部类,这个类首先是要存在父类或接口。
- 外部类方法形参或局部变量需要被匿名内部类使用,必须为final。
new 父类|接口(){
//重写父类或接口的抽象方法
}