这种方法名相同,但各自的参数不同,称为方法重载(Overload)。
继承
Java使用extends关键字来实现继承:
注意到我们在定义Person的时候,没有写extends。在Java中,没有明确写extends的类,编译器会自动加上extends Object。所以,任何类,除了Object,都会继承自某个类。
这使得继承的作用被削弱了。为了让子类可以访问父类的字段,我们需要把private改为protected。用protected修饰的字段可以被子类访问:
这种把一个子类类型安全地变为父类类型的赋值,被称为向上转型(upcasting)。
- 继承是面向对象编程的一种强大的代码复用方式;
- Java只允许单继承,所有类最终的根类是
Object; protected允许子类访问父类的字段和方法;- 子类的构造方法可以通过
super()调用父类的构造方法; - 可以安全地向上转型为更抽象的类型;
- 可以强制向下转型,最好借助
instanceof判断; - 子类和父类的关系是is,has关系不能用继承。
多态
-
子类可以覆写父类的方法(Override),覆写在子类中改变了父类方法的行为;
-
Java的方法调用总是作用于运行期对象的实际类型,这种行为称为多态;
-
final修饰符有多种作用:final修饰的方法可以阻止被覆写;final修饰的class可以阻止被继承;final修饰的field必须在创建对象时初始化,随后不可修改。
抽象类
如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。
因为无法执行抽象方法,因此这个类也必须申明为抽象类(abstract class)。
使用abstract修饰的类就是抽象类。我们无法实例化一个抽象类:
Person p = new Person(); // 编译错误
面向抽象编程的本质就是:
- 上层代码只定义规范(例如:
abstract class Person); - 不需要子类就可以实现业务逻辑(正常编译);
- 具体的业务逻辑由不同的子类实现,调用者并不关心。
接口
如果一个抽象类没有字段,所有方法全部都是抽象方法:
包
Java内建的package机制是为了避免class命名冲突;
JDK的核心类使用java.lang包,编译器会自动导入;
JDK的其它常用类定义在java.util. ,java.math. ,java.text.*,……;
包名推荐使用倒置的域名,例如org.apache