java构造函数重载继承_Java基础-继承 - 写代码换盆的个人空间 - OSCHINA - 中文开源技术交流社区...

访问权限

Java 中有三个访问权限修饰符:private、protected 以及 public,如果不加访问修饰符,表示包级可见。

可以对类或类中的成员(字段和方法)加上访问修饰符。

类可见表示其它类可以用这个类创建实例对象。

成员可见表示其它类可以用这个类的实例对象访问到该成员;

protected 用于修饰成员,表示在继承体系中成员对于子类可见,但是这个访问修饰符对于类没有意义。

设计良好的模块会隐藏所有的实现细节,把它的 API 与它的实现清晰地隔离开来。模块之间只通过它们的 API 进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念被称为信息隐藏或封装。因此访问权限应当尽可能地使每个类或者成员不被外界访问。

如果子类的方法重写了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例去代替,也就是确保满足里氏替换原则。

字段决不能是公有的,因为这么做的话就失去了对这个字段修改行为的控制,客户端可以对其随意修改。例如下面的例子中,AccessExample 拥有 id 公有字段,如果在某个时刻,我们想要使用 int 存储 id 字段,那么就需要修改所有的客户端代码。

public class AccessExample {

public String id;

}

可以使用公有的 getter 和 setter 方法来替换公有字段,这样的话就可以控制对字段的修改行为。

public class AccessExample {

private int id;

public String getId() {

return id + "";

}

public void setId(String id) {

this.id = Integer.valueOf(id);

}

}

但是也有例外,如果是包级私有的类或者私有的嵌套类,那么直接暴露成员不会有特别大的影响。

public class AccessWithInnerClassExample {

private class InnerClass {

int x;

}

private InnerClass innerClass;

public AccessWithInnerClassExample() {

innerClass = new InnerClass();

}

public int getValue() {

return innerClass.x; // 直接访问

}

}

抽象类与接口

1. 抽象类

抽象类和抽象方法都使用 abstract 关键字进行声明。如果一个类中包含抽象方法,那么这个类必须声明为抽象类。

抽象类和普通类最大的区别是,抽象类不能被实例化,只能被继承。

public abstract class AbstractClassExample {

protected int x;

private int y;

public abstract void func1();

public void func2() {

System.out.println("func2");

}

}

public class AbstractExtendClassExample extends AbstractClassExample {

@Override

public void func1() {

System.out.println("func1");

}

}

// AbstractClassExample ac1 = new AbstractClassExample(); // 'AbstractClassExample' is abstract; cannot be instantiated

AbstractClassExample ac2 = new AbstractExtendClassExample();

ac2.func1();

2. 接口

接口是抽象类的延伸,在 Java 8 之前,它可以看成是一个完全抽象的类,也就是说它不能有任何的方法实现。

从 Java 8 开始,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高了。在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类,让它们都实现新增的方法。

接口的成员(字段 + 方法)默认都是 public 的,并且不允许定义为 private 或者 protected。从 Java 9 开始,允许将方法定义为 private,这样就能定义某些复用的代码又不会把方法暴露出去。

接口的字段默认都是 static 和 final 的。

public interface InterfaceExample {

void func1();

default void func2(){

System.out.println("func2");

}

int x = 123;

// int y; // Variable 'y' might not have been initialized

public int z = 0; // Modifier 'public' is redundant for interface fields

// private int k = 0; // Modifier 'private' not allowed here

// protected int l = 0; // Modifier 'protected' not allowed here

// private void fun3(); // Modifier 'private' not allowed here

}

public class InterfaceImplementExample implements InterfaceExample {

@Override

public void func1() {

System.out.println("func1");

}

}

// InterfaceExample ie1 = new InterfaceExample(); // 'InterfaceExample' is abstract; cannot be instantiated

InterfaceExample ie2 = new InterfaceImplementExample();

ie2.func1();

System.out.println(InterfaceExample.x);

3. 比较

从设计层面上看,抽象类提供了一种 IS-A 关系,需要满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。

从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。

接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。

接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。

4. 使用选择

使用接口:

