当前位置:编程学习 > JAVA >>

请教方法中的内部类如何引用?

下面是一道考题,请帮忙纠错。。。我不知道,方法中的内部类如何引用,谢谢!

另外我总结了一些内部类的用法,但对于匿名内部类如何传参数,还是不太清楚,请指教。。。贴子http://blog.csdn.net/u010219358/article/details/9109865

package com.ocjp.innerClz;

 public class Internet {
 private int y = 8;
 public static void main(String[] args) {
 new Internet().go();
 }
 void go() {
 final int x = 7;
 Internet internet = new Internet();
 //方法中的内部类,如何引用?
 TCPIP ip = new TCPIP(); //compling failure here.
 class TCPIP {
 void doit() { System.out.println(y + x); }
 }
 ip.doit();
 }
 } ocjp 内部类 --------------------编程问答-------------------- 内部类相当于一个外部类的成员,如果想拿内部类的对象首先需要创建外部类的对象!!!

然后由外部类对象创建内部类对象!
--------------------编程问答-------------------- 内部类是要定义在另一个类的类体中,你代码里怎么跑到方法体里面了 --------------------编程问答-------------------- 这是一道考题,要求指出哪一行代码是错误的。 --------------------编程问答-------------------- 你把内部类都写到方法里面去了,这是不行的。给你一个例子吧:
public class Test6 {
String str="outside";
public  static void main(String ...args){
new Test6().new interClass().print();
}

//内部类
class interClass{
String str="inside";
public void print(){
System.out.println(this.str); //打印内部属性str
System.out.println(Test6.this.str);  //打印外部属性str
}
}
}
--------------------编程问答-------------------- 1、类不可再方法内定义。
所以需要移动到方法体外。Internet类内。

2、不可接受变量x,x是final的局部变量。需要作为参数传入。

修改后代码如下:


 public class Internet {
 private int y = 8;
 public static void main(String[] args) {
 new Internet().go();
 }
 void go() {
 final int x = 7;
 Internet internet = new Internet();
 //方法中的内部类,如何引用?
 TCPIP ip = new TCPIP();  

 ip.doit(x);
 }

//1、移动到和方法同等级

  class TCPIP {
//2、增加参数x, 但y可以直接访问,因为内部类可以访问宿主的所有成员。
 public void doit(int x) 
 { System.out.println(y + x); 
}
 }

 } 


再匿名内部类,一般是 实现interface、覆盖父类方法的类,比如,我有一个JPanel重载了父类的
patientComponent方法,可以用匿名内部类

import javax.swing.*;
import java.awt.*;
public class InnerClass
{
InnerClass()
{
JFrame frame = new JFrame()
{
//本质上这已经是一个JFrame的子类,是一个全新的类!但你没有给他一个名字,而只是指定了
//这个类的父类或者接口
private String s = "Times New Roman";
private Font f = new Font("Times New Roman",2,20);
@Override
public void paint(Graphics g)
{
super.paint(g);
g.setFont(f);
g.drawString(s ,100,100);
}
};

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(10,10,800,600);
frame.setVisible(true);
}

 


public static void main(String[] args)
{
new InnerClass();

}
}
--------------------编程问答-------------------- 谢谢各位!
我搞明白了,原来的代码出错,是顺序问题,它根本不认识TCPIP这个类,下述代码是正确的,测试过了.

package com.ocjp.innerClz;

 public class Internet {
 private int y = 8;
 public static void main(String[] args) {
 new Internet().go();
 }
 void go() {
 final int x = 7;
 Internet internet = new Internet();
 //方法中的内部类,如何引用?
//  TCPIP ip = new TCPIP();
 class TCPIP {
 void doit() { System.out.println(y + x); }
 }
 TCPIP ip = new TCPIP();
 ip.doit();
 }
 } --------------------编程问答-------------------- 不能再方法里定义内部类, 可以这么该一下


public class Internet {
 private int y = 8;
 final int x = 7;
 
 public static void main(String[] args) {
 new Internet().go();
 }
 
 void go() {
 TCPIP ip = new TCPIP(); 
 ip.doit();
 }
 
 class TCPIP {
 void doit() { 
 System.out.println(y + x); 
}
}

}
--------------------编程问答-------------------- 一句话:
方法内部类对象不能使用该内部类所在方法的非final局部变量。 
然后楼主自己判断吧。 --------------------编程问答-------------------- 谢谢纠正我的错误概念。。。

本人初学者,经常概念不太清楚。。。

OCJP考题有些比较坑人,没有实际意义,纯粹为了考查某个知识点而设计. --------------------编程问答-------------------- 初学者不要看OCJP的书,全都是坑。 还是看看入门的书吧。你这种程序如果实际中用到,会被人骂死的 --------------------编程问答-------------------- 这种说内部类绝对不够严谨,应该是local class,翻译成局部类更好 --------------------编程问答-------------------- 首先,题目出错是代码顺序问题正确代码:
package csdn.programbbs_620;

public class Internet {
private int y = 8;

public static void main(String[] args) {
new Internet().go();
}

void go() {
final int x = 7;
Internet internet = new Internet();
// 方法中的内部类,如何引用?
class TCPIP {
void doit() {
System.out.println(y + x);
}
}
TCPIP ip = new TCPIP(); // compling failure here.

ip.doit();
}
}
--------------------编程问答-------------------- 内部类:就是把这个类看成是外部类所拥有的一个类。
1.在外部类中,你可以任意使用内部类。
2.在主方法或者其他类中,你若要用内部类就要先调用外部类。
内部类一个好处——隐藏你不想让别人知道的操作,也即封装性。在《java编程思想》;里面有说:“利用内部类定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换”(简单点说:A做好事不留名,做完事都用 B 的名,用户都以为是 B 做的,能访问 B ,不能访问 A。这就是策略模式)

匿名内部类:你去看这篇匿名内部类的精讲http://blog.csdn.net/liuzhidong123/article/details/6561521
另外说下,匿名内部类也是一种模式的体现:adapter(适配器):将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,