一段奇怪的代码,大家来解个惑吧!

曾赛 发布于 2009/12/23 17:56
阅读 636
收藏 0

今天在和同事复习复用类的时候,突然想到这样一段代码,很变态的用法,输出结果让自己吃了一惊:

public class A {
	private void say() {
		System.out.print("in a\n");
	}
	
	public class B extends A {
		private void say() {
			System.out.print("in b\n");
		}
		
		public void print() {
			say();
		}
	}

	public void getSay() {
		new B().say();
		new B().print();
		((A)(new B())).say();
	}
	

	public static void main(String args[]) {
		A a = new A();
		a.getSay();
	}
}

输出结果:

in b
in b
in a

从结果上看,在 类B之外访问了 类B 的私有方法,这好像和Java的规则(在类之外,包括子类,不能访问类的私有成员)不一样,这里在 17 行访问了B的私有方法 say()。不能理解,呵呵,大家来解个惑吧!

 

加载中
0
kumat
kumat

B是A的内部类

0
谢新

私有方法是不可以被Override,所以前两个是B

然后第三个是强制向上转型,所以,私有方法也根着变化……

0
曾赛
曾赛

引用来自“kumat”的帖子

B是A的内部类

那么17行的调用是算在 B类 内部,还是 B类 外部?

0
曾赛
曾赛

引用来自“谢新”的帖子

私有方法是不可以被Override,所以前两个是B

然后第三个是强制向上转型,所以,私有方法也根着变化……

能详细讲解一下,这一过程中内存中数据的变化吗?

0
y
yangjianshan

这种结构有什么实际作用?

0
红薯
红薯

引用来自“yangjianshan”的帖子

这种结构有什么实际作用?

实际的作用,就是怎么在考试中把你弄得晕头转向。

0
Sephiroth
Sephiroth

引用来自“红薯”的帖子

引用来自“yangjianshan”的帖子

这种结构有什么实际作用?

实际的作用,就是怎么在考试中把你弄得晕头转向。

 让我突然联想到scjp

0
曾赛
曾赛

引用来自“施洲博”的帖子

引用来自“红薯”的帖子

引用来自“yangjianshan”的帖子

这种结构有什么实际作用?

实际的作用,就是怎么在考试中把你弄得晕头转向。

 让我突然联想到scjp

仅仅是一时好奇,呵呵,

要说弄明白的好处嘛,可以为以后创立一门编程语言打个基础,嘿嘿~!~

0
灬猜想灬

私有方法不能被override,所以B类是重新定义了一个自己的方法.

内部类相当于外部类的属性,所以即使是私有的,外部类也可以调用.

0
kumat
kumat

内部类是Java1.1开始引入的特性,用的更普遍的是匿名的内部类,用Java写GUI回调的时候非常常用的。LZ可以看看下面的链接,希望对你有帮助:

http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html

返回顶部
顶部