访问权限

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

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

  • 类可见表示其他类可以用这个类创建实例对象。
  • 成员可见表示其他类可以用这个类的实例对象访问到该对象;

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

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

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

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

  1. public class AccessExample{
  2. public String id;
  3. }

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

  1. public class AccessExample{
  2. private int id;
  3. public String getId(){
  4. return id + "";
  5. }
  6. public void setId(String id){
  7. this.id = Integer.valueOf(id);
  8. }
  9. }

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

  1. public class AccessWithInnerClassExample{
  2. private class InnerClass{
  3. int x;
  4. }
  5. private AccessWithInnerClassExample(){
  6. innerClass = new InnerClass();
  7. }
  8. public int getValue(){
  9. return innerClass.x;
  10. }
  11. }

抽象类与接口类

1.抽象类

抽象类和抽象方法都使用abstrac关键字进行声明。抽象类一般会包含抽象方法,抽象方法一定位于抽象类中。

抽象类和普通类最大的区别是,抽象列不能被实例化,需要继承抽象类才能实例化其子类。

  1. public abstract classs AbstractClassExample{
  2. protected int x;
  3. private int y;
  4. public abstract void func1();
  5. public void func2(){
  6. System.out.println("func2");
  7. }
  8. }
  1. public class AbstractExtendClassExample extends AbstractClassExample{
  2. @Override
  3. public void func1(){
  4. System.out.println("funct1");
  5. }
  6. }

2.接口

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

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

接口的成员(字段 + 方法)默认都是public的,并且不允许定义为private或者protected。

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

  1. public interface InterfaceExample{
  2. void func1();
  3. default void func2(){
  4. System.out.println("func2");
  5. }
  6. int x = 123;
  7. }
  1. public class InterfaceImplementExample implements InterfaceExample {
  2. @Overrid
  3. public void func1(){
  4. System.out.println("func1");
  5. }
  6. }

3.比较

  • 从设计层面上看,抽象类提供了一种IS-A关系,那么就必须满足里氏替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种LIKE-A关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有IS-A关系。
  • 从使用上看,一个类可以实现多个接口,但是不能继承多个抽象类。
  • 接口的字段只能是static和final类型的,而抽象类的字段没有这种限制。
  • 接口的成员只能是public的,而抽象类的成员可以有多种访问权限。

4.使用选择

使用接口:

  • 需要让不想关的类都实现一个方法,例如不相关的类都可以实现Compareable接口中的compareTo()方法;
  • 需要使用多重继承。

    使用抽象类:
  • 需要在几个相关的类中共享代码。
  • 需要能控制继承来的成员的访问权限,而不是都为public
  • 需要继承非静态和非常量字段。

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

super

  • 访问父类的构造函数:可以使用super()函数访问父类的构造函数,从而委托父类完成一些初始化的工作。
  • 访问父类的成员:如果子类重写了父类的中某个方法的实现,可以通过使用super关键字来引用父类的方法实现。

重写和重载

  • 重写(override)存在于继承体系中,指子类实现了一个父类在方法声明上完全相同的一个方法。子类的返回值类型要等于或者小于父类的返回值;
  • 重载(overload)存在于同一个类中,指一个方法已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。应该注意的是,返回值不同,其他都是相同不算是重载。

