N种内部类详解
面向对象之内部类
1.内部类
-
什么是内部类
- 内部类就是在一个类的内部再定义一个类,比如A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。
-
内部类的种类:
- 1.成员内部类
- 2.静态内部类
- 3.局部内部类
- 4.匿名内部类
-
一个java文件中只能有一个public class,但可以有多个与public class并列的class类
1.1 成员内部类代码演示:
package oopdemo01.demo12;
//成员内部类
public class Demo01 {
private int age=99;
public void test(){
System.out.println("这是外部类的方法");
}
//一个java类中可以有多个class类,但是只能有一个public class类
//成员内部类 加static为静态内部类
class inner{
public void print(){
System.out.println("这是一个成员内部类");
}
//内部类可以获得外部类的私有属性
public void getAge(){
System.out.println(age);
}
public void getTest(){
test();
}
}
}
package oopdemo01.demo12;
// 成员内部类的调用
public class Application {
public static void main(String[] args) {
//new 外部类
Demo01 demo01 = new Demo01();
//通过这个外部类来实例化内部类
Demo01.inner inner = demo01.new inner();
inner.print();
inner.getAge();
inner.getTest();
}
}
运行结果
吃饭
1.2 静态内部类代码演示:
package oopdemo01.demo12;
//静态内部类 静态内部类;不能直接访问非静态的外部类属性(static先于非静态类生成)
public class Demo02 {
private int id=5;
public void out(){
System.out.println("这是一个外部类的方法");
}
//成员内部类 加static为静态内部类
public static class inner{
public static void innered(){
System.out.println("这是一个镜态内部类");
}
}
//静态内部类是随类一起加载的,而外部类的一些私有方法和属性是非静态的
//只有new关键字创建对象时才能够加载这些属性和方法,因此在静态已经加载的类中去调用那些没有加载的东西会报错。
public static void main(String[] args) {
Demo02 demo02 = new Demo02();
//inner inner = demo02.new inner(); //因为静态内部类先加载所有不能使用先new外部再内部的方法
inner inner = new inner();
inner.innered();
}
}
运行结果
这是一个镜态内部类
1.3 局部内部类代码演示:
package oopdemo01.demo12;
//局部内部类
public class Demo03 {
private String name="小明";
public void out(){
int age=8;
System.out.println("这是外部类的方法");
//局部内部类
class inner{
public void innered(){
System.out.println("这是局部内部内的方法");
}
}
//使用局部内部类
inner inner = new inner();
inner.innered();
}
public static void main(String[] args) {
Demo03 demo03 = new Demo03();
demo03.out();
}
}
运行结果
这是外部类的方法
这是局部内部内的方法
1.4 匿名内部类代码演示:
package oopdemo01.demo12;
//匿名内部类
public class Demo04 {
private String name="张三";
public void out(){
System.out.println("匿名内部类的方法");
}
}
class test{
public static void main(String[] args) {
new Demo04().out();//不用将new出的对象用变量名来承接,直接new 类().直接调用函数,而不用再用承接new出的引用类名去调用方法,new Apple像是调用静态方法的类名一样,直接类名.静态方法名。
//匿名内部类 没有名字初始化类,不用将实例保存到变量中
userService userService = new userService(){
@Override
public void add(String name) {
}
};
}
}
//接口
interface userService{
void add (String name);
}
运行结果
匿名内部类的方法