内部类与JTable
什么是内部类
定义: 将一个类定义在一个类或者一个方法里面,这样的类称着内部类
内部类的种类
内部类的种类有4种
成员内部类
成员内部类是最普通的一种内部类,成员内部类可以访问外部类所有的属性和方法。但是外部类要访问成员内部类的属性和方法,必须要先实例化成员内部类。
注意: 成员内部类里面不能包含静态的属性和方法
public class OutClass { public void test1() { } private void test2() { } private static void test3() { } class InnerClass {//成员内部类 private String testStrInner = ""; private void testInner() { test1(); test2(); test3();//成员内部类可以访问外部类所有的属性和方法。静态方法直接访问。 } } }
静态内部类
静态内部类就是在成员内部类多加了一个 static 关键字。静态内部类只能访问外部类的静态成员变量和方法(包括私有静态)
public class OutClass { private static String s = ""; public void test1() { } private void test2() { } private static void test3() { } static class InnerClass {//静态内部类 private static String testStrInner = ""; private static void testInner() { test3(); String ss = s; } } }
匿名内部类
在new对象的时候给出的类的定义形成了匿名类
匿名类可以继承某类,也可以实现某接口
Swing的消息机制广泛使用匿名类
匿名内部类:顾名思义就是没有名字的类。什么时候用到匿名内部类呢?在Android中最常见得回调监听事件 就是匿名内部类
一般遇到下面这种情况都会考虑到使用匿名内部类:
当一个内部类需要继承或者实现,而且只使用一次的时候,可以考虑使用匿名内部类。调用的时候直接使用父类的无参构造,并重写父类方法。
//父类 Animal public class Animal { public void bellow() {//动物吼叫的类型 System.out.println("动物吼叫"); } }
如果现在只是需要一个 狗(Dog)的吼叫类型。一般我们会写一个Dog类继承Animal ;然后重写
bellow()方法;最后实例化Dog类,调用bellow()方法。但是此时我们可以使用内部类,因为只用一次,没有其他地方调用,没必要再去写一个class类。
class Demo { public static void main(String[] args) { Demo demo = new Demo(); demo.getDogBellow(new Animal(){//匿名内部类,重写父类方法。当然接口也是一样 @Override public void bellow() { System.out.println("狗 汪汪汪。。。。"); } }); } public void getDogBellow(Animal animal){ animal.bellow(); } }
局部内部类
局部内部类就是定义在代码块内的一个内部类。比如在方法里面定义一个内部类,就是局部内部类。
局部内部类的作用范围仅仅就在它所在的代码块里。局部内部类不能被public ,protected,private以及static修饰,但是可以被final修饰。
public class Animal { public static void bellow() { String bellowStr = "动物吼叫"; System.out.println(bellowStr); final class Dog {//局部内部类 String dogBellowStr = bellowStr + ";狗 :汪汪汪"; public void dogBellow() { System.out.println(dogBellowStr); } } } }
内部类的作用
1、内部类可以很好的实现隐藏。
非内部类是不可以使用 private和 protected修饰的,但是内部类却可以,从而达到隐藏的作用。同时也可以将一定逻辑关系的类组织在一起,增强可读性。
2、间接的实现多继承。
每个内部类都能独立地继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。所以说内部类间接的实现了多继承。
注入反转
由按钮公布一个守听着接口和一对注册/注册函数
你的代码实现那个接口,将守听者注册在按钮上
一旦按钮被按下,就会反过来调用你的守听者对象的某个函数
JTable
用JTable类可以以表格的形式显示和编辑数据JTable类的对象并不存储数据,它只是数据的表现
JTable 表格组件介绍
data是一个二维数组,包含要显示的信息,heads是一个一维数组,其中的信息是列表头。在程序中使用表格,需要完成的步骤如下:
(1)创建一个JTable对象。
(2)创建一个JScrollPane对象(指定表格及水平和垂直滚动条)。
(3)将表格添加到滚动面板。
(4)将滚动面板添加到JFrame的内容窗格中。
菜单组件介绍
在Swing中,菜单通过JMenuBar、JMenu和JMenultem 实现。
(1)JMenuBar:代表菜单工具栏,可以在其中添加多个Jmenu菜单条。
(2)JMenu:代表菜单条,可以在其中添加多个JMenultem菜单项。
(3)JMenultem:代表菜单项。 高级应用
创建JMenuBar、JMenu和JMenultem 实例都可以直接通过其构造方法实现,构造方法中都含有一个字符串类型参数,该参数用于指定显示在菜单上的标题。例如,创建标题为“文件”的一级菜单条
JMenu jmf=new JMenu(文件(File)");
而创建菜单可以通过setMnemonic()方法设置快捷方式。为“文件”一级菜单设置快捷方式为“F”,并在该字母下添加下划线,
jmf.setMnemonic(“F°);
创建菜单的步骤如下:
(1)创建菜单工具栏JMenuBaro
(2)创建多个菜单条JMenu。
(3)创建多个菜单项JMenultem。
(4)将菜单添加至对应的菜单条中。
(5)将菜单条添加至菜单工具栏中。
(6)将菜单工具栏加入窗体类JFrame中。