静态内部类:类中静态类

成员内部类:类中非静态类

局部内部类:类中方法中有名字的类

匿名内部类:类中方法中无名的类

引言:在Java中通常情况下,一个类中会有属性和方法,但还可以包含内部类,内部类可以在类中还可以在方法中。

  1.  在类中的内部类:

    1)  静态内部类:在类中的静态类,静态内部类中的方法只能访问外部类中的静态成员变量,非静态变量不能访问,

      创建静态内部类的对象可以通过“外部类.内部类名()”完成。

    参见:com.oop.ch14.StaticInnerTest

package com.oop.ch14;

/**
* 练习”静态内部类“的创建和使用
*
*/
public class StaticInnerTest {
public static void main(String[] args) {
//创建静态内部类的对象来调用其中的方法
StaticInner.Inner inner = new StaticInner.Inner();
inner.view();
}
} /**
* 外部类:其中包含了内部类(静态内部类)
*
*/
class StaticInner{
static String name = "张三";
Integer age = 20; /**
* 定义一个内部类:其中有一个方法,方法中会访问外部类的属性
*/
static class Inner{
public void view() {
//在静态内部类中只能访问外部类中静态的成员变量name;非静态的age无法访问。
//System.out.println("age:" + age);
System.out.println("name:" + name);
}
}
}

    2)  成员内部类:在类中的非静态类,成员内部类中的方法能访问外部类中的静态成员变量和非静态变量,

      创建成员内部类的对象可以通过先创建外部类的对象,再通过“外部类的对象.new 成员内部类名()”完成。

    参见:com.oop.ch14.MemberInnerTest

package com.oop.ch14;

/**
* 练习”成员内部类“的创建和使用
* 成员内部类中的方法能访问外部类中的静态成员变量和非静态变量,
* 创建成员内部类的对象可以通过:
* 先创建外部类的对象,
* 再通过“外部类的对象.new 成员内部类名()”完成。
*
*/
public class MemberInnerTest {
public static void main(String[] args) {
//创建外部类的对象
MemberInner memberInner = new MemberInner();
//创建成员内部类的对象来调用其中的方法
MemberInner.Inner inner = memberInner.new Inner();
inner.view();
}
} /**
* 外部类:其中包含了内部类(成员内部类)
*
*/
class MemberInner{
static String name = "张三";
Integer age = 20; /**
* 定义一个内部类:其中有一个方法,方法中会访问外部类的属性
*/
public class Inner{
public void view() {
/**
* 成员内部类中的方法能访问外部类中的静态成员变量和非静态变量
*/
System.out.println("age:" + age);
System.out.println("name:" + name);
}
}
}

  2.  在方法中的内部类:

    1)  局部内部类:在方法中,该类有名称,在局部内部类中,可以定义方法,可以访问外部类的成员变量,

      在外部类的方法中可以直接创建内部类的对象并调用内部类的方法。

      在测试类中只需要创建外部类的对象就可以调用外部类的方法,同时也就调用了内部类的方法。

    参见:com.oop.ch14.PartInnerTest

package com.oop.ch14;

import com.oop.ch14.StaticInner.Inner;

/**
* 练习使用”局部内部类“
*
*/
public class PartInnerTest {
public static void main(String[] args) {
//创建外部类的对象,调用外部类的方法,会自动调用内部类的方法
PartInner partInner = new PartInner();
partInner.view();
}
} class PartInner{
//外部类的成员变量
String name = "外部类的成员变量";
Integer age = 18 ;
/**
* 外部类的方法
*/
public void view() {
//声明为final,放置多次调用后被修改
final String name = "内部类的成员变量";
System.out.println("外部类的view()的局部变量name的值:" + name);
/**
* 局部内部类
*局部内部类:在方法中,该类有名称,在局部内部类中,可以定义方法,可以访问外部类的成员变量,
*在外部类的方法中可以直接创建内部类的对象并调用内部类的方法。
*在测试类中只需要创建外部类的对象就可以调用外部类的方法,同时也就调用了内部类的方法。
*/
class Inner{
public void innerView() {
System.out.println("外部类方法中Inner内部类的方法innerView()输出的name:" + name);
}
} Inner inner = new Inner();
inner.innerView();
} }

    2)  匿名内部类:在方法中,该类没有名称,但是它可以继承某个父类或实现某些接口,

      同时也可以实现父类或接口中的方法,从而达到想实现的任务。

    参见:com.oop.ch14.CardLayoutTest.main(String[])

      javax.swing.AbstractButton.addActionListener(ActionListener)

