Java中如何访问同名的方法或变量 ?

/*
类变量:又叫静态变量,这种变量属于类,通过类名就可以访问类变量。
实例变量:属于类的实例即对象,通过对象可以访问实例变量,但是不能通过类名访问实例变量。
静态方法:方法属于类,通过对象访问实例方法,不能通过类名访问实例方法。

隐藏:B隐藏了A的变量或者方法,那么,B不能访问A被隐藏的变量或方法,但是,将B转换成A后,可以访问A被隐藏的变量或方法。
覆盖:B覆盖了A的变量或者方法,那么,B不能够访问A被覆盖的变量或方法,将B转换成A后,同样不能访问A被覆盖的变量或方法。

Java中方法和变量在继承时的覆盖与隐藏规则如下:
	父类的实例变量和类变量能被子类的同名变量隐藏。
	父类的静态方法被子类的同名静态方法隐藏。
	父类的实例方法被子类的同名实例方法覆盖。
	不能用子类的静态方法隐藏父类中同样标识的实例方法,否则编译器将会报错。
	不能用子类的实例方法覆盖父类中同样标识的静态方法,否则编译器会报错。
	最终方法(带关键字final的方法)不能被覆盖。
	变量只会被隐藏,不会被覆盖,无论她是实例变量还是静态变量。而且,子类的静态变量可以隐藏父类的实例变量,子类的实例变量可以隐藏父类的静态变量。
*/

public class AccessMethod
{
	public static void main(String[] args)
	{
		//先测试继承时变量的覆盖于隐藏问题
		System.out.println("在继承关系中,同名变量的覆盖与隐藏的执行内容如下:");
		ChildClass child = new ChildClass();
		System.out.println("\t创建了ChildClass对象,ChildClass的属性信息如下:");
		System.out.println("name:" + child.name + "; age:" + child.age + "; var:" + child.classVar);

		//将ChildClass类型转换成parentClass对象
		ParentClass parent = child;
		System.out.println("将创建的ChildClass对象赋值给ParentClass对象,其属性信息如下:");
		System.out.println("name:" + parent.name + "; age:" + parent.age + "; var:" + parent.classVar);

		System.out.println("子类可以访问父类被隐藏的实例变量name:" + child.getParentName());
		System.out.println("子类可以访问父类被隐藏的实例变量age:" + child.getParentAge());
		System.out.println("子类可以访问父类被隐藏的静态变量var:" + child.getParentVar());

		System.out.println("\n<<----------------<<------------>>------------------>>\n");

		//再测试继承时方法的覆盖与隐藏问题
		System.out.println("在继承关系中,同名方法的覆盖与隐藏的执行内容如下:");
		child.getName();		//实例方法
		child.getClassVar();	//静态方法
		parent.getName();		//实例方法
		parent.getClassVar();	//静态方法
	}
}

class ParentClass
{
	public static String classVar = "父类的字符串类变量";
	public static int age = 50;	//类变量,ParentClass年龄
	public String name = "ParentClass";	//实例变量,ParentClass的名字

	//静态方法,获取ParentClass的类别
	public static String getClassVar()
	{
		//静态方法中操作的只能是类变量,静态变量
		System.out.println("ParentClass的getClassVar()方法被调用!");
		return classVar;
	}

	//静态方法,获取ParentClass的年龄
	public static int getAge()
	{
		//静态方法中操作的只能是类变量,静态变量
		System.out.println("ParentClass的getAge)方法被调用!");
		return age;
	}

	//实例方法,获取ParentClass的名字
	public String getName()
	{
		//实例方法中操作的可以是实例变量,也可以是类变量
		System.out.println("ParentClass的getName()方法被调用了!");
		return this.name;
	}

	//final方法,将ParentClass的年龄减1
	public final int getPreviousAge()
	{
		System.out.println("ParentClass的getPreviousAge()方法被调用!");
		return --age;
	}
}

class ChildClass extends ParentClass
{
	public static String classVar = "子类的字符串类变量";
	public int age = 25;//实例变量,ChildClass的年龄,在ParentClass类是static的
	public String name = "ChildClass";//实例变量,ChildClass的名字

	//静态方法,获取ChildClass的类别
	public static String getClassVar()
	{
		//静态方法中操作的只能是类变量,静态变量
		System.out.println("ChildClass的getClassVar()方法被调用!");
		return classVar;
	}

	//静态方法,获取父类的类别
	public static String getParentVar()
	{
		//通过类名加“.”访问父类被隐藏的类变量
		return ParentClass.classVar;
	}

	//实例方法,获取ChildClass的名字
	public String getName()
	{
		System.out.println("ChildClass的getName()方法被调用!");
		return this.name;
	}

