class Father {
private String str;
publicFather() {
System.out.println("父类无参");
}
publicFather(String str) {
this.str = str;
System.out.println("父类有参");
}
}
class Son extends Father {
publicSon(String str) {
//super(str);
System.out.println("子类有参");
}
}
publicclassDemo {publicstaticvoidmain(String args[]) {
Father f = new Son("HELLO");
}
}
覆写
方法的覆写
覆写代码执行结果分析要素
实例化的哪个类
这个实例化的类里面调用的方法是否被覆写过
没被覆写调用的是父类
子类覆写方法的访问权限不能比父类更严格
父类方法用private声明,子类不能覆写
子类调用父类被覆写的方法,可以用super.方法()来访问
属性的覆写
属性不封装,子类定义相同名称的属性
this和super
this
super
调用本类构造,方法,属性
调用父类构造,方法,属性
先查找本类中是否有指定的调用结构,如果有直接调用,没有调用父类定义
直接调用父类操作
表示本类当前对象
final
fianl称为终结器,可以定义类,方法,属性
使用final定义的类不能有子类
使用final定义的方法不能被子类覆写
使用final定义的变量就是常量
final class A {
}
publicfinalvoidprint() {
}
finaldouble PI = 3.14;
publicstaticfinal String MSG = "HELLO";//全局常量
多态
方法的多态:重载, 覆写
对象的多态:向上转型, 向下转型
重载
同一个方法名称,根据不同的参数类型和个数完成不同的功能
覆写
同一个方法,根据实例化的子类对象不同完成不同的功能
向上转型
子类对象变为父类对象 (自动转换)
格式: 父类 父类对象 = 子类实例
用途:参数的统一
通过子类实例化的父类对象能调用的方法只能是父类中定义过的方法
向下转型
父类对象变为子类对象(强制转换)
格式: 子类 子类对象 = (子类)父类实例
用途:调用子类特殊方法
??父类对象要调用实例化它的子类中的特殊方法
抽象类
基础
作用:从语法上明确定义子类需要覆写的方法。
定义:抽象类 = 普通类 + 抽象方法
抽象方法: abstract定义 + 没有方法体
抽象类: abstract声明 + 有抽象方法
使用抽象类:
抽象类必须有子类
强制子类覆写
通过子类实例化向上转型完成抽象类实例化
限制
抽象类中可以定义内部的抽象类,子类也可以定义内部类来继承抽象内部类
//定义抽象类的内部类abstract class A {
abstract class B {
publicabstractvoidprint();
}
}
class X extends A {
publicvoidprint() {
System.out.println("HELLO");
}
class Y extends B {//不同于其他必须,这个(定义内部抽象类的子类)是非必须的publicvoidprint() {
}
}
}
//static定义的内部抽象类为外部类abstract class A {
staticabstract class B {
publicabstractvoidprint();
}
}
class X extends A.B {
publicvoidprint() {
System.out.println("HELLO");
}
}
publicclassDemo {publicstaticvoidmain(String args[]) {
A.B ab = new X();
ab.print();
}
}
隐藏抽象类子类
abstract class A {
publicabstractvoidprint();
privatestaticclassBextendsA {publicvoidprint() {
System.out.println("WORLD");
}
}
publicstatic A getInstance() {
returnnew B();
}
}
publicclassDemo {publicstaticvoidmain(String args[]) {
A a = A.getInstance();
a.print();
}
}
范例
class A {
publicvoidfun() {
this.print();
}
publicvoidprint() {
System.out.println("A");
}
}
class B extends A{
publicvoidprint() {
System.out.println("B");
}
}
publicclassDemo {publicstaticvoidmain(String args[]) {
B b = new B();
b.fun();
}
}