java 内部类 场景_java内部类解析及应用场景简介 | 学步园

所谓内部类,就是一个类的定义放在了另一个类定义的内部,如:

publicclassOuterClass {

privateintouterData;

// .....

publicclassInnerClass {

privateintinnerData;

// ......

}

}

内部类应该算得上是Java学习过程中的一个难点了。它之所以难,我觉着有两个方面:一是它的语法相比于Java其它部分要显得繁琐,有很多需要注意的细节; 二是它的应用场景,即为什么Java需要这么一个东西,它到底能够带来什么样的好处?如果不能回答这个问题,那么即便熟悉了它的相关语法,也很难在今后的实践中使用它。而在我个人的学习过程中,第二点更加长久的困扰了我。

这篇blog也主要是围绕着这两个难点展开的。

为了便于理解,我将所有内部类中和static有关的部分全部放在了整片文章的结尾。所以,一开始可以暂时将这些内容置之不理。最后,我会解释为什么要这么做。

先解释一些和语法相关的内容。

正如前面的代码所展现的那样,内部类是在某一个类的内部所定义的。这样的话,它至少有两点和普通的class不太一样:

1. 它体现了一种代码的隐藏机制和访问控制机制。在这一点上,它很像是C++的嵌套类的概念;

2. 它包含有一个外部类的this指针。这是理解内部类特性非常重要的一点。正是由于有了这个指针,内部类可以访问外部类的所有元素。

将这两点结合到一起,就是内部类的本质了。

针对1. 的补充:

如果内部类被声明为public ,那么外部类作用域之外的地方是可以使用这个类名的,但是使用的方法必须是:

OuterClass.InnerClass

这其实就有点命名空间的意思了。要用InnerClass,可以啊,但永远都得前面带着个前缀...

而想创建这样的内部类的实例,则需要使用一个外部类的实例。比如如果有一个OuterClass的实例,OuterObject:

OuterClass.InnerClass InnerObject = OuterObject.new InnerClass();

这样,就可以在外部类作用域以外的地方得到一个内部类的实例了。而之所以需要这样做的原因,就在于内部类的实例必须含有一个外部类的this指针,如果不是先有一个外部类实例,哪来的这个this指针呢?

如果内部类被声明为private :

首先一点,在Java中,普通的类是不能被private修饰的。所以,只有内部类能够被private所修饰;

其次,如果被修饰成了private,那么内部类在外部类作用域之外的地方就不可见了。只有外部类能够使用内部类。这样,就实现了一种访问控制。

针对2. 的补充:

所谓可以访问外部类的所有元素,即包括了外部类的public/private的所有成员数据和方法。比如前面的代码,InnerClass是可以改变OuterClass的那个outerData的:

publicclassOuterClass {

privateintouterData;

publicclassInnerClass {

privatevoidfunc() {

OuterClass.this.outerData =1;

// ..........

}

}

}

另一方面,反向的,外部类对于内部类的所有元素也都有访问权,包括内部类的私有成员和方法:

publicclassOuterClass {

publicclassInnerClass {

privateintinnerData;

// .....

}

publicvoidfunc() {

InnerClass innerObj = newInnerClass();

innerObj.innerData = 0;

// .........

}

}

内部类的一种特殊的情况就是所谓的局部内部类,即在某个类的成员函数中定义内部类:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java2D 是 Java 平台提供的一个 2D 图形 API,可以用来创建各种图形、绘制图像、处理颜色、应用纹理等等。下面是一个简单的例子,展示如何使用 Java2D 创建一个简单的图形。 ```java import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.JFrame; import javax.swing.JPanel; public class MyPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; // 设置背景颜色 g2d.setBackground(Color.WHITE); // 设置画笔颜色 g2d.setColor(Color.BLACK); // 创建一个矩形 Rectangle rect = new Rectangle(50, 50, 100, 100); // 填充矩形 g2d.fill(rect); } public static void main(String[] args) { JFrame frame = new JFrame("Java2D Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 200); MyPanel panel = new MyPanel(); frame.add(panel); frame.setVisible(true); } } ``` 在上面的代码中,我们继承了 JPanel 类,并重写了它的 paintComponent 方法。在该方法中,我们首先调用了父类的 paintComponent 方法,然后获取 Graphics2D 对象,设置了背景颜色和画笔颜色,并创建了一个矩形,最后使用 fill 方法填充矩形。 在 main 方法中,我们创建了一个 JFrame 对象,设置了标题和大小,创建了一个 MyPanel 对象,并将它添加到 JFrame 中,最后设置 JFrame 可见。运行程序,你会看到一个黑色的矩形在白色的背景上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值