内部类
概念:在一个类内部再定义一个完整的类。
特点:内部类在编译之后能够生成独立于外部类的字节码class文件。
内部类可以直接访问外部类的私有成员,而不破坏其封装。
内部类可以帮外部类实现一些功能。
1.成员内部类
innclass类:
package com.tiedandan.java常用类;
import java.sql.SQLOutput;
public class innerclass {
private int id=1;
private String name="张铁蛋";
public static void main(String[] args) {
innerclass inner1 = new innerclass();//创建外部类对象
innerclass.inner f1 = inner1.new inner();//内部类对象的创建必须在外部类创建对象之后才可以创建。
inner f2 = inner1.new inner();//innerclass可写可不写
inner f3 = new innerclass().new inner();//可以把一二两步结合起来,一步完成内部对象创建。
f1.print();
test test0 = new test();
test0.test1();
}
public class inner{
// private static String countrey ="China";成员内部类中不能定义内部成员,但是能定义内部常量
private static final String country ="中国";
private String name ="铁蛋蛋";
public void print(){
System.out.println(id);
System.out.println(name);//当外部类属性和内部类相同时,会优先访问内部类属性
System.out.println(innerclass.this.name);//除非你在属性的名字前加上类的名字和this关键字(平时都被省略)。
}
}
}
测试类:
package com.tiedandan.java常用类;
public class test {
public static void test1(){
System.out.println("gogogo");
}
}
2.静态内部类
staticinnerclass类:
package com.tiedandan.java常用类.静态内部类;
import javax.naming.Name;
public class staticinnerclass {
private int id;
private String name="张铁蛋";
//静态内部类和外部类的用法一样,可以给外部类提供功能。
//只有静态内部类可以被static修饰,正常类不能被static修饰。
static class inner{
private String name="铁蛋蛋";
private String adress="翻斗花园";
public void print(){
//静态内部类调用属性和外部类一样
System.out.println(name);
System.out.println(adress);
System.out.println("我是静态内部类的输出方法");
}
public static void print2(){
//静态内部类的静态方法可以在内部类对象实例化后调用,和外部类调用其他类静态方法的方式一样。
System.out.println("我是静态内部类的静态输出方法");
}
}
}
Test类:
package com.tiedandan.java常用类.静态内部类;
public class Test {
public static void main(String[] args) {
//静态内部类的创建对象和普通类大致相同,不必再创建外部类对象,只要在内部类前面加上外部类的名称即可。
staticinnerclass.inner in1=new staticinnerclass.inner();
in1.print();
in1.print2();//调用静态内部类的静态方法,和调用外部类的静态方法一样。
}
}
3.局部内部类
partinnerclass类:
package com.tiedandan.java常用类.局部内部类;
import java.security.PrivateKey;
public class partinnerclass {
private int id =0;
private String name;
public void show(){
//定义局部内部类变量
final String email1;//
//局部内部类访问外部类的当前方法时,因为局部变量生命周期短,执行一次就会消失,所以要用fianl修饰。
String email2;//jdk1.8新特性,局部变量必须是常量final,所以不写final也行。
//局部内部类写在类的方法当中,等级和包含他的方法相同,适用范围在show方法里面。
//局部内部类仍然遵循内部类的规则
//内部类前面可以加修饰符,但是局部内部类不能加任何修饰符
class inner1{
//局部内部类属性
private int id= 1;
private String adress="翻斗花园";
public void show1(){
System.out.println("这是局部内部类的方法:");
System.out.println("这是局部内部类的id:"+id);
System.out.println("这是局部内部类的adress:"+adress);
System.out.println("这是外部类的id:"+partinnerclass.this.id);
}
}
inner1 inner = new inner1();//局部内部类使用前要先创建局部内部类对象,而且创建对象的位置要在局部内部类下面。
inner.show1();
}
}
Test类:
package com.tiedandan.java常用类.局部内部类;
public class Test {
public static void main(String[] args) {
partinnerclass part1 = new partinnerclass();
part1.show();
}
}
4.匿名内部类
没有类名的局部内部类,一切特征和局部内部类相同
必须继承一个父类或者实现一个接口
定义类,实现类,创建对象的语法合并
,只能创建一个该类的对象。
优点:减少代码量。