文章目录
继承
继承的性质
- 继承用于提供代码的复用性,子类可以直接拥有父类的所有属性。
- 在java中,一个类最多拥有一个父类,即只能实现单继承。但可以实现多层继承,即子类继承父类,父类继承孙子类。也就是说,一个类既可以是父类,也可以是子类。
- 两个类是否是继承关系,可以用“is”来判断。(子类一定是一个特殊的父类)
继承的语法
子类 extends 父类
方法重写(override/overwrite)
在继承关系下,子类可以覆盖父类的方法,这种行为就叫做方法重写。
要求子类方法与父类方法名字相同,参数相同。
很简单,不举例了。
在子类中如何访问父类的成员?
使用super关键字。
另外,子类无法继承父类的构造方法,所以一般父类有构造方法,会在子类也写一个,第一行调用super();
数据类型的转换
这里的数据类型不是指基本数据类型,而是引用数据类型中的类。接口能不能转我还不知道。
类之间要转型,必须有继承关系。
向上转型可以直接转,也就是说,子类可以直接转成父类。
向下转型就需要强制转换,是有风险的。
为什么要向下转型?
因为运用多态定义的对象只能使用从父类继承的子类方法,要使用子类独有的方法,就要向下转型。
instanceof关键字
作用:判断某个对象是否是某个类的实例
如果是,就可以进行类型转换。
比如:
if(a instance Cat){
Cat c=(Cat)a;
}else{
...
}
多态
首先,明确一点,继承是所有高级特性的基础,没有继承,就没有多态。
多态从语义上理解,意思是“同一类事物具有多种不同的形态”。
放在代码中,指的是“父类的引用指向子类的对象”。
比如:
Animal a=new Tiger();
以上这行代码涉及两个类型:
编译时的类型Animal在编译时起作用,它决定a可以调用哪些方法。
运行时的类型Cat在运行时起作用,它决定a在运行时真正调用的方法。
也就是说,a在运行时能够调用的是经过子类Cat重写的父类Animal中的方法。
以上也叫做动态绑定。
多态的优点,就是扩展性好,面向父类编程。有利于软件版本的更新迭代。
abstract修饰符
之所以把abstract放到这里讲,就是因为目前我觉得多态和抽象类的概念几乎一样。抽象类就相当于多态的应用。
abstract可修饰方法和类:
- 抽象方法:只有方法定义,没有方法的实现。这种方法就是用来被子类覆盖的。
- 抽象类:不能被实例化,只能作为父类来使用。
如果一个类中有一个抽象方法,那它一定是抽象类。
封装
从语义上理解,封装指的就是“信息隐藏”。
在java中封装具体表现在:
- 类本身就是一个封装体。
- 方法本身也是一种封装。
- 可以使用访问修饰符来控制各成员的访问性。
访问修饰符有四种:
private :在同一类内可见
default(什么都不写):在同一包内可见
protected:对同一包内的类和所有子类可见
public: 对所有类可见
一般把属性定义成private,方法定义成public。
下面讲两个修饰符
final
final修饰符可以修饰:
- 属性:代表常量(最好全大写命名)
- 方法:代表不允许重写的方法
- 类:代表不能被继承的类
static
static可修饰:
- 属性:
使用static修饰的属性是属于类的,不使用static修饰的属性是属于对象的。
可以通过类名.属性名来访问。
有时也可以与final结合使用,这个属性就变成了全局的常量。 - 方法:
static方法也通过类名.方法名访问。
不能使用super、this关键字。
不能使用非静态的属性和方法。 - 静态块:
静态块中的代码仅在加载类时被调用一次。
例如
static {
System.out.println(“这是静态块中的代码。”);
}
加载类主要包括以下三种情况:
创建一个类实例。
调用一个静态方法。
使用一个非final的静态属性。
接口
接口是一个特殊的抽象类,接口中只有public、static、final属性及抽象方法。
关键字:interface
优点:面向接口编程,拓展性强,降低耦合。
抽象类和接口有什么区别?
- 抽象类中可以使用普通属性、方法、抽象方法、构造方法;而接口中只能使用public、final、static属性和抽象方法。
- 一个类只能继承一个抽象类;一个接口可以继承多个接口(extends);一个类可以实现多个接口(implements)。
- 通常使用抽象类表示一个概念,而接口表示一种功能。