Java复习总结——继承的更多相关文章

  1. java复习(3)继承

    一.继承为题的提出 ---------------------------------------------------- 我们知道面向对象的三大特性是:封装.继承和多态,可以知道继承在java应用 ...

  2. java复习(3)继承下

    一.抽象类 ------------------------------------- 1.抽象定义概述:抽象类时从多个事物中奖共性的,本质的内容抽取出来 例如:狼和狗共性都是犬科,犬科就是抽象出来的 ...

  3. java 复习001

    java 复习001 比较随意的记录下我的java复习笔记 ArrayList 内存扩展方法 分配一片更大的内存空间,复制原有的数据到新的内存中,让引用指向新的内存地址 ArrayList在内存不够时 ...

  4. java复习(1)---java与C++区别

    [系列说明]java复习系列适宜有过java学习或C++基础或了解java初步知识的人阅读,目的是为了帮助学习过java但是好久没用已经遗忘了的童鞋快速捡起来.或者教给想快速学习java的童鞋如何应用 ...

  5. Java复习8.多线程

    Java复习8 多线程知识 20131007 前言: 在Java中本身就是支持多线程程序的,而不是像C++那样,对于多线程的程序,需要调用操作系统的API 接口去实现多线程的程序,而Java是支持多线 ...

  6. Java复习5.面向对象

    Java 复习5面向对象知识 20131004 前言: 前几天整理了C++中的面向对象的知识,学习Java语言,当然最重要的就是面向对象的知识,因为可以说Java是最正宗的面向对象语言,相比C++,更 ...

  7. java 复习总结

    java 复习总结 命名方法 创建文件的名称应该和类的名称一致,不然会报错. 类采用首字母大写的方式来命名,如果是多个单词的类名,则每个单词首字母都大写,例如:HelloWorld . 方法采用驼峰命 ...

  8. JAVA接口的继承与集合

    复习 20190701 接口补充 一. java是单继承多实现 单继承: 一个类只能有一个父类 public class D extends D1 { } 2. 多实现 一个类可以同时实现多个接口 当 ...

  9. java复习面向对象(二)

    java复习面向对象(二) 1.static关键字 举例图片 静态变量 使用static修饰的成员变量是静态变量 如果一个成员变量使用了关键字static,那么这个变量不属于对象自己,而属于所在的类多 ...

随机推荐

  1. C# NuGet包管理命令

    NuGet Package Manager Console 内置于 Visual Studio 在 Windows 2012 和更高版本. (不包含在 Visual Studio 用于 Mac 或 V ...

  2. 现代Java进阶之路必备技能——2019 版

    Java技术的学习阶段有三 第1个是java基础,比如对集合类,并发,IO,JVM,内存模型,泛型,异常,反射,等有深入了解. 第2个是全面的互联网技术相关知识,比如redis,mogodb,ngin ...

  3. Git配置用户信息和SSH

    安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功! 1.配置用户信息 在命令行输入: $ git config --global ...

  4. SAP MM 明明已经扩展供应商到采购组织下,采购订单里还是报错?

    SAP MM 明明已经扩展供应商到采购组织下,采购订单里还是报错? 如下的PO 4400000069,处于HELD状态.ME22N试图保存它为一个正式的采购订单,报错说供应商没有在采购组织下维护, 使 ...

  5. 【AO例子】生成TIN

    当然,通过GP生成也是可以的.这里介绍的是已经烂大街的生成方法. 上代码: public ITin CreateTin(IFeatureClass featureClass, IField Z, st ...

  6. Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建

    目录 目录 1.前言 1.1.什么是 Hadoop? 1.1.1.什么是 YARN? 1.2.什么是 Zookeeper? 1.3.什么是 Hbase? 1.4.什么是 Hive 1.5.什么是 Sp ...

  7. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  8. 深入Node之初识

    0前言 陆续的用Node已经一年多了,已经用node写了几个的项目,也该是总结node学习的过程了 1.Node是啥? Node.js是一使用JavaScript作为开发语言,运行在服务器端的Web服 ...

  9. Linux(Manjaro) -Docker 安装及基本配置

    Linux(Manjaro) -Docker 安装及基本配置 基本安装 # Pacman 安装 Docker sudo pacman -S docker # 启动docker服务 sudo syste ...

  10. 关于Xcode10的那些事

    前言 这里主要介绍一下Xcode10 版本主要更新的内容. 随着iOS12的发布,Xcode10已经可以从Mac App Store下载. Xcode10包含了iOS12.watchOS 5.macO ...