在Java中,类不能多继承。啥意思呢?就是说一个类不能既继承A,又继承B,它只能继承一个类,否则在编译时会报错 Class cannot extend multiple classes。

子类继承父类时,会继承父类的成员变量和方法,但是不是所有的成员变量和方法都会继承,这里也常常是笔试题考点。

会继承哪些成员变量呢?

首先这个成员变量必须是非静态的,其次再看访问修饰符,public、protected的会继承,缺省的包访问修饰符修饰的话,子类如果和父类在同一个包下,也会继承。其他都不继承。

如果在子类中没有定义同名的非静态变量,则在子类中可以用this.变量名或者super.变量名获取变量的值,this可以省略。如果在子类中重新定义了同名的非静态变量,则在子类中想获取父类的变量值只能用super.变量名,想获取子类的变量值可以用this.变量名,this也可以省略。注意,子类重新定义同名非静态变量时,变量类型可以为任意类型。

另外一种情况,如果把子类实例赋值给父类变量,则父类变量的成员变量值是父类定义的那个,还是子类定义的那个?如下示例:

    public static void main(String[] args) {
MySuper m = new MySub();
System.out.println(m.a);
System.out.println(m.b);
} static class MySub extends MySuper {
private boolean a = true;
private boolean d = true;
} static class MySuper {
public int a = 0;
protected int b = 1;
public static int d = 3;
}

直接打点获取变量值,是看编译类型的,不看运行时类型。这是和方法调用很大区别的一个地方。

上面会打印

0

1

会继承哪些方法呢?

首先,构造器不会继承,静态方法不会继承,其次再看访问修饰符,public、protected的会继承,缺省的包访问修饰符修饰的话,子类如果和父类在同一个包下,也会继承。其他都不继承。

继承来的方法我们要是自定义实现的话,这就是所谓的重写了。

非静态方法的调用是看调用者的运行时类型的,如果是静态方法的话,则看调用者的编译时类型,因为静态方法不会被继承。

如下示例:

    public static void main(String[] args) {
MySuper m = new MySub();
m.hh();
m.sp();
} static class MySub extends MySuper {
public MySub() {
} @Override
public void hh() {
System.out.println("sub" + 1);
} public static void sp() {
System.out.println(1);
} } static class MySuper { public MySuper() {
} public void hh() {
System.out.println(1);
} public static void sp() {
System.out.println(2);
}
}

以上,hh()是非静态方法,且是public的,MySub可从MySuper继承。MySub又重写了hh()方法。在调用时看调用者的运行时类型,发现其实是MySub类型,就会去执行MySub的hh()方法。

sp()是静态方法,不可被继承。在调用时,看调用者的编译时类型,发现是MySuper类型,就执行MySuper的sp()方法。

下面再讲一下构造器。

构造器是不可被继承的,构造器是不可被继承的,构造器是不可被继承的。重要的事情说三遍。

调用子类构造器时,会先调用父类构造器。什么意思呢?调用父类的哪个构造器呢?

如果子类构造器的实现代码中,第一行用super(参数列表)指定了父类的构造器,则会先调用这个指定的构造器,然后再执行子类构造器中后面的代码。如果没有在第一行用super显式指定构造器,则会调用父类的无参构造器,之后再执行子类构造器中的代码。

    public static void main(String[] args) {
MySuper m1 = new MySub();
MySuper m2 = new MySub(2);
} static class MySub extends MySuper { public MySub() {
System.out.println("MySub 无参");
} public MySub(int a) {
super(a);
System.out.println("MySub 有参");
} } static class MySuper { public MySuper() {
System.out.println("MySuper 无参");
} public MySuper(int a) {
System.out.println("MySuper 有参, 参数值是= " + a);
}
}

再多说一点,类的静态成员变量初始化、静态代码块都是在类加载时执行的,且只会执行一次。类只有在用到的时候才会加载。如果有父类,则会先初始化父类的静态成员变量、执行静态代码块,再初始化子类的静态成员变量、执行静态代码块。注意,这时候,子类、父类的非静态成员变量还没有初始化、非静态代码块还没有执行。类的静态成员变量初始化和静态代码块的执行顺序与代码中的顺序一样。

调用子类的构造器时,会先初始化父类的非静态成员变量、执行父类的非静态代码块,再执行父类的构造器,之后才开始初始化子类的非静态成员变量、执行子类的非静态代码块,最后再执行子类的构造器。类的非静态成员变量初始化和非静态代码块的执行顺序与代码中的顺序一样。

面试的时候碰见过一种极端情况,就是在父类的构造器中调用一个非静态方法,打印一个成员变量的值,这个非静态方法又被子类重写了。子类覆盖了父类的这个成员变量。看打印出什么。

