`
Scliu123
  • 浏览: 40059 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

JDK_实例(方法与变量在继承时的覆盖和隐藏)

阅读更多

父类

 

package book.oo.coverhide;

public class Parent {
	/** 类变量,Parent的类别 */
	public static String kind = "book.oo.coverhide.Parent";
	/** 类变量,Parent的年龄 */
	public static int age = 50;
	/** 实例变量,Parent的名字 */
	public String name = "Parent";

	/** 静态方法,获取Parent的类别 */
	public static String getKind() {
		//静态方法中操作的只能是类变量
		System.out.println("Parent的getKind()方法被调用了!");
		return kind;
	}
	/** 静态方法,获取Parent的年龄 */
	public static int getAge() {
		System.out.println("Parent的getAge()方法被调用了!");
		return age;
	}
	/** 实例方法,获取Parent的名字 */
	public String getName() {
		//实例方法中操作的可以是实例变量,也可以是类变量
		System.out.println("Parent的getName()方法被调用了!");
		return this.name;
	}
	/** final方法,将Parent的年龄加1*/
	public final int nextAge(){
		return ++age;
	}
}

 

子类

 

package book.oo.coverhide;

public class Child extends Parent {

	/** 类变量,Child的类别 */
	public static String kind = "book.oo.coverhide.Child";
	/** 实例变量,Child的年龄*/
	public int age = 25;// age变量在Parent类中是static的。
	/** 实例变量,Child的名字 */
	public String name = "Child";
	/** 静态方法,获取Child的类别 */
	public static String getKind() {
		System.out.println("Child的getKind()方法被调用了!");
		return kind;
	}
	/** 静态方法,获取父类的名字*/
	public static String getParentKind(){
		//通过类名加"."访问父类中被隐藏的类变量
		return Parent.kind;
	}
	/** 实例方法,获取Child的名字 */
	public String getName() {
		System.out.println("Child的getName()方法被调用了!");
		return this.name;
	}
	/** 实例方法,获取父类的名字*/
	public String getParentName(){
		//通过super关键字父类中被隐藏的实例变量
		return super.name;
	}
//	错误!实例方法不能够覆盖父类的静态方法
//	public int getAge(){
//		return this.age;
//	}
//	错误!父类的final方法不能够被覆盖
//	public int nextAge(){
//		return ++age;
//	}
}

 

 

测试类

package book.oo.coverhide;

public class CoverHideTest {

	public static void main(String[] args) {
		// 类变量是指变量属于类,通过类名就可以访问类变量
		// 实例变量是指变量属于类的实例即对象,通过对象可以访问实例变量,但是通过类名不可以访问实例变量
		// 同样静态方法属于一个类,通过类名就可以访问静态方法,而实例方法属于对象,通过对象访问实例方法

		// 所谓隐藏是指,子类能隐藏父类的变量和方法,通过子类对象,不能访问父类被隐藏了的变量和方法,
		// 但是将子类对象转换成父类对象时,可以访问父类中被隐藏的变量和方法
		// 而覆盖则指,子类能覆盖父类的方法,通过子类对象,不能访问父类被覆盖了的方法,
		// 将子类转换成父类对象时,也不能访问父类中被隐藏的方法。
		// 方法可以被隐藏和覆盖,但是变量只可能被隐藏,不会被覆盖

		// 先测试继承时变量的覆盖与隐藏问题
		Child child = new Child();
		System.out.println("child name: " + child.name + "; age: " + child.age
				+ "; kind: " + child.kind);// 此时得到的都是Child类的变量值
		// 将child类型转换成Parent对象,
		Parent parent = child;
		System.out.println("转换成Parent后name: " + parent.name + "; age: "
				+ parent.age + "; kind: " + parent.kind);// 此时得到的都是Parent类的变量值
		/**
		 * 结论:父类的实例变量和类变量能被子类的同名变量隐藏。将子类对象转换成父类对象后,可以访问父类的实例变量和类变量
		 * 在子类中若需要访问父类中被隐藏的实例变量,需要使用super关键字。
		 * 在子类中若需要访问父类中被隐藏的类变量,需要使用父类的名字加"."来访问
		 */
		System.out.println();
		System.out.println("子类访问父类被隐藏的实例变量 name:" + child.getParentName());
		System.out.println("子类访问父类被隐藏的静态变量 kind:" + Child.getParentKind());

		// 再测试继承时方法的覆盖与隐藏问题
		System.out.println();
		child.getName();// 实例方法
		child.getKind();// 静态方法
		parent.getName();// 实例方法
		parent.getKind();// 静态方法
		/**
		 * 结论:父类的静态方法被子类的同名静态方法隐藏;而父类的实例方法被子类的同名实例方法覆盖!
		 * 将子类对象转换成父类对象后,可以访问父类的静态方法,但是不能够访问父类的实例方法。
		 * 
		 * 试图用子类的静态方法隐藏父类中同样标识的实例方法是不合法的,编译器将会报错
		 * 试图用子类的实例方法覆盖父类中同样标识的静态方法也是不合法的,编译器会报错
		 * 静态方法和最终方法(带关键字final的方法)不能被覆盖
		 * 
		 */

	}

	// child name: Child; age: 25; kind: book.oo.coverhide.Child
	// 转换成Parent后name: Parent; age: 50; kind: book.oo.coverhide.Parent
	//
	// 子类访问父类中被隐藏的实例变量 name:Parent
	// 子类访问父类中被隐藏的静态变量 kind:book.oo.coverhide.Parent
	//
	// Child的getName()方法被调用了!
	// Child的getKind()方法被调用了!
	// Child的getName()方法被调用了!
	// Parent的getKind()方法被调用了!

}

 

分享到:
评论

相关推荐

    Java JDK实例宝典

    6 方法和变量在继承时的覆盖与隐藏 2. 7 排序类 2. 8 Singleton单例模式 2. 9 Factory工厂模式 2. 10 Adapter适配器模式 第3章 数字 3. 1 数字与数字封装类 3. 2 格式化数字 3. 3 ...

    java范例开发大全

    实例11 常量与变量 18 实例12 各种进制的转换 19 实例13 Java中的进制与移位运算符 22 第3章 条件控制语句(教学视频:75分钟) 26 3.1 if控制语句 26 实例14 判断输入的年份是否为闰年 26 实例15 抽奖活动 27 3.2 ...

    Java程序设计实例与操作光盘

    丁永卫、谢志伟、高振栋主编的《Java程序设计实例与操作》以12个项目全面展示了Java语言的风采,其内容包括Java语言特色和Java开发环境介绍,Java的数据类型、常量、变量、运算符和表达式、控制结构等编程基础知识,...

    【05-面向对象(下)】

    •对一个final变量来说,不管它是类变量、实例变量,还是局部变量,只要该变量满足3个条件,这个final变量就 不再是一个变量,而是相当于一个直接量。  –使用final修饰符修饰;  –在定义该final变量时指定...

    JAVA 范例大全 光盘 资源

    实例4 变量和常量 9 实例5 基本数据类型转换 10 实例6 操作多种运算符 12 实例7 不同数制间的转换 17 实例8 多种方式实现阶乘的算法 20 第3章 流程控制语句 23 实例9 打印任一年日历 23 实例10 控制台输出...

    Java范例开发大全 (源程序)

     实例11 常量与变量 18  实例12 各种进制的转换 19  实例13 Java中的进制与移位运算符 22  第3章 条件控制语句(教学视频:75分钟) 26  3.1 if控制语句 26  实例14 判断输入的年份是否为闰年 26  实例...

    java范例开发大全(pdf&源码)

    实例11 常量与变量 18 实例12 各种进制的转换 19 实例13 Java中的进制与移位运算符 22 第3章 条件控制语句(教学视频:75分钟) 26 3.1 if控制语句 26 实例14 判断输入的年份是否为闰年 26 实例15 抽奖活动 27 3.2 ...

    java范例开发大全源代码

     实例11 常量与变量 18  实例12 各种进制的转换 19  实例13 Java中的进制与移位运算符 22  第3章 条件控制语句(教学视频:75分钟) 26  3.1 if控制语句 26  实例14 判断输入的年份是否为闰年 26 ...

    java编程基础,应用与实例

    5.6 静态变量与静态方法 70 5.7 成员与静态方法的关系 71 5.8 包与导入 72 5.9 访问控制符 74 5.10 重载 77 5.11 构造函数 79 5.12 类的初始化 83 5.12.1 静态块 84 5.12.2 实例块 84 5.13 巩固...

    枚举(switch、覆盖枚举、实现接口等)

    在JDK1.5 之前,我们定义常量都是: publicstaticfianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 public enum Color { RED, GREEN, BLANK, YELLOW ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

    Java开发技术大全(500个源代码).

    differ.java 测试静态方法与实例方法之间的区别 forefather.java 一个简单的基类 grandson.java 上面这个类的子类 hasConstructor.java 拥有构造器的类 hasFinalFun.java 拥有最终方法的类 hasRecall.java ...

    vc++6.0 程序设计学与用教程

    3.2 简单数据类型的实例化——变量与常量 3.3 整型常量和变量 3.4 浮点型常量和变量 3.5 字符型常量和变量 3.6 布尔型常量和变量 3.7 各类型数据间的优先关系和相互转换 第4章 运算符与表达式 4.1 算术...

    Java范例开发大全(全书源程序)

    实例11 常量与变量 18 实例12 各种进制的转换 19 实例13 Java中的进制与移位运算符 22 第3章 条件控制语句(教学视频:75分钟) 26 3.1 if控制语句 26 实例14 判断输入的年份是否为闰年 26 实例15 抽奖活动 ...

    Java入门教程(微学苑)-part1

    4.3 调用隐藏变量和被覆盖的方法 63 4.4 调用父类的构造方法 64 4.5 继承中的方法的覆盖和重载 65 4.6 多态和动态绑定 66 4.7 动态绑定 69 4.8 instanceof 运算符 70 4.9 多态对象的类型转换 71 4.10 Java static...

    Java语言学习教程大纲及实例

    - 函数定义(方法声明与调用) - 类与对象的概念与创建 - 构造函数与初始化 - 访问修饰符(public, private, protected, default) 3. **面向对象编程(OOP)概念**: - 类与对象的关系 - 封装(Encapsulation...

    Java开发技术大全 电子版

    4.3属性隐藏和方法的覆盖148 4.3.1属性的隐藏148 4.3.2方法的覆盖151 4.4构造方法的继承154 4.5super的使用156 4.5.1用super引用父类的成员156 4.5.2使用super调用父类的构造方法157 4.6继承的内部处理158 ...

Global site tag (gtag.js) - Google Analytics