`
guanxianxiao
  • 浏览: 18712 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

对继承的个人理解

阅读更多
继承:关键字extends 
java 中继承是单继承  允许多个子类继承一个父类,不允许一个子类继承多个父类。

继承是继承父类的所有属性和方法,但并不是所有的属性和方法都可被子类调用;
子类继承父类是必须写一个与父类相同的构造方法,否则会报错。当实例化一个子类对象时,实际上
既调用子类的构造方法又调用了父类的构造方法(父类构造方法再子类构造方法)。

父类有哪些属性和方法?
private    类{}中
默认的 包中
protected 包中和包外的子类
public 项目中


子类可调用父类的哪些属性和方法呢?
1)子类继承父类 主函数中可调用的 属性和方法(子类和父类在同一包下)
protected
public
默认的
2)子类继承父类 主函数中可调用的 属性和方法(子类和父类在不同包下)
public
3)在子类中能调用的属性和方法(子类和父类在同一包下)
默认的
protected
public
4)在子类中能调用的属性和方法(子类和父类在不同包下)
protected
public

方法重写的条件?
1、继承
2、返回值数据类型、方法名、参数类型、参数个数、参数顺序必须完全一致
3、子类重写方法时可以扩大访问修饰符的范围(或保持一致):小的可转换为大的



什么情况下使用方法重写?
当子类与父类的方法一样时,但产生相应的效果不一样,如父类 学生 有一方法study(){grade++} 学习后考试成绩增加   子类大学生
也应有一个相同的学习的方法,但大学生学习后产生的效果肯定与父类不同,此时就需用到方法重写,如 study(){grade++;score++;}
此时,大学生学习后不光考试成绩增加而且学分也增加。总而言之,若想子类与父类有相同的行为,但会产生不同的效果时,就要用到重写。


如何调用重写后的方法?
super关键字  可调用父类的方法
调用构造方法:super(参数);
调用方法:    super.方法名;


自动转型
条件
必须存在继承关系

格式
父类名 对象名 = new 子类名();
例如:Student UNstudent = new UNstudent();

问题:无法调用子类的方法
原因:编译机制的问题,当调用方法时,系统会自动从父类中寻找相应的方法,若没有,则编译不通过,若有,则优先从子
类中调用相应的方法。(实际上实例化了两个对象(父类、子类),new 子类在内存中)

好处 (类似与多态中virtual用法)
大学英语老师教大学生,他也可以教高中生、初中生、小学生、幼儿园。
若没用到自动转型时:老师的teach方法
teach(大学生){study();}
teach(高中生){study();}
teach(初中生){study();}
teach(小学生){study();}
teach(幼儿园){study();}
若用到自动转型时:
teach(学生){study();}
生活中什么情况下是自动转型?
byte b = 10;
int i = b;

^ 动物类
| 哺乳动物
| 人类

人类是哺乳动物
哺乳动物是动物
人类是动物


多态:
多态指的是同一个父类由不同子类继承,如父类 Student  可由大学生UNstudent 小学生PRstudent ...继承,
相应的子类可调用父类相应的属性和方法,此时就不用将两个子类都共有的属性和方法,分开写在各自的类中,而可以直接从
父类中调用,这样可节省代码,减少代码的重复。




接口
定义接口的关键字是interface
格式
public interface 接口名 extends 接口,......{
//常量
public static final 数据类型  常量名 = 值;

//抽象方法
public 返回值数据类型 方法名(数据类型 数据名);//不能加大括号 若加了说明方法有具体实现
}

接口是多继承可同时继承多个接口,不能实例化对象

注意四点:


类去实现接口的关键字:implements




抽象类
定义抽象类的关键字:abstract class
格式:
public abstract class 抽象类名 extends 类名或抽象类名   implements 接口名,......{
//类中所有 的属性和方法

//接口中的常量和抽象方法

public abstract 返回值数据类型 方法名(数据类型 参数名,....);

}
抽象类也不能实例化对象

接口与抽象类的区别:抽象类中,可以定义已实现的方法,也可以定义像接口中没有实现的方法--继承的子类就必须实现;
       接口中的方法必须实现。



Hero父类
public class Hero {
	private String name;
	private int Q;
	private int W;
	private int E;
	private int R;
	private int blood;
	private char skill;
	
	public Hero(String name,int blood,int Q,int W,int E,int R){
		this.name = name;
		this.blood = blood;
		this.Q = Q;
		this.W = W;
		this.E = E;
		this.R = R;
	}
	//返回名字的方法
	public String getname(){
		return name;
	}
	//返回血量的方法
	public int getblood(){
		return blood;
	}
	//返回攻击力的方法
	public int getATK_Q(){
		return Q;
	}
	public int getATK_W(){
		return W;
	}
	public int getATK_E(){
		return E;
	}
	public int getATK_R(){
		return R;
	}
	
	
	//设置血量的方法
	public void setblood(int blood){
		this.blood = blood;	
	}
	//设置攻击的方法
	public void attack(Hero h,char skill){
		if(skill=='Q'){
			h.setblood(h.getblood()-this.getATK_Q());
			System.out.println(this.getname()+"技能Q攻击了"+h.getname());
			System.out.println(h.getname()+"的血量为:"+h.getblood());
		}
		else if(skill=='W'){
			h.setblood(h.getblood()-this.getATK_W());
			System.out.println(this.getname()+"技能W攻击了"+h.getname());
			System.out.println(h.getname()+"的血量为:"+h.getblood());
		}
		else if(skill=='E'){
			h.setblood(h.getblood()-this.getATK_E());
			System.out.println(this.getname()+"技能E攻击了"+h.getname());
			System.out.println(h.getname()+"的血量为:"+h.getblood());
		}
		else if(skill=='R'){
			h.setblood(h.getblood()-this.getATK_R());
			System.out.println(this.getname()+"技能R攻击了"+h.getname());
			System.out.println(h.getname()+"的血量为:"+h.getblood());
		}
			
	}
	
	//声明一个英雄战士函数
		public void show(){}
	
}




子类继承自父类
public class Twisted extends Hero {

	public Twisted(String name, int blood, int Q, int W, int E, int R) {
		super(name, blood, Q, W, E, R);
	}

	public void show(){
		super.show();
		System.out.println("英雄:"+super.getname()+"/血量:"+super.getblood()+"/Q(万能牌)的攻击力:"+super.getATK_Q()
				+"/W(选牌)的攻击力:"+super.getATK_W()+"/E(卡牌骗术)的攻击力:"+super.getATK_E()+"/R(命运)的攻击力:"+super.getATK_R());
	}
	
}


public class Garen extends Hero{

	public Garen(String name, int blood, int Q, int W, int E, int R) {
		super(name, blood, Q, W, E, R);		
	}
	
	public void show(){
		super.show();
		System.out.println("英雄:"+super.getname()+"/血量:"+super.getblood()+"/Q(致命打击)的攻击力:"+super.getATK_Q()
				+"/W(勇气)的攻击力:"+super.getATK_W()+"/E(审判)的攻击力:"+super.getATK_E()+"/R(德玛西亚正义)的攻击力:"+super.getATK_R());
	}
	
	
}



程序主函数

public class Battlefield {

	/**程序入口主函数
	 * @param args
	 */
	public static void main(String[] args) {
		Hero garen = new Garen("盖伦",1000,35,30,75,135);
		Hero twisted = new Twisted("崔斯特",700,100,50,100, 200);
		
		garen.show();
		twisted.show();
		
		while(garen.getblood()>0&&twisted.getblood()>0){
			twisted.attack(garen, 'Q');			//卡牌用Q攻击
			if(garen.getblood()<0){
				System.out.println(garen.getname()+"被击杀!");
				System.out.println(twisted.getname()+"拿到一血!!!!");
			}
			else {
				garen.attack(twisted, 'Q');		//盖伦用Q攻击
				if(twisted.getblood()<0){
					System.out.println(twisted.getname()+"被击杀!");
					System.out.println(garen.getname()+"拿到一血!!!!");
				}
				else{
					twisted.attack(garen, 'W');	//卡牌用W攻击
					if(garen.getblood()<0){
						System.out.println(garen.getname()+"被击杀!");
						System.out.println(twisted.getname()+"拿到一血!!!!");
					}
					else {
						garen.attack(twisted, 'W');		//盖伦用W攻击
						if(twisted.getblood()<0){
							System.out.println(twisted.getname()+"被击杀!");
							System.out.println(garen.getname()+"拿到一血!!!!");
						}
						else{
							twisted.attack(garen, 'E');	//卡牌用E攻击
							if(garen.getblood()<0){
								System.out.println(garen.getname()+"被击杀!");
								System.out.println(twisted.getname()+"拿到一血!!!!");
							}
							else {
								garen.attack(twisted, 'E');		//盖伦用E攻击
								if(twisted.getblood()<0){
									System.out.println(twisted.getname()+"被击杀!");
									System.out.println(garen.getname()+"拿到一血!!!!");
								}
								else{
									twisted.attack(garen, 'R');	//卡牌用R攻击
									if(garen.getblood()<0){
										System.out.println(garen.getname()+"被击杀!");
										System.out.println(twisted.getname()+"拿到一血!!!!");
									}
									else {
										garen.attack(twisted, 'R');		//盖伦用R攻击
										if(twisted.getblood()<0){
											System.out.println(twisted.getname()+"被击杀!");
											System.out.println(garen.getname()+"拿到一血!!!!");
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
}

分享到:
评论

相关推荐

    深入理解JavaScript是如何实现继承的

    最近最网上看了一个人面试淘宝时的经历,然后发现了自己有好多好多不太清楚的地方,所以特此写点文章来加深自己对一些问题的理解。 文章中提到了一个问题是:JavaScript是如何实现继承的?下面我便阐述一些在网上...

    个人信息管理系统.doc

    通过C++课程设计,使学生能够将学到的面向对象的设计思想运用在具体的工作和学习 中,加深对类和对象的理解,要求学生对生活中许多具体的事物抽象出类,并掌握继承 和派 生类、基类、虚函数和多态的概念。...

    c语言c++项目源代码_c++课程设计-个人收支管理系统.rar

    在功能实现上,本系统充分利用了C++的封装性、继承性和多态性特点,使得代码结构清晰、易于维护和扩展。此外,系统还采用了文件流技术,实现了数据的持久化存储,确保用户数据的安全性和完整性。 对于开发者而言,...

    Java 学习笔记极其详细版(包括一些个人色彩不仅仅是纯笔记)

    面向对象编程:类与对象、继承、多态、封装。 集合框架:List、Set、Map的使用及其实现原理。 Java I/O:文件操作、流处理。 多线程编程:线程的创建、同步机制、并发工具。 网络编程:Socket编程、URL和...

    关于JavaScript 原型链的一点个人理解

    例如语法类Java、函数借鉴Scheme、原型继承借鉴自Self、正则表达式借鉴于Perl。(DC Javascript:语言精粹)。  首先,每个JS是一门基于原型继承的面向对象的语言。里面数组是对象、函数是对象、“对象”当然还是...

    C#中的多态深入理解

    封装、继承、多态,面向对象的三大特性,前两项理解相对容易,但要理解多态,特别是深入的了解,对于初学者而言可能就会有一定困难了。我一直认为学习OO的最好方法就是结合实践,封装、继承在实际工作中的应用随处...

    C++学习笔记- 面向对象 .md

    C++学习笔记,博主个人向。内容是C++面对对象的,目录大致来源于菜鸟文档的C++面向对象,笔记是参考各种文章以及菜鸟文档改编的,内容包含C++类和对象(类定义和对象定义,类成员函数,类访问修饰符,友元函数,内联...

    如何理解Java抽象类和接口

     不卖关子,我个人对这两个的理解:  类是具体实例的抽象,比如一个json字符串的抽象;而抽象类是类的抽象;接口是抽象类的抽象,接口更像是一种协议  听我慢慢道来~  吐槽  首先,我必须吐槽一下这种面试...

    java接口学习笔记

    接口与继承息息相关,这些是个人对于接口的一些整理与理解!

    ATM自助取款系统(完整代码)

    其目的在于通过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用Java语言进行面向对象设计的基本方法,提高运用面向对象知识分析实际问题、解决实际问题的能力。 2. 课程设计任务与要求 课程...

    duotai.zip源码文件

    java的三大特性封装--继承--多态,每一步都是很关键的,其中实现多态又时很有用的,使用多态能有效降低程序的耦合度,基于我对多态理解写的一个简单的小案例,合适初学者或小白使用,...个人理解看法不同,仅供参考!

    个人集成平台

    而且前段时间,贱内(希望我老婆看不到这篇文章:))让我帮她做个定时提醒的小工具,做好之后感觉以前做了好多自己能用的小工具,如果能够整合到一起,该多好,所以,想起来做个个人工具集成平台,用来继承一系列我自己...

    UE4类关系图 xmind格式

    UnrealEngine的World中,C++的关系图以及各个类的功能概述,但是展开后截图太大,这里简单截图看一下吧,想进一步了解,自行看一下吧,都在个人对**虚幻 UnrealEngine4**理解,如果不对请大家包涵。

    GBlog好文本博客系统 v2.0

    GBlog新版采用C#语言编写,采用全新的静态页生成方式,继承asp版本的标签化设计,模板制作更加简单,搜索引擎优化效果显著提升。 好文本个人博客系统(GBlog)吸取之前版本的经验,更重视生成更新速度、易用性和...

    Java学习路线:day12

    文章目录第四章 面向对象(中)继承性的使用与理解继承性练习方法的重写(override/overwrite)方法重写的细节方法的练习四种访问权限修饰符关键字:super子类对象实例化过程(`尽量理解!`!)面向对象特征之三:多态性...

    学习新媒体后的点滴体会.doc

    使我受益匪浅,由其是听完 陈院长针对课程改革与学校文化建设的讲话,更加深了我对当前教育改革的理解和认识。 我认为现代化教育技术的应用,使教育内容更加丰富、完善了。特别是新媒体教育 网络的建立,已使教学形式...

    Java面向对象的三大特性和面向对象的进阶

    从封装、继承、多态、接口、内部类、抽象类和代码块 适合刚开始的新手参考,毕竟我也是自学的 主要可以使用在计算机刚入门的小伙伴或者回来看一看复习一下简单的基础的 ① 凡本网站注明“来源:本网站、子网站或相关...

Global site tag (gtag.js) - Google Analytics