一、继承作用

继承使用复用以前的代码非常容易,能够大大的缩短开发周期,降低开发成本,同时增加程序的易维护性

继承使重一个类A能够直接使用另外一个类B的属性和方法的一种途径

类A可以有自己的属性和方法

二、继承实现

类的继承格式
在Java中使用extends关键字完成类的继承关系,操作格式:
class 父类{} // 定义父类
class 子类 extends 父类{} // 使用extends关键字实现继承
package com.pb.person;
/*
* 父类
*/
public class Person {
private String name; //姓名
private String sex; //性别
private int age;//年龄 //设置getter和setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
if(sex.equals("男") || sex.equals("女")){
//设置性别限制,不合法的值将提示错误
this.sex = sex;
}else{
System.out.println("性别不合法,性别只能是:男或者女");
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>0 && age<=150){
//设置年龄限制
this.age = age;
}else{
System.out.println("年龄只能在1-150岁之间");
}
}
public Person() {
this.name = "无名氏";
this.sex = "男";
this.age = 22;
}
public Person(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
} public void say(){
System.out.println("自我介绍:");
System.out.println("姓名:"+this.name);
System.out.println("性别:"+this.sex);
System.out.println("年龄:"+this.age);
} }

子类:

package com.pb.person;
/*
* 子类
*/
public class Student extends Person {
private int stuNo ; //学号
private String specialty; //专业 public Student() { }
public Student(String name, String sex, int age,int stuNo,String specialty) {
super(name, sex, age);
this.stuNo=stuNo;
this.specialty=specialty;
} //getter/setter方法
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
public String getSpecialty() {
return specialty;
}
public void setSpecialty(String specialty) {
this.specialty = specialty;
} }

测试类

package com.pb.persontest;

import com.pb.person.Student;

public class Test {

    public static void main(String[] args) {
Student stu=new Student("张三", "男", 22, 121, "计算机科学与技术") ;
stu.say(); } }

结果:

自我介绍:
姓名:张三
性别:男
年龄:22

以下可以发现,子类的学号,和专业并没有输出,

默认调用的父类的say()方法

需要子类重写父类的方法

三、方法的重写

方法的重写是发生的子类对父类的过程中,是在2个类中,和方法重载是在一个类中

方法重写有以下要求

Student类重写Person类中的say()方法

package com.pb.person;
/*
* 子类
*/
public class Student extends Person {
private int stuNo ; //学号
private String specialty; //专业 public Student() { }
public Student(String name, String sex, int age,int stuNo,String specialty) {
super(name, sex, age);
this.stuNo=stuNo;
this.specialty=specialty;
}
//方法重写
@Override
public void say() { super.say();
System.out.println("学号是:"+this.stuNo);
System.out.println("专业是:"+this.specialty);
} //getter/setter方法
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
public String getSpecialty() {
return specialty;
}
public void setSpecialty(String specialty) {
this.specialty = specialty;
} }

测试类不变:

package com.pb.persontest;

import com.pb.person.Student;

public class Test {

    public static void main(String[] args) {
Student stu=new Student("张三", "男", 22, 121, "计算机科学与技术") ;
stu.say(); } }

结果:

自我介绍:
姓名:张三
性别:男
年龄:22
学号是:121
专业是:计算机科学与技术

重写以后,调用的就是子类重写后的方法

四、super关键字

super必须是出现在子类中(子类的方法和构造方法中),而不是其他位置,在构造方法中必须出现在第一行

用以访问父类的成员,例如:父类的属性、方法、构造方法

访问权限的限制,例如无法通过super访问private成员

五、继承条件下构造方法的调用规则

规则一:如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法

规则二:如果子类的构造方法中通过super显示调用父类的有参构造方法,那将执行父类的相应的构造方法,而不执行父类无参数构造方法

 规则三:如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应用以上2条规则

5.1、例一

package compb.demo4;
/*
* 父类
*/
public class StaticSuper {
public static String staticGet() {
return "父类静态方法";
} public String dynamicGet() {
return "父类动态方法";
}
} package compb.demo4;
/*
* 子类
*/
public class StaticSub extends StaticSuper{ //静态方法不能重写
public static String staticGet() {
return "子类静态方法";
}
@Override
public String dynamicGet() {
return "子类动态方法重写父类动态方法";
} } package compb.demo4;
/*
* 测试
*/
public class Test { public static void main(String[] args) {
StaticSub s= new StaticSub(); //声明子类对象
System.out.println(s.staticGet()); //调用子类静态方法
System.out.println(s.dynamicGet()); //调用子类动态方法
} }

结果:

子类静态方法
子类动态方法重写父类动态方法

5.2、例二、

package com.pb.demo5;
/*
* 父类
*/
public class VenderLate { public VenderLate() {
System.out.print("VenderLate out");
} }
package com.pb.demo5; public class MoveGoods extends VenderLate{ public MoveGoods( ) {
System.out.println("MoveGoods out!");
} public MoveGoods(String s) {
System.out.println(s);
} }
package com.pb.demo5;
/*
* 测试类
*/
public class Test { public static void main(String[] args) {
MoveGoods m=new MoveGoods();
MoveGoods g=new MoveGoods(" child"); } }

结果:

VenderLate outMoveGoods out!
VenderLate out child

5.3 、例三

package com.pb.demo4;
/*
* 父类
*/
public class SuperClass {
private String name; public SuperClass() {
System.out.println("父类的无参数构造方法");
}
public SuperClass(String name) {
System.out.println("父类有一个参数的构造方法:"+name);
}
//setter/getter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} }

子类

package com.pb.demo4;

public class SubClass extends SuperClass {
private String name;
private int count; public SubClass() {
System.out.println("子类无参数构造方法");
}
public SubClass(int count) {
System.out.println("子类有一个参数构造方法:"+count);
} //调用父类有参数的构造方法
public SubClass(String name) {
super(name);
this.name=name;
System.out.println("调用子类有一个参数构造方法,同时使用super显示调用"+name);
} //setter/getter方法
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
} }

