Java复习总结——继承
访问权限
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复习总结——继承的更多相关文章
- java复习(3)继承
一.继承为题的提出 ---------------------------------------------------- 我们知道面向对象的三大特性是:封装.继承和多态,可以知道继承在java应用 ...
- java复习(3)继承下
一.抽象类 ------------------------------------- 1.抽象定义概述:抽象类时从多个事物中奖共性的,本质的内容抽取出来 例如:狼和狗共性都是犬科,犬科就是抽象出来的 ...
- java 复习001
java 复习001 比较随意的记录下我的java复习笔记 ArrayList 内存扩展方法 分配一片更大的内存空间,复制原有的数据到新的内存中,让引用指向新的内存地址 ArrayList在内存不够时 ...
- java复习(1)---java与C++区别
[系列说明]java复习系列适宜有过java学习或C++基础或了解java初步知识的人阅读,目的是为了帮助学习过java但是好久没用已经遗忘了的童鞋快速捡起来.或者教给想快速学习java的童鞋如何应用 ...
- Java复习8.多线程
Java复习8 多线程知识 20131007 前言: 在Java中本身就是支持多线程程序的,而不是像C++那样,对于多线程的程序,需要调用操作系统的API 接口去实现多线程的程序,而Java是支持多线 ...
- Java复习5.面向对象
Java 复习5面向对象知识 20131004 前言: 前几天整理了C++中的面向对象的知识,学习Java语言,当然最重要的就是面向对象的知识,因为可以说Java是最正宗的面向对象语言,相比C++,更 ...
- java 复习总结
java 复习总结 命名方法 创建文件的名称应该和类的名称一致,不然会报错. 类采用首字母大写的方式来命名,如果是多个单词的类名,则每个单词首字母都大写,例如:HelloWorld . 方法采用驼峰命 ...
- JAVA接口的继承与集合
复习 20190701 接口补充 一. java是单继承多实现 单继承: 一个类只能有一个父类 public class D extends D1 { } 2. 多实现 一个类可以同时实现多个接口 当 ...
- java复习面向对象(二)
java复习面向对象(二) 1.static关键字 举例图片 静态变量 使用static修饰的成员变量是静态变量 如果一个成员变量使用了关键字static,那么这个变量不属于对象自己,而属于所在的类多 ...
随机推荐
- C# NuGet包管理命令
NuGet Package Manager Console 内置于 Visual Studio 在 Windows 2012 和更高版本. (不包含在 Visual Studio 用于 Mac 或 V ...
- 现代Java进阶之路必备技能——2019 版
Java技术的学习阶段有三 第1个是java基础,比如对集合类,并发,IO,JVM,内存模型,泛型,异常,反射,等有深入了解. 第2个是全面的互联网技术相关知识,比如redis,mogodb,ngin ...
- Git配置用户信息和SSH
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功! 1.配置用户信息 在命令行输入: $ git config --global ...
- SAP MM 明明已经扩展供应商到采购组织下,采购订单里还是报错?
SAP MM 明明已经扩展供应商到采购组织下,采购订单里还是报错? 如下的PO 4400000069,处于HELD状态.ME22N试图保存它为一个正式的采购订单,报错说供应商没有在采购组织下维护, 使 ...
- 【AO例子】生成TIN
当然,通过GP生成也是可以的.这里介绍的是已经烂大街的生成方法. 上代码: public ITin CreateTin(IFeatureClass featureClass, IField Z, st ...
- 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 ...
- Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Py ...
- 深入Node之初识
0前言 陆续的用Node已经一年多了,已经用node写了几个的项目,也该是总结node学习的过程了 1.Node是啥? Node.js是一使用JavaScript作为开发语言,运行在服务器端的Web服 ...
- Linux(Manjaro) -Docker 安装及基本配置
Linux(Manjaro) -Docker 安装及基本配置 基本安装 # Pacman 安装 Docker sudo pacman -S docker # 启动docker服务 sudo syste ...
- 关于Xcode10的那些事
前言 这里主要介绍一下Xcode10 版本主要更新的内容. 随着iOS12的发布,Xcode10已经可以从Mac App Store下载. Xcode10包含了iOS12.watchOS 5.macO ...