7.1 类的封装
封装是面向对象的核心思想,将对象的属性和行为封装起来,其载体就是类。
7.2 类的继承
继承在面向对象开发思想中是一个非常重要的概念,它使整个程序架构具有一定的弹性,在过程中复用已经定义完善的类不仅可以减少软件开发周期,还可以提高软件的可维护性和可扩展性。
7.2.1 extends关键字
在Java中,让一个类继承另一个类,用extends关键字
chlid extands parents
chlid继承了parents类
7.2.2 方法的重写
1 .重写的实现
继承并不只是扩展父类的功能,还可以重写父类的成员方法,重写(还可以称为覆盖)就是在子类中将父类的成员方法的名称保留,重写编程成员方法的实现内容,更改成员方法的储存权限,或是修改成员方法的返回值类型。
2. super关键字
如果子类重写了父类的方法,就再也无法调用到父类的方法了吗?为了解决这种需求Java提供了super关键字
2. super关键字
如果子类重写了父类的方法,就再也无法调用到父类的方法了吗?为了解决这种需求Java提供了super关键字
super.property;//调用父类的属性
super.method();//调用父类的方法
7.2.3 所有类的父类-------Object类
所有的类都都直接或间接继承了Java.lang.Object类。Object类是比较特殊的类,它是所有类的父类,是Java类层中最高级层类。
Object类中的几个重要方法
1. getClass()方法
getClass().getName();
getClass()方法是Object类定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。
可以将getClass与toString()方法联合使用
2. toString()方法
toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际的应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString()方法。
3. equals()方法
equals()方法比较是两个对象的实际内容。
7.3 类的多态
7.3.1 方法的重载
以不同的方式来实例化对象,就需要使用多个构造方法来完成。由于这些构造方法都需要根据类名进行命名,为了让方法名相同而形参不同的构造方法同时存在,必须用到“方法重载”。
7.3.2 向上转型
就是把子类对象赋值给父类类型的变量,这就是向上转型。
具体类转化成抽象类
7.3.3 向下转型
抽象类转换成具体类
7.3.4 instanceof关键字
当程序执行向下转换操作时,如果父类对象不是子类对象的实例, 就会发生Class CastException
异常,所以在执行向下转型之前需要养成一个良好的习惯,就是判断父类对象是否为子类对象的实例。判断需要instanceof关键字来操作。
myobject instanceof ExampleClass
// myobject 某类的对象引用
// ExampleClass 某个类
7.4 抽象类与接口
7.4.1 抽象类与抽象方法
在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。回想继承和多态原理,继承树中越是在上方的类越抽象,如鸽子类继承鸟类、鸟类继承动物类等。在多态机制中,并不需要将父类初始化对象,我们需要的只是子类对象,所以在Java语言中设置抽象类不可以实例化对象,因为图形类不能抽象出任何一种具体图形,但他的子类却可以。
Java中定义抽象类时,需要使用abstract关键字,其语法如下:
[权限修饰符] abstract class 类名{
类体
}
使用abstract关键字定义的类称为抽象类,而使用abstract关键字定义的方法称为抽象方法,抽象方法的定义语法如下:
[权限修饰符] abstract 方法返回值类型 方法名(参数列表);
抽象方法没有方法体。
构造方法不能定义为抽象方法。
7.4.2 接口的声明及实现
接口是抽象类的延伸,可以将它看作是
接口使用interface关键字进行定义
[修饰符] interface 接口名 [extends 父类接口名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}
一个类的实现一个接口可以使用implements关键字
public class Parallelogram extends Quadrangle implements drawTest{
}
7.4.3 多重继承
在Java中类不允许多重继承,但使用接口就可以实现多重继承,因为一个类可以同时实现多个接口,这样可以将所有需要实现的接口放置在implements关键字后并使用逗号“ ,”隔开,但这可能会在一个类中产生庞大的代码量,因为继承一个接口时需要实现接口中所有的方法。
7.4.4 区分抽象类与接口
7.5 访问控制
7.5.2 Java类包
同一个包中的类互相访问时,可以不指定包名。
在类中定义包名的语法如下:
package 包名1[.包名2[.包名3.。。。。。]]
在使用import关键字时,可以指定类的完整描述,但如果为了使用包中更多的类,则可以在包名后加.*,这样表示可以在程序中使用包中的所有类。
import com.lzw.*; //指定com.lzw包中的所有类在程序中都可以使用
impor com.lzw.Math; //指定com.lzw包中的Math类在程序中可以使用
7.5.3 final关键字
1.final关键字
定义为final的类不能被继承。
final类的语法如下:
final class 类名{}
如果将某个类的设置为final形式,则类中的所有方法都被隐式地设置为final形式。
2. final方法
定义为final的方法不能被重写。
将方法定义为final类型可以防止子类修改类的定义与实现方式,同时定义final的方法的执行效率要高于非final方法。
3. final变量
7.6 内部类
在类中定义一个类,则将在类中再定义的那个类称为内部类。
7.6.1 成员内部类
1.成员内部类简介
在一个类中使用内部类,可以在内部类中直接存取其所在类的私有成员变量。
成员内部类的语法如下
public class OuterClass{
private class InnerClass{
//........
}
}
2. 内部类向上转型为接口
如果将一个权限修饰符为private的内部类向上转型为其父类对象,或者直接向上转型为一个接口,在程序中就可以完全隐式内部类的具体实现过程。
3. 使用this关键字获取内部类与外部类的引用
如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字
7.6.2 局部内部类
内部类不仅可以在类中进行定义,也可以在类的局部位置定义,如在类的方法或任意的作用域中均可以定义内部类。
7.6.4 静态内部类