Java中类的继承学习小结
一、Java中什么是继承?
java是面向对象的编程语言,是类构成了java语言,而继承又是java 必不可少的,继承就是当你写一个类时,虽然这个类满足了某些功能但是你又想拓展它的功能,此时你就可以使用继承机制在写一个该类的子类,来完成你需要的功能;
二、继承的格式: public 子类名 extends 父类名(){}
注: Java中子类是单根继承的,即一个子类只能有一个父类,但一个父类可以有多个子类。
三、为什么需要继承?
子类继承父类时,子类会继承父类的所有行为和属性,子类可以复用父类的代码通过继承,可以不用重写父类中已有的属性和行为。在类与对象的学习总结中,战士类和怪兽类都具有相同的属性:血量和姓名,具有相同的方法:战斗方法,因此可以让它们都继承同一个父类,课提高代码的利用效率。
四、子类继承到了父类的哪些属性和方法
子类继承到了父类所有的属性和方法(public,protected,private,默认的)。
子类不能继承父类中访问权限为private的成员属性和方法。
1. 子类和父类在同一个包下,能调用的方法和属性:
只有私有的属性和方法不能在子类中和子类的对象调用。
2 .子类和父类不同包,能调用的属性和方法:
子类中: 公有的,受保护的属性和方法
子类的对象:公有的属性和方法
注:super关键字指父类对象,一般用来调用父类中方法
五、子类重写父类的方法
1 条件:1.已经继承到的方法
2.返回值数据类型 ,方法名,参数个数,参数类型, 参数顺序必须要和父类的完全一致。
3.子类重写方法时可以扩大访问修饰符的范围(但是不能缩小)。
2.什么情况要使用方法重写
当父类的方法不能满足实际的需求时
3.怎么调用重写的方法
优先调用子类的方法,如果子类没有,则调用父类的。
六、自动转型
要实现自动转型就必须要存在继承关系。
格式:
父类名 对象名 = new 子类构造方法();
Student stu = new UNStudent();
格式二:
public 返回值数据类型 方法名(父类名 对象名){
对象名.调用父类中定义过的方法();
}
父类名 对象名A = new 子类构造方法();
子类名 对象名B = new 子类构造方法();
方法名(对象名A);
方法名(对象名B);
自动转型引起编译错误的原因是:
1.编译机制的问题。
2.Java在编译的的时候,只会根据对象名的类型进行编译。
会将你调用的方法,拿到父类中进行一一比较,如果发现没有在父类中
定义的方法,则直接抛出编译错误。
注:程序运行时,还是会优先执行子类的方法,如果子类没有,才会执行父类的。
七、程序示例
通过改写类与对象学习总结中的战士与怪兽的程序达到:战士可以攻击怪兽,战士可以攻击其他的战士,怪兽也可以攻击其它的怪兽,知道一方的血量为0的时候结束战斗,输出谁胜利了!(战斗双方自行定义)。
/** * 定义一个Normal类 * @author huas * */ public class Normal { //定义属性 String name; int blood; //设置和调用属性值的方法 public void setName(String name){ this.name = name; }//设置姓名 public String getName(){ return name; }//得到姓名 public void setBlood(int x){ blood = x; }//设置血量 public int getBlood(){ return blood; }//得到血量 /** * 定义一个战斗方法 */ public void Attack(Normal n){ n.blood--; System.out.println(this.getName()+" 攻击了 "+n.getName()+" "); } } /* * 定义一个战士类继承Normal类 */ public class Soldier extends Normal{ /** * 构造函数 */ public Soldier(String name,int i){ this.name = name; blood = i ; } /** * 重写父类中的战斗方法 */ public void Attack(Normal n){ n.blood--; System.out.println(this.getName()+" 攻击了 "+n.getName()+" "); System.out.println(n.getName()+" 血量减一 "); System.out.println(n.getName()+" 血量为 "+n.getBlood()+" "+this.getName()+" 的血量为 "+this.getBlood()); System.out.println("----------------------------------------------------------------------------"); } } /* * 定义一个怪兽类继承Normal类 */ public class Monster extends Normal{ /** * 构造函数 */ public Monster(String name,int i){ this.name = name; blood = i; } /** * 重写父类中的战斗方法 */ public void Attack(Normal n){ n.blood--; System.out.println(this.getName()+" 攻击了 "+n.getName()+" "); System.out.println(n.getName()+" 血量减一 "); System.out.println(n.getName()+" 血量为 "+n.getBlood()+" "+this.getName()+" 的血量为 "+this.getBlood()); System.out.println("----------------------------------------------------------------------------"); } } /* * 定义一个Test类 */ public class Test { /**定义程序入口 * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //实例化一个战士对象和怪兽对象(自动转型) Normal sd1 = new Soldier("雷欧",13); Normal sd2 = new Soldier("泰罗",10); Normal ms1 = new Monster("哥斯拉",5); Normal ms2 = new Monster("玛伊王",7); //确定攻击对象 VS(sd1,ms2); } /** * 定义战斗平台 */ public static void VS( Normal n1,Normal n2){ //攻击前判断双方血量是否均大于零 while((n1.blood>0)&&(n2.blood>0)){ n1.Attack(n2);//n1攻击n2 if(n2.blood<=0){ System.out.println(n1.getName()+" 胜利了 !"); break; }//若n2血量为零,则n2胜利,跳出循环 n2.Attack(n1); if(n1.blood<=0){ System.out.println(n2.getName()+" 胜利了 !"); break; }//若n2血量为零,则n1胜利,跳出循环 } } }
//程序运行的结果为 雷欧 攻击了 玛伊王 玛伊王 血量减一 玛伊王 血量为 6 雷欧 的血量为 13 ---------------------------------------------------------------------------- 玛伊王 攻击了 雷欧 雷欧 血量减一 雷欧 血量为 12 玛伊王 的血量为 6 ---------------------------------------------------------------------------- 雷欧 攻击了 玛伊王 玛伊王 血量减一 玛伊王 血量为 5 雷欧 的血量为 12 ---------------------------------------------------------------------------- 玛伊王 攻击了 雷欧 雷欧 血量减一 雷欧 血量为 11 玛伊王 的血量为 5 ---------------------------------------------------------------------------- 雷欧 攻击了 玛伊王 玛伊王 血量减一 玛伊王 血量为 4 雷欧 的血量为 11 ---------------------------------------------------------------------------- 玛伊王 攻击了 雷欧 雷欧 血量减一 雷欧 血量为 10 玛伊王 的血量为 4 ---------------------------------------------------------------------------- 雷欧 攻击了 玛伊王 玛伊王 血量减一 玛伊王 血量为 3 雷欧 的血量为 10 ---------------------------------------------------------------------------- 玛伊王 攻击了 雷欧 雷欧 血量减一 雷欧 血量为 9 玛伊王 的血量为 3 ---------------------------------------------------------------------------- 雷欧 攻击了 玛伊王 玛伊王 血量减一 玛伊王 血量为 2 雷欧 的血量为 9 ---------------------------------------------------------------------------- 玛伊王 攻击了 雷欧 雷欧 血量减一 雷欧 血量为 8 玛伊王 的血量为 2 ---------------------------------------------------------------------------- 雷欧 攻击了 玛伊王 玛伊王 血量减一 玛伊王 血量为 1 雷欧 的血量为 8 ---------------------------------------------------------------------------- 玛伊王 攻击了 雷欧 雷欧 血量减一 雷欧 血量为 7 玛伊王 的血量为 1 ---------------------------------------------------------------------------- 雷欧 攻击了 玛伊王 玛伊王 血量减一 玛伊王 血量为 0 雷欧 的血量为 7 ---------------------------------------------------------------------------- 雷欧 胜利了 !
此程序的战斗双方可随意定义,VS(Normal n1,Normal n2)中的战斗双方子要满足时Normal类或其子类都可以进行回合制战斗!
注:在写程序的过程中发现父类中的构造方法一般是不能被子类继承的,由此百度:要使得父类的构造方法能够被子类继承:有一个B类继承A类 public B(){
super(); //如果A类的构造方法没有参数 这句就可以省略 如果A类没有无参数的构造方法,你还必须写出来,并且把要传递的参数也写到super(参数);
......
}
相关推荐
JAVA中的继承学习总结JAVA中的继承学习总结
Java学习之继承小结
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...
1、实验名称:类的继承、多态的应用 2、代码内容:学生管理类 3、【实验目的】 (1)进一步熟悉抽象类和抽象方法的定义 (2) 进一步掌握集成和多态的实现方式。
除了构造方法之外,父类的所有 方法和属性都被子类的对象继承 多态性是不同的实例对象以不同的方式对相同的信息作出不同的表现 访问修饰符用于确定访问类成员的方式 Java 常用修饰符有 static、final、abstract 接口...
Java学习过程中的总结,对于继承部分的总结-----------------------------------------------------------------------------------------------------------------------------------------------
1.继承及继承实例 2.方法重写(Overwrite) 3.super关键字 4.方法重载(Overload) 5.final修饰符 6.abstract修饰符 7.抽象类 8.接口 9.接口和抽象类对比 10.接口和抽象类使用场合实例 11.总结
Java方法继承、方法重载、方法覆盖总结。比较具体细致地描述他们之间的连系与区别,需要的同学可以看看。
封装继承多态总结
java的继承总结.doc
Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程类:Thread和Runnable 315 Java锁小结 321 java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java...
定义在一个类内部的类叫内部类,包含内部类的类...内部类可以声明public、protected、private等访问限制,可以声明为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。
JAVA学习笔记 Java知识点总结
Java设计一个银行帐户类,成员变量包括账号、储户姓名、开户时间、身份证号码、存款余额等帐户信息,成员方法包括存款、取款操作。
Java集合类总结 Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解2:Queue和LinkedList Java集合详解3:Iterator,fail-fast机制与比较器 Java集合详解4:HashMap和HashTable Java...
3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...
《Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java 开发环境 JDK JRE Java 开发环境配置 Java 基本语法 数据类型基础语法运算符 Java 执行控制流程条件语句 if 条件语句 if...else 条件语句if...else ...
3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...
java的学习总结 有继承 封装 多态 线程 都是自己总结的经验