访问权限

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 AccessWithInnerClassExample(){
innerClass = new InnerClass();
}
public int getValue(){
return innerClass.x;
}
}

抽象类与接口类

1.抽象类

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

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

public abstract classs 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("funct1");
}
}

2.接口

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

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

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

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

public interface InterfaceExample{
void func1();
default void func2(){
System.out.println("func2");
}
int x = 123;
}
public class InterfaceImplementExample implements InterfaceExample {
@Overrid
public void func1(){
System.out.println("func1");
}
}

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. Java UrlRewriter伪静态技术运用深入分析

    通常我们为了更好的缓解服务器压力,和增强搜索引擎的友好面,都将文章内容生成静态页面. 但是有时为了能实时的显示一些信息,或者还想运用动态脚本解决一些问题,不能用静态的方式来展示网站内容,必须用到动态页 ...

  2. axios 封装

    来自:https://www.jianshu.com/p/68d81da4e1ad 侵删 import axios from 'axios' import qs from 'qs' let baseu ...

  3. 【土旦】vue项目中 使用 pako.js 解密 gzip加密字符串

    前言 今天跟后台对接一个接口,接受到一个加密的值,说是通过gzip加密过的,然后就蒙蔽了, 赶紧上百度找了一下资料,通过一篇文章(原文在底部)发现有个js库可以解密,就下载轻松解密了 实现代码 pok ...

  4. php中读取中文文件夹及文件报错

    php读取时出现中文乱码 一般php输出中出现中文乱码我们可用 header ('content:text/html;charset="utf-8"'); php中读取中文文件夹及 ...

  5. Android 离线人脸识别 ArcFace 2.0 Demo开发分享

    环境要求     1.运行环境 armeabi-v7a     2.系统要求 Android 5.0 (API Level 21)及以上     3.开发环境 Android Studio   下载地 ...

  6. mpvue学习笔记-之微信小程序数据请求封装

    简介 美团出品的mpvue已经开源出来很久了,一直说要进行一次实践,这不最近一次个人小程序开发就用上了它. 看了微信官方的数据请求模块--request,对比了下get和post请求的代码,发现如果在 ...

  7. Jmeter调用自定义jar包

    一. 场景 在测试过程中, 可能需要调用第三方jar包来生成测试数据或者使用java工具类来实现业务场景, 普遍的做法是手动调用jar包, 再把这些值赋给jmeter中的某个参数, 以满足业务测试需求 ...

  8. Asp.Net WebAPI配置接口返回数据类型为Json格式

    Asp.Net WebAPI配置接口返回数据类型为Json格式   一.默认情况下WebApi 对于没有指定请求数据类型类型的请求,返回数据类型为Xml格式 例如:从浏览器直接输入地址,或者默认的XM ...

  9. centos 7 进入图形界面

    1 确保自己已经安装图形界面,如果没有请执行命令 yum groupinstall "GNOME Desktop" "Graphical Administration T ...

  10. IntelliJ IDEA 最新激活码

    C40PF37RR0-eyJsaWNlbnNlSWQiOiJDNDBQRjM3UlIwIiwibGljZW5zZWVOYW1lIjoiemhhbmcgeW9uZyIsImFzc2lnbmVlTmFtZ ...