成员内部类(类中的一个普通成员变量)
1、一个java文件中可以包含多个class,但是只能有一个public class
2、如果一个类定义在另一个类的内部,此时可以称之为内部类
使用
1、创建内部类的时候,跟之前的方法不一样,需要在内部类的前面添加外部类来进行修饰,如:InnerClassDemo.InnerClass innerClass = new InnerClassDemo().new InnerClass();
特点
1、内部类可以方便的访问外部类的私有属性
2、外部类不能访问内部类的私有属性(其他权限修饰符的属性也不行)、方法等等,只能将内部类的对象创建出来才可以方法属性和方法,如:System.out.println(new InnerClass().age);
3、普通的成员内部类中不能定义静态属性和静态方法(静态内部类中可以)
4、当内部类和外部类具有相同的私有属性,在内部类中访问的时候,直接访问内部类的属性,如果需要访问外部类的属性,如此:外部类的类名.this.属性名称
5、内部类可以嵌套多层,用法一样
示例
package com.msbline.innerclass;
public class InnerClassDemo {
private int id;
private String name="zhangsan";
public void show(){
System.out.println("show");
//外部类访问内部类的属性
System.out.println(new InnerClass().age);
}
class InnerClass{
private int age;
private String name="lisi";
public void test(){
System.out.println("test");
//可以访问外部类的私有属性
System.out.println(id);
//同名属性默认访问自己的内部属性
System.out.println(name);
//访问外部类的同名属性
System.out.println(InnerClassDemo.this.name);
}
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.msbline.innerclass;
public class TestInnerClass {
public static void main(String[] args) {
InnerClassDemo innerClassDemo = new InnerClassDemo();
innerClassDemo.show();
InnerClassDemo.InnerClass innerClass = new InnerClassDemo().new InnerClass();
innerClass.test();
}
}
匿名内部类
当定义了一个类,实现了某个接口,在使用过程中只需要使用一次,没有其他用途,其实考虑到代码编写的简洁,可以考虑不创建具体的类,而采用new interface(){添加未实现的方法},就叫做匿名内部类
示例
package com.msbline.innerclass;
public class NoNameInnerClassDemo {
public static void main(String[] args) {
//new Runnable看起来像是new了一个接口,实际上是new了一个Runnable的实现类
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
}
}
方法内部类
特征:
1、方法内部类不能定义成static
2、方法内部类里面也不能定义静态方法和属性
3、使用的时候只能在方法中创建对象,意外此class的作用域就是当前方法
示例
package com.msbline.innerclass;
public class MethodInnerClass {
public void show(int b){
System.out.println("show");
class InnerClass{
private String name;
public void test(int a){
System.out.println("test");
System.out.println(a);
System.out.println(b);
}
}
new InnerClass().test(12);
}
public static void main(String[] args) {
new MethodInnerClass().show(11);
}
}
静态内部类
特征:
1、静态内部类符合static的属性,只能访问static修饰的内容(无论是访问外部类还是内部类自己,都只能访问static修饰的内容)
2、外部类可以访问内部类的静态属性和方法,如:内部类名.属性名,内部类名.方法名,但是不能访问内部类的非静态属性,只能通过创建内部类对象来访问
示例
package com.msbline.innerclass;
public class StaticInnerClass {
private static int id;
private int gender;
public void test(){
//外部类访问内部类的静态属性
System.out.println(InnerClass.name);
//外部类访问内部类的普通属性
System.out.println(new InnerClass().age);
System.out.println("test");
}
static class InnerClass{
private static String name;
private String age;
public static void show(){
//访问外部类的static属性和方法
System.out.println(id);
//不能访问外部类的非static属性
// System.out.println(age);
//也不能访问自己的非static属性
// System.out.println(gender);
System.out.println("show");
}
public void show1(){
//访问外部类的static属性和方法
System.out.println(id);
//不能访问外部类的非static属性
// System.out.println(age);
//也不能访问自己的非static属性
// System.out.println(gender);
System.out.println("show");
}
}
public static void main(String[] args) {
InnerClass innerClass = new StaticInnerClass.InnerClass();
innerClass.show();
innerClass.show1();
//静态内部类的静态属性和静态方法跟普通类一样的访问方式,可以不用new对象
System.out.println(InnerClass.name);
InnerClass.show();
// InnerClass.show1();//非法
}
}
总结