	//实例方法,获取父类的名字
	public String getParentName()
	{
		//通过super关键字父类中被隐藏的实例变量
		return super.name;
	}

	//实例方法,获取父类的年龄
	public int getParentAge()
	{
		return ParentClass.age;
	}
}

/*
1.同名的实例方法被覆盖,同名的静态方法被隐藏。
	Child类的getName()实例方法覆盖了Parent类的getName()实例方法;
Child类的getClassVar()静态方法隐藏了Parent类的getClassVar()静态方法。

2.隐藏和覆盖的区别在于:子类对象转换成父类对象后,能够访问父类被隐藏
的变量和方法,而不能访问父类被覆盖的变量和方法。
	把child对象转换成Parent类的对象parent时,不能访问parent的getName()实例方法;
	把child对象转换成Parent类的对象parent后,能够访问Parent的getClassVar()静态方法。

3.子类若需要访问父类中被隐藏的实例变量,需要使用super关键字。
	Child类的getParentName()方法中就使用super.name访问Parent类的name实例变量。

4.子类若需要访问父类中被隐藏的类变量,需要使用父类的名字加点“.”来访问。
	Child类的getParentAge()方法使用了ParentClass.age访问Parent类的age静态变量。

*/

时间: 2024-08-13 04:33:49

Java中如何访问同名的方法或变量 ?的相关文章

Java中各种(类、方法、属性)访问修饰符与修饰符的说明

类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备注 public 可以被本项目的所有类访问(使用),其他项目若想使用本项目中的类,必须将本项目打包为jar包,然后加入到classpath中 public类必须定义在和类名相同的同名文件中 (default) 只能被同一个包中的类访问(使用) 默认的访问权限,可以省略此关键字,可以定义在和public类的同一个文件中 修饰符 名称

(转) java中的访问修饰符

对Java中的修饰符一直记不住,现在结合网上的一些资料进行总结,并重点说明一下protected修饰符. 一. Java中的访问修饰符 Java面向对象的基本思想之一是封装细节并且公开接口.Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节.访问控制分为四种级别: (1)public: 用public修饰的类.类属变量及方法,包内及包外的任何类(包括子类和普通类)均可以访问: (2)protected: 用protected修饰的类.类属变量及

Java 中extends与implements使用方法 (转载)

转自:http://blog.csdn.net/chen_chun_guang/article/details/6323201 初学Java语言, 代码中的extends和implements让我感到很迷惑,现在终于弄明白它们之间的区别和用法了. //定义一个Runner接口 public inerface Runner { int ID = 1; void run (); } //定义一个interface Animal,它继承于父类Runner interface Animal extend

浅析Java中的访问权限控制

浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理? 场景2:如果工程师A编写了一个类ClassA,其中有两个方法fun1.fun2,工程师只想让fun1对外可见,也就是说,如果别的工程师来调用ClassA,只可以调用方法fun1,那么该怎么处理? 此时,访问权限控制便可以

Java中停止线程执行的方法

Java中停止线程执行的方法 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.暂停或停止线程的理论 在Java编程中,要暂停或停止当前正在运行的线程,有几种方法.对于把线程转入睡眠Sleep状态,使用Thread.sleep()是最正确的方式.或许有人会问,为什么不使用等待wait()或通知notify()?要知道,使用等待或通知都不是很好的方式. 线程可以使用等待wait()实现被阻塞,这属于条件等待的方式,当条件满足后,又会从阻塞转为等待状态

java中的访问控制符

首先来一张图: 对于一个类而言访问控制符只有一个public和默认无修饰符.其他的几个访问修饰符对于变量和方法都可以使用. 下面介绍具体的使用. 1. 公有访问控制符(public) Java的类是通过包的概念来组织的,包是类的一个松散的集合.处于同一个包中的类可以不需要任何说明二方便地相互访问和引用,而对于不同包中的类,则不行. 但如果一个类被声明为public时,它就具有了被其他包中的类访问的可能性,只要这些其他包中的类在程序中使用了import语句引入了public类,就可以访问和引用这个

将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)

方法一:使用Arrays.asList()方法 1 2 String[] asset = {"equity", "stocks", "gold", "foreign exchange","fixed income", "futures", "options"}; List<String> assetList = Arrays.asList(asset);

为什么Java中有些接口没有任何方法

由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一概念.接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类.接口中只包含方法的定义,没有方法的实现.接口中的所有方法都是抽象的.接口中成员的作用域修饰符都是public,接口中的常量值默认使用public static final修饰.由于一个类可以实现多个接口,因此通常可以采用实现多个接口的方式来间接的达到多重继承的目的. 在Java语言中,有些接口内部没有声明任何方法,也

Java中的equals和hashCode方法

本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法. equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复.这里我们首先要明白一个问题: equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的h