首页 > 编程语言 > 详细

Java 四种内部类

时间:2019-11-06 18:56:59      阅读:106      评论:0      收藏:0      [点我收藏+]

一、   内部类:

引言:在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 四种内部类

原文:https://www.cnblogs.com/zhangzimuzjq/p/11807210.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!