在进行多线程实例编程时,发现别人使用了内部类来进行代码和逻辑简化,特别回顾了下内部类,果然长期不写代码,语法会忘记的很快。
- 内部类
- 内部类的特点
- 匿名内部类
- 内部类的创建
- 其他内部类(除匿名内部类外)
1.内部类
内部类又称“嵌套类”,是定义在类内部的类,目的在于将逻辑相关的类放在一起。包含内部类的类常被称作外部类,内部类可以被视作外部类的一个成员,故也被称为“成员类”,在语法结构上,内部类与普通的类并没有差别,同样拥有自己的成员变量,成员方法,构造方法。
内部类的命名不能与外部类相同
public class Group{
private int age;
public class Student{
String name;
public Student(String n,int a){
name=n;//访问内部类的变量name
age=n;//可以访问外部类的变量age
}
public void output(){
System.out.println("姓名"+this.name+";年龄"+age);
}
}
public void output(){//内外部类的成员方法可以重名
Student stu=new Student("刘 洋",24);//在内部类外,外部类内声明以及创建内部类实例的方法
stu.output();
}
public static void main(String args[]){
Group g=new Group();
g.output();
}
}
2.内部类的特性
内部类具有以下特性:
可被private和protected修饰符修饰;
当被final修饰时,不可继承;
被定义为抽象类时,必须被其他内部类继承或实现;
内部类可以使用外部类的成员变量,包括静态变量以及实例成员变量;
内部类也可以是一个接口,但必须被其他内部类实现;
内部类还可以在代码块中定义,但是只能访问该代码块中用final定义的局部变量;
3.匿名内部类
匿名内部类指的是用内部类创建的没有名称的对象。匿名内部类在一步之内完成了声明内部类以及创建内部类对象的工作。不取名字,而是直接采用父类名或接口名。
1.匿名内部类必须继承一个抽象类或者实现一个接口。
2.匿名内部类没有类名,因此没有构造方法。(摘自)
public class test{
public static void main(String args[]){
new Inner()//采用匿名内部类来创建内部类Inner的对象
{
void setName(String n){
name=n;
System.out.println("姓名"+name);
}
}
}
static class Inner{
String name;
}
}
下面的例子摘自(),是利用匿名内部类来实现接口的例子,能够帮助更进一步理解匿名内部类。
//匿名内部类
//声明一个接口
interface MyInterface {
//接口中方法没有方法体
void test();
}
class Outer{
private int num = 5;
public void dispaly(int temp)
{
//匿名内部类,匿名的实现了MyInterface接口
//隐藏的class声明
new MyInterface()
{
public void test()
{
System.out.println("匿名实现MyInterface接口");
System.out.println(temp);
}
}.test();
}
}
public class Test{
public static void main(String[] args)
{
Outer out = new Outer();
out.dispaly(3);
}
}
4.内部类的创建方法
内部类的创建方法主要有以下三种:
(1)在外部类外部创建非静态内部类:
外部类.内部类 对象名称=new 外部类().new 内部类()
(2)在外部类外部创建静态内部类:(静态类无法实例化,不能使用new关键词)
外部类.内部类 对象名称=new 外部类(). 内部类()
(3)在外部类内部创建内部类(当然是除了内部类定义为静态类的情况)
内部类 对象名称=new 内部类()
5.其他内部类
因为内部类还可以定义在代码块中的特性,所以内部类还有其他几种类型,主要指的是方法内部类,在这种情况下,该内部类只能访问方法体中定义的final修饰的成员变量。