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,那么这个变量不属于对象自己,而属于所在的类多 ...
随机推荐
- Linux高级运维 第二章 Linux基本操作和自己动手组装服务器
2.1 Linux网络相关概念和修改IP地址的方法 2.1.1 网卡的命名规则 Centos 6的网卡命名方式:它会根据情况有所改变而非唯一且固定,在CENTOS6之前,网络接口使用连 ...
- 学习day01
1.web C/S:Client Server 客户端 服务器 QQ,... B/S:Browser Server 浏览器 服务器 PC机:Personal Computer 个人电脑 2.HTML ...
- Django 提交 form 表单(使用sqlite3保存数据)
优化 提交 form 表单,https://www.cnblogs.com/klvchen/p/10608143.html 创建数据库的字段,在 models.py 中添加 from django.d ...
- 用markdown写博客
目录 用markdown写博客 前言 标题 段落 引用区块 代码块 列表 分隔线 链接 强调.加粗.下划线.删除线 图片 智能链接 表格 转义序列 用markdown写博客 前言 博客园支持用mark ...
- 关于Java中基类构造器的调用问题
在<Java编程思想>第7章复用类中有这样一段话,值得深思.当子类继承了父类时,就涉及到了基类和导出类(子类)这两个类.从外部来看,导出类就像是一个与基类具有相同接口的新类,或许还会有一些 ...
- git之命令git checkout
git checkout 最常用的就是切换分支,最近又发现一种新的用法: 有时候,在看代码的时候,不小心改动了部分代码,但跟项目没啥关系,这个时候,想不去提交这些代码,怎么处理呢? 使用git che ...
- 我的第一个python web开发框架(38)——管理员管理功能
后台管理员的管理功能,它主要用来管理后台的登录账号,绑定权限,当然如果想将后台管理扩展成企业相关管理系统,比如用于公司人事管理,在这个基础上进行适当扩展就可以了. 我们先看看界面效果(也可以看着数据字 ...
- 【shell实例】定时21:00-21:05,循环调用DSQL脚本,其它时段自动退出
1.功能描述: 每日21:00定时调起test.sh,循环调起DSQL脚本test.dsql,直到21:05程序自动退出,捕获日志到相应log文件中. 2.日志文件: (1)日期.log文件中含Err ...
- Hexo server报错TypeError: Cannot read property 'utcOffset' of null解决方法
最近刚刚开始使用Hexo,新建了一篇article,运行hexo server时候总是报错Cannot read property 'offset' of null. 最后发现是因为手贱把_confi ...
- WIFI KILL神器
https://anky.cc/esp8266-deauther-wifi-jammer/ https://github.com/spacehuhn http://tieba.baidu.com/p/ ...