1.继承的作用
- (1)提高代码的重用性
(2)提高程序的扩展性 -
2.java中继承的格式
(1)继承的关键字:extends
(2)继承的语法格式:pulic class 类名(子类名,派生类名,超类名) extends 类名(父类名,基类名){
}
3.子类继承了父类的那些属性和方法
子类继承了父类的所有的属性和方法,继承了所有的属性和方法并不代表所有的属性和方法都可以被使用.
eg:
a:儿子继承了父亲所有的财产但不可能一下全部都花掉
b:假设父类与子类同包
//定义一个父类Student类
public class Student{//姓名属性的值
private String name;//学分属性的值
private int score;}
//定义一个子类Unstudent类
public class Unstudent extends Student{
}
此时,子类继承的方法就不能用了,应为private只能在类{}中使用访问修饰符 访问修饰符的范围
private 只能在某个类的大括号内使用 类{private...}
默认的 算是一种受保护的包(继承中"protected"访问修饰符与"默认的"区别是前者可以出包也能使用)
protected 受保护的在包中使用
public 一个项目中的任何一个地方都可以使用
(1)子类与父类同包的情况
访问修饰符 private 默认的 protected public 类型都可以被子类对象直接使用
(2)子类与父类不同包的情况
public protected 访问修饰符类型可以被子类的对象直接调用来使用
4.方法重写
(1)为什么要方法重写
对一个对象来说其行为可以有多重不同的表现形式这是就要用到方法重写,比如说同事玩这个行为,
玩的不仅可以是篮球,还可以是其他东西
(2)方法重写的条件
必须是继承中在使用的;
子类的访问修饰符范围必须大于或等于父类的访问修饰符的范围;
返回值的类型,方法名,参数的数据类型,参数的个数,以及参数的顺序必须一致(3)方法重写与方法重载的区别:
前者必须存在继承的关系而后者则不需要;
前者的访问修饰符的类型可以不同,而后者的访问修饰符的类型必须与之前的一样;
前者的参数类型,参数个数,参数的顺序必须一致,而后者正是这些不同才能区分是某个对象的方法重载
(4)如何调用方法重写的
1>主函数的类中判断new的对象,如果new的是子类,那么先执行就是子类的方法
2>如果没有子类则执行的是父类的方法
5.自动转型
实现自动转型的前提条件必须是:继承关系
格式:
父类名 对象名=new 子类名();注意:
但是,在自动转型的时候,对象调用方法必须是父类中存在的方法;
假如父类中不存在un.play();的方法
在自动转型的时候 Student un=new UNstudent();un.play();
此操作的结果就会报错.造成这种现象的原因主要是java变异机制的问题,对象会根据对象的数据类型找对应的方法,不存在
该类方法就会报错自动转型的例子:JFrame.add(JPanel);
老师教学生 public void teach(Student un){
un.study()
}
UNstudent un=new UNstudent();
t.teach(un);6.多态
java中的方法重载, 方法重写,自动转型,继承等技术的结合
7.以对战类的游戏为例展现继承:
-
/** * 定义一个heroVS1hero的包来管理Solider类 */ package heroVS1hero; /** * 定义一个Solider类 * * @author Allen * */ public class Solider { // 定义一个名字属性 private String name; // 设置名字属性的方法 public void setName(String name) { this.name = name; } // 获取名字属性的方法 public String getName() { return name; } // 定义一个血量属性的方法 private int blood; // 设置血量属性的方法 public void setBlood(int blood) { this.blood = blood; } // 获取血量属性的方法 public int getBlood() { return blood; } // 技能属性 private Skill[] skill; // 设置技能属性 public void setSkill(Skill[] skill) { this.skill = skill; } // 获取技能属性 public Skill[] getSkill() { return skill; } // 定义一个攻击方法 public void pk(Solider sl) { // 技能随机 java.util.Random rand = new java.util.Random(); int index = rand.nextInt(skill.length); Skill sk = skill[index]; sl.setBlood(sl.getBlood() - sk.getAttack());// 被攻击英雄的血量设置 System.out.println(name + "攻击" + sl.getName() + "使用了技能" + sk.getName() + sl.getName() + "剩余" + sl.getBlood() + "滴血;"); } }
/** * 定义一个heroVS1hero的包来管理Solider1类 */ package heroVS1hero; /** * 定义一个Solider类继承自Solider类 * @author Allen * */ public class Solider1 extends Solider { //定义一个构造方法 public Solider1(String name,int blood){ super.setBlood(blood); super.setName(name); } }
/** * 定义一个heroVS1hero的包来管理Solider2类 */ package heroVS1hero; /** * 定义一个Solider2类继承自Solider * @author Allen * */ public class Solider2 extends Solider{ //定义一个构造方法 public Solider2(String name,int blood){ super.setBlood(blood); super.setName(name); } }
-
/** *定义一个heroVS1hero的包来管理skill类 */ package heroVS1hero; /** * 定义一个Skill类 * * @author Allen * */ public class Skill { /* * 技能的构造方法 */ public Skill(){} public Skill(String name,int attack){ this.name = name; this.attack = attack; } // 技能的名字属性 public String name; // 设置技能名属性 public void setName(String name) { this.name = name; } // 获取技能名的属性 public String getName() { return name; } // 技能伤害的属性 private int attack; // 设置技能伤害的属性 public void setAttack(int attack) { this.attack = attack; } // 获取技能伤害的属性 public int getAttack() { return attack; }
-
/** * 定义一个heroVS1hero的包来管理Vs_game类 */ package heroVS1hero; /** * 定义一个Vs_game类 * * @author Allen * */ public class Vs_game { /** * 定义一个程序的入口主函数 * * @param args */ public static void main(String[] args) { /* * 实例化一个Skill类 */ Skill[] sk = { new Skill("寒冰", 60), new Skill("禁錮", 70),new Skill("回复光环",80),new Skill("极寒领域",100) };//技能数组 Skill[] sk1 = { new Skill("法术箭", 130), new Skill("吼叫", 80),new Skill("命令光环",60),new Skill("换位",0) };//技能数组 // 创建一个Solider1类的对象 Solider1 sol = new Solider1("水晶室女", 1200); sol.setSkill(sk); // 创建一个Solider2对象 Solider2 sol1 = new Solider2("复仇之魂", 1100); sol1.setSkill(sk1); /* * 战斗方法 */ while (sol.getBlood() > 0 && sol1.getBlood() > 0) { sol.pk(sol1); if (sol1.getBlood() <= 0) { System.out.println(sol.getName() + "获得了胜利!"); break; } sol1.pk(sol); if (sol.getBlood() <= 0) { System.out.println(sol1.getName() + "获得了胜利!"); break; }// 判断双方法的血量 } } }
相关推荐
"Java继承总结" Java中的继承是面向对象三大特性之一,在知识点上存在许多重要的细节。下面将对Java继承的基本概念、语法格式、继承关系、方法重写、自动转型等进行详细的总结和分析。 一、继承的基本概念 继承是...
标题中的“圣诞树python-32-继承总结”暗示了这是一个关于Python编程语言的教程,具体涉及的是类的继承概念。在Python中,继承是面向对象编程的一个关键特性,允许我们创建一个类(子类)作为另一个类(父类)的扩展...
python 零基础学习篇
封装继承多态总结
c++继承与派生总结 面向对象的程序设计中提供了类的继承机制,允许程序员在保持原有类特性的基础上,进行更具体、更详细的类的定义。以原有的类为基础产生新的类,我们就说新类继承了原有类的特征,也就是说从原有类...
<本简缩教程的内容有: 1.创建类:类关键字、类及名空间、创建方法、创建属性、重载方法等。 2.... 3.继承:实现基本的继承、阻止继承、继承与辖域、保护方法、重载方法、重载与 构造方法、创建基类以及... 总结
### Java方法继承、方法重载、方法覆盖总结 在Java编程语言中,方法继承、方法重载、方法覆盖是三个非常重要的概念。它们之间既有关联又有区别,掌握这些概念对于深入理解面向对象编程有着至关重要的作用。 #### ...
这个文档总结概括了继承和抽象类的相关知识以及需要注意的事项
C++三种继承方式总结 C++语言中有三种继承方式:public继承、protected继承和private继承。这些继承方式主要是为了改变基类成员的访问属性,使得派生类可以访问基类的成员变量和成员函数。 首先,让我们了解一下类...
总结来说,JavaScript提供了多种继承方式,每种方式都有其特点和适用场景。原型链继承适合处理属性继承,而构造函数继承则适用于方法的继承。组合式继承是常用的继承模式,但存在性能问题。寄生式组合继承解决了这个...
本资源摘要信息将对 Java 基础知识点进行总结,涵盖继承、封装、多态等概念,并对面向对象的设计、数据库设计模式等进行讲解。 继承 继承是 Java 中的一种机制,允许一个类继承另一个类的属性和方法。继承的语法是...
### 总结 以上就是JavaScript中几种常见的继承方式,每种方式都有其适用场景和局限性。在实际开发中,根据具体需求选择合适的继承方式是非常重要的。例如,在需要传递初始化参数时,可以考虑使用构造函数继承或组合...
- **继承总结**:总结继承的相关概念及其在C#中的应用。 #### 第四部分:深入了解C# ##### 第十五章:接口 - **15.1 组件编程技术** - **接口概念**:定义了对象间交互的契约。 - **15.2 接口定义** - **定义...
总结,"WPF可继承窗体"是指在WPF中创建一个基础的窗体类,它包含了通用的样式和行为,然后其他窗体可以继承这个基础类,以此来实现代码的复用和维护。这涉及到XAML的布局和样式定义,以及C#中类的继承和事件处理。...
C++之继承思维导图的总结
总结来说,这个实验报告通过实际编程练习,帮助我们巩固了Java中抽象类和抽象方法的定义,以及类的继承和多态性这两个核心概念。通过设计和实现学生管理类,我们可以更深入地理解这些概念在实际问题解决中的应用。
C#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdf C#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdf
总结来说,继承和组合是面向对象编程中的关键概念,它们分别代表了“is-a”和“has-a”的关系。理解并熟练掌握这两者,将有助于开发出更加高效、可维护的代码。在C++中,灵活运用继承和组合,能够实现丰富的类层次...
总结来说,JavaScript的继承机制是其灵活性的关键之一,但也带来了学习曲线。理解并掌握这些继承方式,可以帮助开发者更有效地构建可扩展和可维护的代码。通过不断实践和比较,我们可以更好地利用这些机制,提高代码...