深入理解17节:内部类与递归的巧妙运用
最编程
2024-07-19 12:50:12
...
12.23 源创会 · 上海站,聊聊 LLM 基础设施
内部类(Inner Class),内部类共分为4种。
1静态内部类(static inner class):
public static class Inner
{
}
只能访问外部类的静态成员变量与静态方法,生成静态内部类对象的方式为:
OuterClass.InnerClass inner = new OuterClass.InnerClass();2. 成员内部类(member inner class):可以访问外部类的静态与非静态的方法与成员变量。生成成员内部类对象的方式为:
OuterCLass.Inner inner=new OuterCLass().new Inner();
OuterClass.InnerClass inner = new OuterClass().new InnerClass();
4. 若想在局部内部类中访问外部类的成员变量,语法为:OuterClass.this.a;
lass MemberInner
{
private int a = 4;
public class Inner2
{
private int a = 5;
public void doSomething()
{
System.out.println(MemberInner.this.a);
}
}
//外部类中创建内部类的实例
public void method()
{
Inner2 inner = this.new Inner2();
}
}
5. 局部内部类(Local Inner Class):定义在方法当中,只能访问方法中声明的final类型的变量。
class LocalInner
{
public void doSomething()
{
final int a = 4;
class Inner3
{
public void test()
{
System.out.println(a);
}
}
new Inner3().test();
}
}
public class LocalInnerClassTest
{
public static void main(String[] args)
{
LocalInner localInner = new LocalInner();
localInner.doSomething();
}
}
6. 匿名内部类(Anonymous Inner Class):匿名内部类会隐式地继承一个父类或实现一个接口。
AnonymousInnerClassTest test = new AnonymousInnerClassTest();
// 匿名内部类
String str = test.get(new Date()
{
public String toLocaleString()
{
return "hello world";
}
});
System.out.println(str);
匿名内部类常用的方式,在swing中使用:
public static void main(String[] args)
{
JFrame frame = new JFrame("JFrame");
JButton button = new JButton("click me");
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println("welcome");
}
});
frame.setSize(200, 200);
frame.getContentPane().add(button);
frame.addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
frame.setVisible(true);
}
7. 所谓递归(Recursion),就是方法调用自身。对于递归来说,一定有一个出口,让递归结束,只有这样才能保证不出现死循环。
public static int compute(int f)
{
if (f>1)
{
return f*compute(--f);
}
else {
return 1;
}
}
public static void DeleteAll(File file )
{
if (file.isFile()||file.list().length==0)
{
file.delete();
}
else {
File []files=file.listFiles();
for (File file2 :files)
{
DeleteAll(file2);
}
file.delete();
}
}