package com.oop.ch14;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel; /**
*练习使用卡片布局管理器
*
*将组件元素放置在同一个位置,通过“事件”触发切换。
*/
public class CardLayoutTest {
static CardLayout cardLayout = new CardLayout();
static JPanel jp_images = new JPanel(cardLayout); public static void main(String[] args) {
JFrame jFrame = new JFrame("卡片布局管理器");
//1、定义需要的组件元素:面板、按钮
JPanel jp_image1,jp_image2,jp_image3;
jp_image1 = new JPanel();
jp_image2 = new JPanel();
jp_image3 = new JPanel();
//设置图片面板的背景,模拟在卡片上放置一张图片
jp_image1.setBackground(Color.RED);
jp_image2.setBackground(Color.GREEN);
jp_image3.setBackground(Color.BLUE);
//创建放置卡片的面板,同时将卡片布局管理器传入其中
//jp_images = new JPanel(cardLayout);
//将放置了图片的子面板放置到jp_iamges中
jp_images.add(jp_image1);
jp_images.add(jp_image2);
jp_images.add(jp_image3);
//定义jp_button面板放置按钮
JPanel jp_button;
jp_button = new JPanel();
//准备两个按钮
JButton jb_pre,jb_next;
jb_pre = new JButton("上一张");
jb_next = new JButton("下一张");
//将按钮放置到面板中
jp_button.add(jb_pre,BorderLayout.WEST);
jp_button.add(jb_next,BorderLayout.EAST); //2、将已经包含了组件元素的两个面板放置到窗体中
jFrame.add(jp_images);
jFrame.add(jp_button, BorderLayout.SOUTH); //3、设置JFrame窗体的一些参数
//设置在关闭窗体时默认要执行的操作,通常时退出程序本身
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体起始位置、宽高
jFrame.setBounds(200, 150, 400, 300);
//设置窗体可见性
jFrame.setVisible(true); /**
* 4、给上一张、下一张两个按钮添加点击事件
* 具体实施时需要通过”匿名内部类“来完成
* “匿名内部类”是一个方法中的一个类
* 但它没有名字,他要实现ActionListener接口,并实现其中的监听方法
*/
jb_pre.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.previous(jp_images);
} }); jb_next.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.next(jp_images);
} }); } /*
//如果实现ActionListener接口可以用实现方法的方式做
@Override
public void actionPerformed(ActionEvent e) { }*/
}

Java 四种内部类的更多相关文章

  1. java四种内部类详解

    一般来说,有4中内部类:常规内部类.静态内部类.局部内部类.匿名内部类. 一.常规内部类:常规内部类没有用static修饰且定义在在外部类类体中.   1.常规内部类中的方法可以直接使用外部类的实例变 ...

  2. Java基础(54):java四种内部类详解(转)

    一般来说,有4中内部类:常规内部类.静态内部类.局部内部类.匿名内部类.  一.常规内部类:常规内部类没有用static修饰且定义在在外部类类体中. 1.常规内部类中的方法可以直接使用外部类的实例变量 ...

  3. java 四种内部类和内部接口

    /** * 常规内部类:常规内部类没有用static修饰且定义在在外部类类体中. * 1.常规内部类中的方法可以直接使用外部类的实例变量和实例方法. * 2.在常规内部类中可以直接用内部类创建对象 * ...

  4. java四种内部类

    内部类有成员内部类,局部内部类,匿名内部类,静态内部类. 1,成员内部类package innerClass; public class InnerClassTest { String s1=&quo ...

  5. Java的四种内部类

    Java的四种内部类包括如下: 成员内部类 静态内部类 局部内部类 匿名内部类 成员内部类: 定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类,......相当于外部类的非静态方法 ...

  6. java内部类及四种内部类的实现方式

     java内部类及四种内部类的实现方式 一.内部类定义:内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类. 二.为何要内部类?a.内部类提供了某种进入外围类的窗户.b.也是最吸引人的原因, ...

  7. Java的四种内部类(含代码实例)

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  8. Java中的四种内部类

    Java中有四种内部类: 成员内部类:定义在另一个类(外部类)的内部,而且与成员属性和方法平级,故称成员内部类.类比于外部类的非静态方法,如果用static修饰就变成了静态内部类 静态内部类:使用st ...

  9. Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

随机推荐

  1. HBase 热点问题——rowkey散列和预分区设计

    热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作).大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用,这也会影响 ...

  2. 高级UI晋升之自定义View实战(六)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从Android 自定义属性动画&Camera动画来介绍自定义V ...

  3. 2019-9-2-C#委托

    title author date CreateTime categories C#委托 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 17:23:3 +08 ...

  4. robotframework+python3+selenium之web相关关键字---第二集

    1.F5可查看所有关键字,如图: 2.浏览器相关关键字: 2.1  Open Browser    https://www.baidu.com  chrome    # 打开浏览器,rf默认使用火狐浏 ...

  5. javascript onclick事件可以调用两个方法吗?

    答案是:可以的,onclick事件可以调用多个方法,每个方法之间用分号(:)隔开即可. onclick后面其实是可以写任何代码的,但是一般不建议这么写!! 例:onclick="fun1() ...

  6. 【leetcode】667. Beautiful Arrangement II

    题目如下: Given two integers n and k, you need to construct a list which contains ndifferent positive in ...

  7. 首次公开!单日600PB的计算力--阿里巴巴EB级大数据平台的进击

    MaxCompute作为阿里巴巴的主力计算平台,在2018年的双11中,再次不负众望,经受住了双11期间海量数据和高并发量的考验.为集团的各条业务线提供了强劲的计算力,不愧是为阿里巴巴历年双11输送超 ...

  8. sql 投影查询

    使用SELECT * FROM <表名> WHERE <条件>可以选出表中的若干条记录.我们注意到返回的二维表结构和原表是相同的,即结果集的所有列与原表的所有列都一一对应. 如 ...

  9. STM32嵌入式开发学习笔记(六):串口通信(上)

    本文我们将了解STM32与外部设备通过串口通信的方式. 所谓串口通信,其实是一个类似于计算机网络的概念,它有物理层,比如规定用什么线通信,几伏特算高电平,几伏特算低电平.传输层,通信前要发RTS,CT ...

  10. tp5.1 模型 where多条件查询 like 查询 --多条件查询坑啊!!(tp5.1与tp5.0初始化控制器不一样)

    tp5.1与tp5.0初始化控制器不一样!!!!!!!!!! 多条件 where必须  new where() ---------------------------------------tp5.1 ...