Java之面向对象

169 阅读4分钟

这是我参与更文挑战的第13天,活动详情查看: 更文挑战


类的继承和多态

类的继承(extends)

子类
  1. 可以理解为 子类是父类的一个特例。如矩形为父类,则长方形和正方形都是其子类。

  2. 子类继承父类的属性和方法,子类只需要声明自己特有的东西,但子类也不能继承父类的所有变量和方法。如

    1. 带private修饰的属性和方法
    2. 构造方法
  3. 子类使用extends定义,含义为扩充、扩展。

单继承
  1. Java支持单继承,即只能丛一个类继承。
  2. 多次继承在现实又是普遍的,Java提供了接口机制,允许一个类实现多个接口,这样避免了多重继承的复杂,又实现了多重继承的效果,所以Java的多重继承通过接口实现
super关键字
  1. super指向所在类的父类,用来引用父类的方法和变量。不一定是直接父类的方法,可以是间接父类的。

    1. 在方法中用this( )调用构造方法。
    2. 用super()调用父类的构造方法,且其必须出现在子类构造方法的第一行。
子类对象的创建与实例化过程
  1. 为对象分配内存空间,并初始化为0值
  2. 按继承关系,自顶向下显示初始化
  3. 按继承关系,自顶向下调用构造方法

方法重写

子类中父类成员的隐藏
  1. 当子类中与父类有同名成员变量时,父类成员变量会被隐藏
  2. 当子类的方法和父类的同名、同参数列表、返回值类型事,父类方法被隐藏,子类重写父类的方法。
  3. 隐藏的含义:通过子类对象调用与父类同名的变量和方法时,被操作的是子类的变量和方法。

方法重写规则

  1. 子类中重写方法的返回值类型必须和父类中被重写方法的返回值类型相同、
  2. 子类重写方法的访问权限不能缩小
  3. 子类重写的方法不能抛出新的异常

运行时多态

上溯造型
概念

通过一个父类变量的发出的方法调用,可能执行的是父类的实现,也可能是某个子类的实现,这只能在运行时时刻根据该变量指向的具体对象类型确定

用最简单的一句话就是:父类型的引用指向子类型的对象。用一句比较通俗的话:同一操作作用于不同的对象,可以产生不同的效果。这就是多态。

特征
  1. 具有继承或实现关系
  2. 父类和子类均有一个成员变量a,最后拿到的是父类的a
  3. 父类和子类均有一个say方法,最后执行的是子类的方法(say方法重写)
实现机理

运行时多态的实现机理是动态联编技术,也称晚联编或者运行期联编。联编:将一个方法调用和一个方法体连接到一起,在程序运行前进行联编称作“早联编”,如C语言。Java中除了final,均采用的晚联编技术,这也是被final修饰的方法不能被重写的原因之一。

class Father{
	int a=5;
}
class Son extends Father{
	int a=10;
}
class Test{
    public static void main(String args[]){
        Father f = new Son();///上溯造型,(父类指向子类)
        //成员依旧是父类的,同名方法被子类重写
        System.out.println(f.a);
       
        Son s = (Son)f  ///下塑造性,(父类转成子类)  
    }
}

对象类型的强制转换

概念

对象类型的强制转换也称向下造型或造型,是将父类类型的对象变量强制(显示)地转化为子类类型。

上溯造型,使得父类类型变量可以指向子类对象,但该变量只能访问父类定义的成员,子类特有的被隐藏,只有将其强制转换为具体的子类类型,才能访问特有成员。

instanceof运算符

在Java中使用instanceof测试对象的类型。

aObjectVariable instanceof SomeClass //当aObjectVariable的类型是SomeClass 时返回true,否则返回false
强制类型转换
//格式:(SomeClass)aobjectVariable 
//在进行强制类型转换是,一般先用instanceof进行检查,符合时才转换。
规则
  1. 对象变量转换的目标类型一定是要当前对象类型的子类。这个由编译时编译器检查。
  2. 在运行时也会进行对象类型的检查,例如某个对象进行类型转换时,省略了instanceof测试。并且对象类型不是其要转换目标类型,就会抛出异常。