测试类:

package com.pb.demo4;

public class Test {

    public static void main(String[] args) {
System.out.println("*******调用子类无参数构造方法**********");
SubClass s1=new SubClass();
System.out.println("*******调用子类有一个参数构造方法但是没有使用super显示调用**********");
SubClass s2=new SubClass(34);
System.out.println("*******调用子类有一个参数构造方法,同时使用super显示调用**********");
SubClass s3=new SubClass("张三");
} }

结果:

*******调用子类无参数构造方法**********
父类的无参数构造方法
子类无参数构造方法
*******调用子类有一个参数构造方法但是没有使用super显示调用**********
父类的无参数构造方法
子类有一个参数构造方法:34
*******调用子类有一个参数构造方法,同时使用super显示调用**********
父类有一个参数的构造方法:张三
调用子类有一个参数构造方法,同时使用super显示调用张三

六、Object类

所有的有类都自动继承java.lang包中的Object类

Object类是所有类的父类(基类)

在定义一个类时如果没有使用extends关键字,则默认继承Object类

Object常被重写的方法:

Java从零开始学十五(继承)的更多相关文章

  1. Java从零开始学十九(异常)

    一.什么是异常 从字面上讲,就是不正常的现实就是异常. 程序中的异常也是要在程序运行中才会偶尔发生.如果程序还没有运行,编译就报错,这种不叫异常,这种叫编译错误,通常是语法上的错误 二.java中异常 ...

  2. Java从零开始学十八(抽象类和接口)

    一.什么是抽象类和接口 抽象类.接口与类是一个层次的概念,是java中极其重要的概念. 抽象类是从多个类中抽象出来的公共模板,提供子类均具有的功能. 接口是从多个类中抽象出来的规范,体现的是规范和实现 ...

  3. Java从零开始学十六(多态)

    一.什么是多态 多态性是指允许不同类的对象对同一消息作出响应.多态性包括参数化多态性和包含多态性.多态性语言具有灵活.抽象.行为共享.代码共享的优势,很好的解决了应用程序函数同名问题.多态有两种表现形 ...

  4. Java从零开始学十四(包和访问控制)

    一.java中的包 Java文件的组织形式Windows中的文件功能类似 在开发比较大的项目时,不可能只涉及到一个java文件,可能要创建几十,甚至几百个java文件,这个时候,我们就可以使用包,把相 ...

  5. Java从零开始学十(Arrays类对数组的常用方法)

    一.Arrays类常用方法 二.简单例子 package com.pb.demo1; import java.util.Arrays; /* * Arrays工具类的中的几个常用方法 * 1.copy ...

  6. Java从零开始学十二(构造方法)

    一.构造方法 构造方法的主要目的是为类中的属性初始化 二.构造方法的定义格式 class 类名称{ 访问权限 类名称(类型1 参数1,类型2 参数2,…){ 程序语句 ; …    // 构造方法没有 ...

  7. Java进阶(二十五)Java连接mysql数据库(底层实现)

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

  8. “全栈2019”Java第八十五章:实现接口中的嵌套接口

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第四十五章:super关键字

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. tyvj 1031 热浪 最短路

    热浪 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://tyvj.cn/p/1031 Description 德克萨斯纯朴的民眾们这个夏天正在遭受 ...

  2. Codeforces Round #296 (Div. 1) C. Data Center Drama 欧拉回路

    Codeforces Round #296 (Div. 1)C. Data Center Drama Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: xx ...

  3. ASP.NET 构建高性能网站 架构设计

    Web前端系统 为了达到不同应用的服务器共享.避免单点故障.集中管理.统一配置等目的,不以应用划分服 务器,而是将所有服务器做统一使用,每台服务器都可以对多个应用提供服务,当某些应用访问量升高时,通过 ...

  4. 长城小主机GW1等型号进BIOS的设置方法

    主板型号 1.进BIOS办法 2.BIOS下设置U盘启动 3.主板设置上电启动 4.主要是否具有快速U盘启动功能 5.定时开机设置 945GMS Ctrl+Alt+F1(注意:自检响铃后,再按) 在B ...

  5. 探究Linux下参数传递及查看和修改方法

    http://m.blog.csdn.net/blog/moonvs2010/11392959

  6. UVA LIVE-3263 - That Nice Euler Circuit

    画一个顶点为偶数的封闭的二维图,当然.这个图能够自交,给出画的过程中的一些轨迹点.求出这个图把二次元分成了几部分,比如三角形把二次元分成了两部分. 这个的话,有图中顶点数+部分数-棱数=2的定律,这是 ...

  7. 3D数学读书笔记——3D中的方位与角位移

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/25339595 方位和角位移 ...

  8. waitdialogform z

    namespace DevExpress.Utils { using DevExpress.LookAndFeel; using DevExpress.Skins; using DevExpress. ...

  9. Maven实战(四)——基于Maven的持续集成实践

    Martin的<持续集成> 相信非常多读者和我一样.最早接触到持续集成的概念是来自Martin的著名文章<持续集成>.该文最早公布于2000年9月,之后在2006年进行了一次修 ...

  10. 【BZOJ】【3675】【APIO2014】序列分割

    DP+斜率优化 首先我们根据这个分割的过程可以发现:总得分等于k+1段两两的乘积的和(乘法分配律),也就是说与分割顺序是无关的. 再对乘积进行重分组(还是乘法分配律)我们可以转化为:$ans=\sum ...