需要让不相关的类都实现一个方法,例如不相关的类都可以实现 Comparable 接口中的 compareTo() 方法;

需要使用多重继承。

使用抽象类:

需要在几个相关的类中共享代码。

需要能控制继承来的成员的访问权限,而不是都为 public。

需要继承非静态和非常量字段。

在很多情况下,接口优先于抽象类。因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。

super

访问父类的构造函数:可以使用 super() 函数访问父类的构造函数,从而委托父类完成一些初始化的工作。应该注意到,子类一定会调用父类的构造函数来完成初始化工作,一般是调用父类的默认构造函数,如果子类需要调用父类其它构造函数,那么就可以使用 super() 函数。

访问父类的成员:如果子类重写了父类的某个方法,可以通过使用 super 关键字来引用父类的方法实现。

public class SuperExample {

protected int x;

protected int y;

public SuperExample(int x, int y) {

this.x = x;

this.y = y;

}

public void func() {

System.out.println("SuperExample.func()");

}

}

public class SuperExtendExample extends SuperExample {

private int z;

public SuperExtendExample(int x, int y, int z) {

super(x, y);

this.z = z;

}

@Override

public void func() {

super.func();

System.out.println("SuperExtendExample.func()");

}

}

SuperExample e = new SuperExtendExample(1, 2, 3);

e.func();

SuperExample.func()

SuperExtendExample.func()

重写与重载

1. 重写(Override)

存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法。

为了满足里式替换原则,重写有以下三个限制:

子类方法的访问权限必须大于等于父类方法;

子类方法的返回类型必须是父类方法返回类型或为其子类型。

子类方法抛出的异常类型必须是父类抛出异常类型或为其子类型。

使用 @Override 注解,可以让编译器帮忙检查是否满足上面的三个限制条件。

下面的示例中,SubClass 为 SuperClass 的子类,SubClass 重写了 SuperClass 的 func() 方法。其中:

子类方法访问权限为 public,大于父类的 protected。

子类的返回类型为 ArrayList,是父类返回类型 List 的子类。

子类抛出的异常类型为 Exception,是父类抛出异常 Throwable 的子类。

子类重写方法使用 @Override 注解,从而让编译器自动检查是否满足限制条件。

class SuperClass {

protected List func() throws Throwable {

return new ArrayList<>();

}

}

class SubClass extends SuperClass {

@Override

public ArrayList func() throws Exception {

return new ArrayList<>();

}

}

在调用一个方法时,先从本类中查找看是否有对应的方法,如果没有再到父类中查看,看是否从父类继承来。否则就要对参数进行转型,转成父类之后看是否有对应的方法。总的来说,方法调用的优先级为:

this.func(this)

super.func(this)

this.func(super)

super.func(super)

/*

A

|

B

|

C

|

D

*/

class A {

public void show(A obj) {

System.out.println("A.show(A)");

}

public void show(C obj) {

System.out.println("A.show(C)");

}

}

class B extends A {

@Override

public void show(A obj) {

System.out.println("B.show(A)");

}

}

class C extends B {

}

class D extends C {

}

public static void main(String[] args) {

A a = new A();

B b = new B();

C c = new C();

D d = new D();

// 在 A 中存在 show(A obj),直接调用

a.show(a); // A.show(A)

// 在 A 中不存在 show(B obj),将 B 转型成其父类 A

a.show(b); // A.show(A)

// 在 B 中存在从 A 继承来的 show(C obj),直接调用

b.show(c); // A.show(C)

// 在 B 中不存在 show(D obj),但是存在从 A 继承来的 show(C obj),将 D 转型成其父类 C

b.show(d); // A.show(C)

// 引用的还是 B 对象,所以 ba 和 b 的调用结果一样

A ba = new B();

ba.show(c); // A.show(C)

ba.show(d); // A.show(C)

}

2. 重载(Overload)

存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。

应该注意的是,返回值不同,其它都相同不算是重载。

class OverloadingExample {

public void show(int x) {

System.out.println(x);

}

public void show(int x, String y) {

System.out.println(x + " " + y);

}

}