public class Test {
public static void main(String[] args) {
Base obj = new Sub();
System.out.println(obj.x);
System.out.println(obj.getX());
} public static class Base {
int x = 1; public Base() {
this.echo();
this.x = 2;
} public void echo() {
System.out.println("Base.x=" + this.x);
} public int getX() {
return this.x;
}
} public static class Sub extends Base {
int x = 3; public Sub() {this.x = 4;
this.echo();
this.x = 4;
} @Override
public void echo() {
System.out.println("Sub.x=" + this.x);
} @Override
public int getX() {
return this.x;
}
}
}

案例解析:

执行new Sub(),由于第一行不是用super来显式调用父类构造器,所以是隐式地调用父类的无参构造器。Base的无参构造器中调用了this.echo()方法,这个方法又被Sub重写了,所以最终调用的是Sub的echo()方法。

多线程进阶之并发工具类:CountDownLatch、CyclicBarrier的更多相关文章

  1. Java中的4个并发工具类 CountDownLatch CyclicBarrier Semaphore Exchanger

    在 java.util.concurrent 包中提供了 4 个有用的并发工具类 CountDownLatch 允许一个或多个线程等待其他线程完成操作,课题点 Thread 类的 join() 方法 ...

  2. java多线程10:并发工具类CountDownLatch、CyclicBarrier和Semaphore

    在JDK的并发包(java.util.concurrent下)中给开发者提供了几个非常有用的并发工具类,让用户不需要再去关心如何在并发场景下写出同时兼顾线程安全性与高效率的代码. 本文分别介绍Coun ...

  3. java 并发工具类CountDownLatch & CyclicBarrier

    一起在java1.5被引入的并发工具类还有CountDownLatch.CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于ja ...

  4. Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo

    Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...

  5. 30行自己写并发工具类(Semaphore, CyclicBarrier, CountDownLatch)是什么体验?

    30行自己写并发工具类(Semaphore, CyclicBarrier, CountDownLatch)是什么体验? 前言 在本篇文章当中首先给大家介绍三个工具Semaphore, CyclicBa ...

  6. Java并发工具类 - CountDownLatch

    Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http: ...

  7. Java并发工具类CountDownLatch源码中的例子

    Java并发工具类CountDownLatch源码中的例子 实例一 原文描述 /** * <p><b>Sample usage:</b> Here is a pai ...

  8. 多线程学习笔记六之并发工具类CountDownLatch和CyclicBarrier

    目录 简介 CountDownLatch 示例 实现分析 CountDownLatch与Thread.join() CyclicBarrier 实现分析 CountDownLatch和CyclicBa ...

  9. Java中的并发工具类(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)

    在JDK的并发包里提供了很多有意思的并发工具类.CountDownLatch.CyclicBarrier和Semaphore 工具类提供了一种并发流程控制的手段,Exchanger 工具类则提供了在线 ...

随机推荐

  1. MySQL聚簇索引

    聚簇索引并不是一种单独的索引类型,而是一种数据存储方式.具体的细节依赖于其实现方式,但innoddb 的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行. 当表有聚簇索引时,它的数据实际上存 ...

  2. Java中的Unsafe

    在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过.所以花了点时间google了一下. Unsafe的源码:http://www.docjar.com ...

  3. [ An Ac a Day ^_^ ] CodeForces 426C Sereja and Swaps 优先队列

    题意: 给你一个有n个数的序列 取一个区间 这个区间内的数可以与区间外的值交换k次 问这样的区间最大值是多少 思路: 看数据是200 时间复杂度O(n*n) 应该可以暴力 顺便学习一下优先队列 枚举区 ...

  4. javascript焦点图之垂直滚动

    html代码布局,需要用到定位,不细说了 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  5. YaHoo Web优化的14条法则

    Web应用性能优化黄金法则:先优化前端程序(front-end)的性能,因为这是80%或以上的最终用户响应时间的花费所在. 法则1. 减少HTTP请求次数 80%的最终用户响应时间花在前端程序上,而其 ...

  6. html5 画个圈

    <html><body><canvas id="myCanvas" width="200" height="100&qu ...

  7. LYF模板连接.txt

    在解决方案里创建了一个新建网站,在其右键下添加一个模板后,准备使用模板的,在添加新建项里突然没有“使用模板页的web窗体”,顿时感觉悲剧... 解决方法:模板页代码---LYFMaterPage.Ma ...

  8. SQLite : 解决“找不到请求的 .Net Framework 数据提供程序。可能没有安装”的问题

     在使用subsonic 3时,如果不完整安装SQLite的SDK包,直接在项目中使用System.Data.SQLite将引发上述错误. 原因是:是 DBproviderfacotories 没有导 ...

  9. 关于LR监视Windows和linux的说明

    一.监控windows系统: 1.监视连接前的准备工作 1)进入被监视windows系统,开启以下二个服务Remote Procedure Call(RPC) 和Remote Registry Ser ...

  10. kloxo面板教程-折腾了一天

    ------------------------------------------------------------------------------- 前一晚安装了掉线,不得不重新来,有点慢, ...