java基础之继承(一)
虽然说java中的面向对象的概念不多,但是具体的细节还是值得大家学习研究,java中的继承实际上就是子类拥有父类所有的内容(除私有信息外),并对其进行扩展。下面是我的笔记,主要包含以下一些内容点:
- 构造方法
- 重写和重载
- final关键字
- new的背后(内存分析)
- 理解方法调用
一、构造方法
正如我们所知道的,构造方法的方法名与类名相同,主要的作用是实现对实例对象的初始化工作,实际上每个子类的构造方法中的第一行默认是调用了父类的构造函数,而父类继续向上调用直至Object类,然后返回。
/*这是父类*/
public class Base {
public Base(){
System.out.println("i am the base");
}
}
/*这是子类*/
public class Child extends Base {
public Child(){
//super();隐式调用父类默认无参构造器
System.out.println("i am the child");
}
}
/*执行程序*/
public class Test {
public static void main(String[] args){
Child c = new Child();
}
}
输出结果:
i am the base
i am the child
当然,super这个关键字还有第二个作用,显式调用父类方法(不只是构造方法,普通实例方法也是可以直接调用的)。
public class Base {
//父类中有个sayHello方法
public void sayHello(){
System.out.println("hello base");
}
}
public class Child extends Base {
//子类通过super关键字显式调用
public void show(){
super.sayHello();
}
}
那如果我们想要显式调用子类中的其他的构造方法该怎么办呢?
可以使用this 关键字
public class Child extends Base {
private String name;
private int age;
private String address;
//一个参数的构造方法
public Child(String name){
this.name = name;
}
//三个参数的构造方法
public Child(String name,int age,String address){
this(name);//显式调用其他构造方法
this.age = age;
this.address = address;
}
}
为什么要这么做呢?因为不是每个实例对象都需要传所有的参数,例如,大家在注册qq账号时候,有些是必填的信息,有的是可选填的,这样不同的人在注册时就会调用不同的构造函数,这样调用参数多的构造方法就没必要再为每个变量赋值,可以使用this调用其他的构造方法,减轻代码的冗余程度。
二、重载和重写
下面说说方法的重载和重写的区别。首先大家需要了解什么是方法的签名,方法的名字和参数列表叫做方法的签名。方法的重载就是指两个或以上具有相同方法名但方法的参数存在某些差异的方法之间的这种关系叫做方法的重载。
所谓方法的参数列表的差异,主要是参数的类型差异和参数的个数差异。
1、public void sayHello(){}
2、public void say(){}
3、public void sayHello(String name){}
4、public void sayHello(int age){}
5、public void sayHello(String name,int age){}
如上所示,1和2肯定不会构成重载,构成重载的前提是具有相同的方法名,1和3和4和5构成函数重载,他们之间要么参数类型不同,要么参数个数不同。
函数的重载可能和继承关系并不大,但方法的重写和继承关系密切。方法的重写就是指两个方法之间具有相同的签名,也就是两个方法一模一样,只是一个出现在父类中一个出现在子类中
public class Base {
//父类中的sayHello方法
public void sayHello(){
System.out.println("hello base");
}
}
public class Child extends Base {
//子类中的sayHello方法
public void sayHello(){
System.out.println("hello child");
}
}
public class Test {
public static void main(String[] args){
Base b = new Child();
b.sayHello();
}
}
输出结果:
hello child
本例中涉及多态相关知识,初学者不懂可以跳过,但是需要知道,本例中父类的sayHello方法和子类的sayHello方法是一模一样的,子类继承过来之后觉得不理想又将其重写,重写完之后子类中就相当于覆盖了父类的这个方法,每次调用时就直接调用了自己重写的方法,看不见父类的方法。
总结一下:方法的重载,方法与方法之间是不一样的,而方法的重写实际上是一种方法的覆盖,子类覆盖父类的方法使父类方法在子类中不可见(实际上是可以使用super显式调用的,本节暂时不讨论)。
三、final关键字
final关键字既可以修饰类也可以修饰方法,也能修饰变量,但是具有不同的意义。被final修饰的类表示为不可继承特性,不允许子类继承,也就是不让子类再对其进行扩展。例如,jdk中的String类就是被final修饰的,不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。
被final修饰的方法表示此方法在被子类继承之后是不允许重写的,例如有些方法不希望被子类重写修改就可以使用final修饰他,在java中常量也是使用final来修饰的,例如:public final String name;,此变量一旦被赋值就不能再改变其内容了。
未完。。。。
java基础之继承(一)的更多相关文章
- 第二十八节:Java基础-进阶继承,抽象类,接口
前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...
- Java基础学习-- 继承 的简单总结
代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...
- 【Java基础】继承的一些总结
什么是继承 把一些类的具有共性的东西剥离出来形成一个新的类,然后各个其他类保留自己独有的特性,并用关键字extends继承这个剥离出来的新的类,可以最终达到各类原始相同效果,但是在每个类中,单用一个“ ...
- Java基础08 继承
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 继承(inheritance)是面向对象的重要概念.继承是除组合(composit ...
- Java基础08 继承(转载)
继承(inheritance)是面向对象的重要概念.继承是除组合(composition)之外,提高代码重复可用性(reusibility)的另一种重要方式.组合是重复调用对象的功能接口.继承可以重复 ...
- java基础(10):继承、抽象类
1. 继承 1.1 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系.例如公司中的研发部员工和维护部员工 ...
- Java基础 之三 继承
1.子类 1) 定义子类 //假设父类(也叫做超类)是Employee类,用extends来表示继承 public class Manager extends Employee{ //域和方法 pri ...
- Java基础:继承,封装,多态,抽象类,接口
只要是从事Java语言有关的开发工作,在面试中难念会被问到这几个东西. 博主学习java有两年多了,算是浅显的知道一些,抄写了一些解释分享一下. 1.什么是面向对象?(面对女朋友) 面向对象(Obje ...
- 三、Java基础---------关于继承、构造函数、静态代码块执行顺序示例讲解
在上节博客中曾提到过类的继承,这篇文章主要是介绍类的继承.构造函数以及静态代码块的执行顺序. 首先接着分析在黑马基础测试中的一个关于继承的题目,题目描述如下: 声明类Person,包含2个成员变量:n ...
随机推荐
- 使用RabbitMq
1.配置环境 http://www.cnblogs.com/longlongogo/p/6479424.html 2.安装RabbitMQ https://www.cnblogs.com/longlo ...
- Chapter3_操作符_逻辑操作符
逻辑操作符与(&&)或(||)非(^)能够对布尔类型的数据类型进行操作,并且生成布尔值,和关系操作符的产生的数据类型是一样的.需要注意的不多,有以下几点: (1)在需要使用string ...
- Java 8 Lambda 表达式及 Stream 在集合中的用法
简介 虽然 Java 8 已经发布有一段时间了,但是关于 Java 8 中的 Lambda 表达式最近才开始系统的学习,刚开始就被 Stream 的各种骚操作深深的吸引住了,简直漂亮的不像 Java. ...
- 2019.02.21 bzo1038: [ZJOI2008]瞭望塔(半平面交)
传送门 题意:给出一个nnn个点的轮廓,要求找一个高度最小的点使得它能够看见所有拐点. 思路:之间建半平面交然后取半平面交上的每个交点和每个轮廓更新答案即可. 代码: #include<bits ...
- python bittorrent 使用与学习
更新于20171128 关于这个p2p的技术,阿里开源了蜻蜓,大家可以看看,感觉应该比这个要好用,而且文档也全. 前言 最近在学习python的p2p协议,发现网上找不到好的文章,又仔细找了找终于找到 ...
- SSM_CRUD新手练习(7)Spring单元测试分页请求
好久没写这个系列博客了是因为本人去公司实习去了,公司用的是Spring+SpingMvc+Hibernate现在有时间了不管怎么样继续把这个项目写完. 因为机器的原因,我的环境变成了IDEA+orac ...
- ansible教程
相关教程: 权威指南:http://www.ansible.com.cn/ 博客教程:https://www.w3cschool.cn/automate_with_ansible/ 视频教程: htt ...
- git 删除本地分支、远程分支、本地回滚、远程回滚
一. git 删除分支 1. git 删除本地分支 git branch -D branchname 2. git 删除远程分支 git push origin :branchname (origin ...
- ASP.NET Core 统一异常处理和返回
业务场景: 业务需求要求,需要对 ASP.NET Core 异常进行统一处理和返回,比如出现 500 错误和业务服务错误进行不同的处理和返回. 具体实现: using Microsoft.AspNet ...
- [UWP]实现一个轻量级的应用内消息通知控件
在UWP应用开发中,我们常常有向用户发送一些提示性消息的需求.这种时候我们一般会选择MessageDialog.ContentDialog或者ToastNotification来完成功能. 但是,我们 ...