public static void main(String[] args) {

OverloadingExample example = new OverloadingExample();

example.show(1);

example.show(1, "2");

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】21秋期末考试管理会计10171k2

1、下列项目中&#xff0c;变动成本法下计入产品成本的是( )。 &#xff08;2 分&#xff09; A&#xff0e;变动性制造费用 B&#xff0e;变动性管理费用 C&#xff0e;固定性管理费用 D&#xff0e;固定性制造费用 2、将成本中心划分为标准成本中心和费用中心的分类依据是&am…

数字光端机和模拟视频光端机的六个不同点

说到模拟视频光端机与数字光端机的不同之处&#xff0c;在这里飞畅科技的小编要介绍六点不一样的地方来详细讲解模拟视频光端机与数字光端机的不同。模拟视频光端机与数字光端机究竟有何区别&#xff0c;这也是众多用户所关心的确问题&#xff0c;本文从以下几个方面进行如下论…

在硒中按TagName定位元素

硒定位器是处理网页上的元素时的关键。 从ID&#xff0c;名称&#xff0c;类&#xff0c;标记名&#xff0c;XPath&#xff0c;CSS选择器等定位器列表中&#xff0c;可以根据需要选择其中任何一种&#xff0c;然后在网页上找到Web元素。 由于与tagName或linktext相比&#xff0…

java输出链表的值_[剑指offer] 从尾到头打印链表(三种方法) java

一、每次把新遍历的链表值放到list索引为0的位置&#xff0c;实现逆序。public class Solution {public ArrayList printListFromTailToHead(ListNode listNode) {ArrayList listnew ArrayList<>();if(listNodenull) return list;while(listNode!null){list.add(0,listNo…

工业级以太网交换机-管理型

工业以太网交换机&#xff0c;即应用于工业控制领域的以太网交换机设备&#xff0c;由于采用的网络标准&#xff0c;其开放性好、应用广泛以及价格低廉、使用的是透明而统一的TCP/IP协议&#xff0c;以太网已经成为工业控制领域的主要通信标准。那么&#xff0c;管理型工业级以…

【渝粤教育】国家开放大学2018年春季 0064-22T20世纪欧美文学 参考试题

试卷代号&#xff1a;0064 2017-2018学年第二学期期末考试 外国文学专题试题 2018年7月 一、填空题&#xff08;每空3分&#xff0c;共30分&#xff09; 1. 是作家又是政治活动家&#xff0c;曾多次来到中国。他著有两部描写中国工人罢工和起义的作品&…

jdk 1.8 jdk8_JDK 8功能的可疑方面

jdk 1.8 jdk8我们大多数使用Java进行开发的人通常都热衷于JDK 8附带的功能和改进。 但是&#xff0c;最近有几篇文章指出了某些功能可能会被滥用和滥用&#xff0c;并可能在将来导致一些其他问题。 这些功能使我想起了J2SE 5中引入的自动装箱功能&#xff0c;虽然有其有用的情况…

Java注解参数类型枚举值_EffectiveJava-5-枚举和注解

用enum代替int常量1. int枚举&#xff1a;引入枚举前&#xff0c;一般是声明一组具名的int常量&#xff0c;每个常量代表一个类型成员&#xff0c;这种方法叫做int枚举模式。int枚举模式是类型不安全的&#xff0c;例如下面两组常量&#xff1a;性别和动物种类&#xff0c;二者…

【渝粤教育】国家开放大学2018年春季 0149-21T现代汉语 参考试题

试卷编号&#xff1a;0149 座位号 2017——2018学年度第二学期期末考试 现代汉语试题 2018年7月 1.合口呼韵母2&#xff0e;合成词 3&#xff0e;同义词4&#xff0e;非成词语素 5&#xff0e;派生义 1&#xff0e;有两种趋势促进了现代汉民族共同语的发展&#xff0c;一是 …

JDK 12 – JEP 325开关表达式

JDK 12于2019年3月19 日上线GA&#xff0c;继续致力于缩短发布周期和频繁发布。 该版本的功能部分可以在这里找到。 对于开发人员来说&#xff0c;有趣的功能之一是“ JEP 325开关表达式 ”&#xff0c;它可以作为预览功能使用。 此处定义的预览功能是&#xff1a; 预览语言或…

【渝粤教育】国家开放大学2018年春季 0222-22T模拟电子电路 参考试题

编号&#xff1a;0222 b 2017-2018年度第二学期期末考试 模拟电子电路&#xff08;开卷&#xff09; 试 题 2018年 7 月 一 、概念解释&#xff08;每小题6分&#xff0c;共30分&#xff09;1、电流放大倍数2、自激振荡3、负反馈4、通频带5、滤波二、放大电路的计算&#xff0…

工业交换机:如果出现了物理性故障该怎么判断?

一般工业交换机出现故障大致可以分为&#xff1a;软性能故障和物理性故障。软性能故障一般是指工业交换机在研发设计方面出现的问题。今天就由飞畅科技的小编来给大家聊聊工业交换机物理性故障该怎么判断&#xff1f;一起来看看吧&#xff01; 物理层故障主要是指交换机本身的…

java example cat_java maven hello example

Maven插件开发From:Maven 插件开发—-让maven使用更加灵活对于习惯于使用maven构建、管理项目的人来说&#xff0c;maven就是项目开发、测试、部署的一把利器&#xff1a;对类库的集中管理&#xff1b;依赖传递、继承、重用性高&#xff1b;对整个项目开发生命周期的完整支持&a…

【渝粤教育】国家开放大学2018年春季 0283-21T广告创意与表现(二) 参考试题

试卷代号&#xff1a;0283 2017-2018年度第2学期期末考试 广告创意与表现&#xff08;二&#xff09;试题&#xff08;闭卷&#xff09; 2018年5月 请指出下列作品采用的基本广告创意思路&#xff0c;并结合作品对此创意思路的定义、广告效果、思路进行阐述。字数不低于400。&…

工业交换机常用术语及常见知识点汇总

工业交换机作为现在最流行也最高效率的数据通信设备&#xff0c;它本身就是一款高科技产品。是产品就有很多的参数和指标&#xff0c;很多采购的朋友&#xff0c;可能只是按照公司的要求来进行筛选对应的产品&#xff0c;对工业交换机的了解不是很深入&#xff0c;甚至对交换机…

java lambda 调用函数_Java lambda函数将如何编译?

VM决定如何实现lambda&#xff0c;而不是编译器。请参阅Lambda表达式的翻译中的for部分。我们没有描述生成用于实现lambda表达式的对象的字节码(例如&#xff0c;调用内部类的构造函数)&#xff0c;而是描述了构造lambda的方法&#xff0c;并将实际构造委托给语言运行时。 该配…

【渝粤教育】国家开放大学2018年春季 0632-22T老年保健按摩 参考试题

科目编号&#xff1a;0632 座位号 2017-2018学年度第二学期期末考试 老年保健按摩试题 2018年7月 一、名词解释&#xff08;本大题共5小题&#xff0c;每小题4分&#xff0c;共计20分&#xff09; 1.老年病&#xff1a; 2.耳穴疗法&#xff1a; 3.拔罐疗法&#xff1a; 4.刮…

q7goodies事例_Java 8 Friday Goodies:精益并发

q7goodies事例在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个…

【渝粤教育】国家开放大学2018年春季 0700-22T中级会计实务(一) 参考试题

科目编号&#xff1a;0700 座位号 2017-2018学年度第二学期期末考试 中级会计实务&#xff08;一&#xff09; 试题 2018年 7 月 一、单选题&#xff08;本大题共10小题&#xff0c;每小题3分&#xff0c;共计30分&#xff09; &#xff08;★请考生务必将答案填入到下面对应序…

工业交换机的外壳设计重要吗?

工业交换机一般使用在环境比较恶劣的地方&#xff0c;例如工厂等&#xff0c;为了让工业交换机更好的使用&#xff0c;工业交换机的外壳设计起到至关重要的作用&#xff0c;工业交换机的外壳可以更好的保护工业交换机的使用&#xff0c;那么如何才能选到实用的工业交换机外壳呢…