一、Java继承的语法格式
1.继承的关键字:extends 避免重写代码的麻烦
2.格式:
public class 类名(子类、超类、派生类) extends 类名(父类、基类){
}
注:Java的继承是单继承,extends后边只能加一个类名。
二、子类继承到什么?能使用什么?
子类能继承到父类所有的属性和方法。
子类能调用的方法:
1.当子类和父类同包时:默认的、受保护的、公有的属性和方法能被子类的对象和子类{}中调用。
2.当子类和父类不同包时:子类的对象能调用的只有公有的属性和方法。
子类{}中能调用的有公有的、受保护的属性和方法。
Java的访问修饰符:private、默认的、protected、public
三、方法的重写(OverWrite)
1.实现方法重写的条件:
1.必须存在继承关系
2.返回值数据类型、方法名、参数类型、参数个数、参数顺序必须要和父类完全一致
3.子类重写方法时,访问修饰符可以大于或者等于父类方法的访问修饰符
默认-->protected-->public
2.调用方法
会优先执行子类的方法,子类没有时才会继承父类的方法。
如果想调用父类的方法,那么可以使用super.方法名();
super用法和this基本类似。重载构造方法中super(属性1,属性2,。。。。)
四、自动转型
举例:byte b = 1; int i = b;
JTextField jte = new JPasswordField();
写法: 父类 对象名 = new 子类();
一个大学生是一个学生,但不能反过来说。相当于“ is a ”
问题:无法调用子类自己定义的方法。
问题:Java为什么保留自动转型?
扩大使用范围。避免重写代码,减小工作量。
五、多态的实现
多态指相同类型的对象调用相同的方法时,由于继承和重写机制,得到的结果不一定相同。
六、代码
回合制游戏:奥特曼和小怪兽要战斗,直到一方的血量为0的时候结束战斗,输出谁胜利了!
奥特曼除了可以打小怪兽外,还可以攻击其他的奥特曼对象。
小怪兽除了可以打奥特曼外,还可以攻击其他的小怪兽对象。
分析:1.设置Man类,定义各种属性、方法
2.设置Outman类、Monster类,继承自Man类
3.在主函数中实例化outman、monster时用自动转型的方法可以直接使用父类的方法
4. 完成编写
注:(一方面为了显示方便、一方面对上节课的复习,把最终结果放到一个窗体上显示出来。其中使用了JTextArea类。
jte.setColumns(23);//设置JTextArea的列数
jte.setRows(19);//设置JTextArea的行数
jte.setEditable(false);//不可编辑
append 将给定文本追加到文档结尾 insert 将指定文本插入指定位置)这些都不是重点,重点是类的继承和自动转型的使用
/** * 定义一个Man类 * @author Administrator * */ public class Man { private String name; private int hp; private int atp; //重载一个构造方法 protected Man(String name,int hp,int atp){ this.name = name; this.hp = hp; this.atp = atp; } //设置名字属性的方法 public void setName(String name){ this.name = name; } //获取名字属性的方法 public String getName(){ return name; } //设置血量属性的方法 public void setHp(int hp){ this.hp = hp; } //获取血量属性的方法 public int getHp(){ return hp; } //设置攻击力点数属性的方法 public void setATP(int atp){ this.atp = atp; } //获取攻击力点数的方法 public int getATP(){ return atp; } //设置对对手造成伤害的方法 public int fight(Man newman){ newman.setHp(newman.getHp() - atp); newman.getHp(); // System.out.print(name+" 对 "+newman.getName()+" 造成 "+atp+" 点伤害。"); return newman.getHp(); } }
/** * 定义一个Monster类,该类继承自Man类 * @author Administrator * */ public class Monster extends Man{ //构造方法的重载 protected Monster(String name,int hp,int atp){ super(name,hp,atp); } }
/** * 定义一个奥特曼类,该类继承自Man类 * @author Administrator * */ public class Outman extends Man{ //重载一个构造方法 protected Outman(String name,int hp,int atp){ super(name,hp,atp); } }
import java.awt.Color; import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JTextArea; /** * 定义一个Fight类 * @author Administrator * */ public class Fight { /** * 入口主函数 * @param args */ public static void main(String[] args) { //实例化两个Outman类的对象、两个Monster类的对象 Man outman1 = new Outman("杰克奥特曼",500,200); Man outman2 = new Outman("艾斯奥特曼",600,160); Man monster1 = new Monster("怪兽一",400,220); Man monster2 = new Monster("怪兽二",550,170); //实例化一个窗体 Fight showFrame = new Fight(); showFrame.initGUI(outman1,outman2,monster1,monster2); //实例化三次战斗 //new Fight().twoFight(outman1, monster1); //outman1.setHp(5000); //monster1.setHp(4000); //new Fight().twoFight(outman1, outman2); //new Fight().twoFight(monster1, monster2); } //定义一个窗体 public void initGUI(Man outman1,Man outman2,Man monster1,Man monster2) { JFrame jf = new JFrame(); jf.setTitle("PK界面");//设置窗体的标题 jf.setSize(800, 400);//设置窗体的大小 jf.setLocation(300,150);//设置窗体位置 jf.setDefaultCloseOperation(3);//设置关闭时退出程序 jf.setResizable(true);//设置能调整窗口大小 jf.setLayout(new FlowLayout());//设置窗体布局 //调用战斗函数 new Fight().twoFight(outman1,monster1,jf); outman1.setHp(500);monster1.setHp(400); new Fight().twoFight(outman1,outman2,jf); new Fight().twoFight(monster1,monster2,jf); //设置窗体可见 jf.setVisible(true); } //定义战斗函数 public void twoFight(Man m1,Man m2,JFrame jf){ //实例化一个JTextArea类的对象 JTextArea jte = new JTextArea("\n"+m1.getName()+" 和 "+m2.getName()+" 开始PK"+"\n"+m1.getName()+" 血量为 "+m1.getHp()+" "+m2.getName()+" 血量为 "+m2.getHp()+"\n"+m2.getName()+" 率先攻击\n"); jte.setColumns(23);//设置JTextArea的列数 jte.setRows(19);//设置JTextArea的行数 jte.setEditable(false);//不可编辑 jf.add(jte); //战斗方法 while(m1.getHp()>0&&m2.getHp()>0){ m2.fight(m1); jte.append(m2.getName()+" 对 "+m1.getName()+" 造成 "+m2.getATP()+" 点伤害\n"); if(m1.getHp()<=0) break; else{ jte.append(m1.getName()+" 血量减少 "+m2.getATP()+" 点,血量剩余 "+m1.getHp()+" 点\n"); m1.fight(m2); jte.append(m1.getName()+" 对 "+m2.getName()+" 造成 "+m1.getATP()+" 点伤害。\n"); jte.append(m2.getName()+" 血量减少 "+m1.getATP()+" 点,血量剩余 "+m2.getHp()+" 点\n"); } } if(m2.getHp()<=0) jte.append(m2.getName()+" 血量为零 "+"\n"+m1.getName()+" 取得胜利\n"); else jte.append(m1.getName()+" 血量为零 "+"\n"+m2.getName()+" 取得胜利\n"); } }
相关推荐
封装继承多态总结
继承是面向对象编程(OOP)的一个核心概念,它使得我们可以定义一个类继承另一个类的字段和方法。这样做的好处是可以减少代码冗余,提高代码复用性。在Java中,继承通过`extends`关键字实现。Java中的继承支持单继承,...
这个文档总结概括了继承和抽象类的相关知识以及需要注意的事项
总结来说,这个实验报告通过实际编程练习,帮助我们巩固了Java中抽象类和抽象方法的定义,以及类的继承和多态性这两个核心概念。通过设计和实现学生管理类,我们可以更深入地理解这些概念在实际问题解决中的应用。
本文将深入探讨类继承的实现、作用以及相关的Java特性。 1. 类继承的实现和作用: 类继承通过使用关键字`extends`来实现。例如,`class ChildClass extends ParentClass`表明ChildClass是ParentClass的子类。继承...
总结来说,"表面积和体积_抽象类Shape_shape类继承_"的主题展示了如何利用C++的面向对象特性来设计和实现一个计算几何形状表面积和体积的程序。通过抽象类`Shape`定义通用接口,然后由具体的形状类(如`Cube`、`...
总结来说,Hibernate 3.2在处理类继承时提供了丰富的策略,开发人员可以根据具体需求选择合适的方式。理解和掌握这些策略有助于构建高效、可维护的ORM模型。通过`@Inheritance`注解和相应的配置,我们可以实现对象和...
在编程世界中,类与继承是面向对象编程(OOP)的核心概念,它们构成了许多现代编程语言的基础。本文将深入探讨这两个概念,并结合实际应用场景,帮助你更好地理解它们。 首先,我们来谈谈“类”。在OOP中,类可以...
c++继承与派生总结 面向对象的程序设计中提供了类的继承机制,允许...以原有的类为基础产生新的类,我们就说新类继承了原有类的特征,也就是说从原有类派生了新类。 类的派生机制的好处在于:代码的重用和可扩充性。
抽象类是一种不能被实例化的类,它用于定义共同接口,供其他类继承。在C#中,我们使用`abstract`关键字声明抽象类。例如,我们可能有一个`Animal`抽象类,其中包含一个抽象方法`MakeSound()`: ```csharp public ...
"Java继承总结" Java中的继承是面向对象三大特性之一,在知识点上存在许多重要的细节。下面将对Java继承的基本概念、语法格式、继承关系、方法重写、自动转型等进行详细的总结和分析。 一、继承的基本概念 继承是...
C++继承与派生类是面向对象编程的重要概念,它们允许我们创建新的类,这些类可以从现有的类(称为基类或父类)继承属性和行为。在这个实验中,我们将深入理解这两个概念,并通过实际编程练习来巩固它们。 一、继承...
本篇文章将详细介绍C#中的类继承,包括如何实现继承、构造函数在继承中的作用、以及重载、重写和隐藏的概念。 #### 二、实现继承 在C#中,实现类的继承非常简单。只需在定义子类时,在类名后面加上冒号 `:`,紧...
### C++类总结多态继承 #### 一、C++ 类的基本概念 1. **注意事项** - 在定义数据成员时不能直接给数据成员赋初值。这是因为类本身仅是一种类型,类中的数据成员并不实际占用内存空间。数据成员的初始化应该在...
实验报告可能会涵盖以下内容:实验目的(理解并掌握类的继承)、实验步骤(定义`Shape`和`Circle`类,实现相关方法)、实验结果(展示代码运行输出,如圆形面积的计算)以及实验总结(类继承的概念及其在实际编程中...
- 示例代码中,`Vehicle` 类的成员 `Maxspeed` 和 `Weight` 被 `Bicycle`、`Car` 和 `MotorCycle` 派生类继承,且能够通过派生类的 `Show` 方法进行访问。 3. 构造函数与析构函数的调用顺序: - 当创建派生类的...
7. 小结和最佳实践:总结继承的使用场景,提供关于何时以及如何使用继承的最佳实践。 通过学习这个视频教程,你将更好地理解C++继承的概念,并能熟练地在Qt开发中应用这些知识,创建出功能丰富、结构清晰的程序。
- 在C#中,我们使用`:`符号来表示一个类继承自另一个类。例如,如果`ChildClass`继承自`ParentClass`,代码会写作`public class ChildClass : ParentClass {}`。 - 子类继承父类后,将自动获得所有非私有(public...
在C++编程语言中,有时候我们可能需要创建一个类,使其不能被其他类继承,以保护类的结构和防止不合理的扩展。标题所提到的"不能继承的类",其目的是为了实现一种类的封闭性,确保其设计的意图不被误用。描述中提到...
这里 `Student` 类继承了 `Person` 类,添加了一个新的属性 `grade` 并重写了 `sayHello` 方法。当我们创建一个 `Student` 对象时,它不仅具有 `Person` 的所有属性和方法,还增加了自己的特性。 最后,我们谈谈...