成员内部类
成员内部类 内类可以直接使用外类的成员以及静态变量方法。
public class Outer {
private String name;
public Outer(String name) {
this.name = name;
}
private static String a;
public static void a() {
System.out.println("a");
}
/**
* 内部类 也是外类的成员
* 内部类可以加任何成员的修饰符
* 静态的内部类不能加载外类 的成员,,但是可以调用外类的静态变量和方法
*
*/
public class Inner{
private String name;
public Inner(String name2) {
this.name = name2;
}
public void b() {
System.out.println(a);
System.out.println("b");
a();
}
}
}
再在测试类中进行相关实验:
成员内部类对象的创建:
Outer outer = new Outer("aaa");
Inner inner = outer.new Inner("bbb");
inner.b();
输出结果如下:

这里是因为inner的b方法要输出静态字符串的a变量,但是我们并没有给a赋值,所以这里输出的null。
静态内部类
对于静态内部类,只能调用外类的静态
public class Outer {
private String name;
public Outer(String name) {
this.name = name;
}
private static String a;
public static void a() {
System.out.println("a");
}
/**
* 内部类 也是外类的成员
* 内部类可以加任何成员的修饰符
* 静态的内部类不能加载外类 的成员,,但是可以调用外类的静态变量和方法
*
*/
public static class Inner{
private String name;
public Inner(String name2) {
this.name = name2;
}
public void b() {
System.out.println(a);
System.out.println("b");
a();
}
}
}
上述代码是没有错误的代码,但是如果把Outer中的a方法改成不是静态的
,就会出现报错现象。

将出现如下报错信息:
Cannot make a static reference to the non-static method a() from the type Outer
也就是前文所提静态的内部类只能调用外类的静态变量和方法。
匿名内部类
这个东西使用场景不是很多,而且后面我也会有补充,现在我们先简单说一下,详细的内容我会在以后的博客中更新。
我们先书写一段比较陌生的代码:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* @author Hercules
* @version 创建时间:2020年1月8日 下午5:04:58
* 类说明
*/
public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame();
JButton btn = new JButton("我是个按钮");
frame.add(btn);
//匿名内部类
//只能在一个地方使用
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("点击了这个按钮");
}
});
frame.setVisible(true);
}
}
大家只需要注意一个地方
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("点击了这个按钮");
}
});
这里的addActionListener里面传进来的不再是一个基本数据类型或者是一个对象了而是直接new了一个东西。这就是基本内部类,他是没有索引,没有引用的,也就是它放弃了在栈中的内存但是它并没有放弃在堆中的内存。好了就先介绍到这里,以后的博客我还会再更新这个匿名类的内容。
3693

被折叠的 条评论
为什么被折叠?



