• java内部类


    前言: 今天上了java课,老师讲的内部类,局部类,匿名类还是没搞太清楚,打算自己搜资料来复习一遍。

    参考文章:https://blog.csdn.net/qq7342272/article/details/6671433

    内部类: 在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类局部内部类匿名内部类静态内部类。下面就先来了解一下这四种内部类的用法。

    1.成员内部类:

    成员内部类是最普通的内部类,它的定义为位于另一个类的内部,形如下面的形式:

    public class Circle {
        double radius = 0;
        
        public Circle(double radius) {
            this.radius = radius;
        }
         
        class Draw {     //内部类
            public void drawSahpe() {
                System.out.println("drawshape");
            }
        }
    }
    

    在这里,Circle被称作为外部类,也叫做封装类。Draw 被称为内部成员类。

    这里我们需要注意的几个点是

    1、非静态成员内部类(也就是成员内部类)可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。

    2、非静态成员内部类(也就是成员内部类)只能定义非静态成员属性和成员方法

    3、静态成员内部类只可以访问外部类中的静态成员属性和成员方法

    4、静态成员内部类能定义静态成员属性和方法,也能定义非静态成员属性和方法

    问题:如果内部类和外部类的成员属性冲突了,是重名那该如何是好呢?

    上面的代码已经解释清楚了,当内部类和外部类的成员属性冲突,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

    访问封装类的非静态成员(包括属性和方法)

    外部类.this.成员
    

    访问封装类的静态成员(包括属性和方法)

    外部类.静态成员
    

    问题:如何在外部类之外创建静态成员类或者是非静态成员类呢?

    创建内部静态成员类:

    外部类名.静态内部成员类名 实例变量名 = new 外部类名.静态内部类()

    Circle c1 = new Circle();
    Circle.Tool to1 = new Circle.Tool(); // 创建静态内部类成员
    

    创建内部非静态成员类:

    外部类名.非静态内部成员类名 实例变量名 = 外部类的实例名.new 非静态内部成员类名()

    Circle c1 = new Circle();
    Circle.Draw to2 = c1.new Draw(); // 创建非静态内部类成员
    

    1.局部内部类: 局部内部类是在封装类的方法中定义的内部类,与局部变量类似,其作用域是定义它的代码块。

    利用: 典型用法是与接口配合,用局部类来实现接口,并在方法中返回接口类型。

    特征:

    1、局部类的类名不能和外部类的类名相同

    2、局部类可以abstract和final型

    3、访问修饰符只能是缺省的,也就是不可以是public、private、protected

    4、局部类不允许包含静态成员属性和方法

    5、局部类中只能访问它所在方法中的final型变量,不能访问非final型的变量。

    第五点的证明:

    public class Inside {
    	
    	public void to_inside() {
    		int cc=22;
    		class Inside_one{
    			public void inside_one_a() {
    				System.out.println(cc);
    			}
    		}
    
    		
    		Inside_one i1 = new Inside_one();   //局部类创建实例
    		i1.inside_one_a();
    		
    	}
    }
    
    

    这样子是无法进行访问的,这个原因是由于inside_one_a方法调用完毕之后就从栈中弹出了,但是这个时候由于局部内部类中使用了这个方法中的局部变量,而这个类还是不会立即回收的,所以只能将局部变量声明为final,表示常量,也意味着是持久的意思。


    匿名内部类: 一个没有显式的名字的内部类

    本质: 匿名内部类会隐式的继承一个类或者实现一个接口,或者说,匿名内部类是一个继承了该类或者实现了该接口的子类匿名对象。

    格式new 父类(){子类内容};

    匿名类的特点:

    1、匿名类可以继承父类的方法,也可以重写父类的方法。

    2、匿名类可以访问外部类的成员变量和方法,匿名类的类体不可以声明称static成员变量和static方法。

    一个简单的匿名类的实现:

    interface Cubic {
    	int getCubic(int n);
    
    }
    
    class A {
    	
    	public void f(Cubic cubic) {
    		double result = cubic.getCubic(4);
    		System.out.println(result);
    		
    		
    	}
    }
    
    public class Demo {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		A a = new A();
    		a.f(new Cubic() {
    			public int getCubic(int n) {
    				return n*n;
    				
    			}
    		});
    	}
    
    }
    

    参考文章:https://www.cnblogs.com/progor/p/8644634.html

    参考文章:https://www.runoob.com/w3cnote/java-inner-class-intro.html

  • 相关阅读:
    .net Dapper 学习系列(1) ---Dapper入门
    ASP.NET WebApi 学习与实践系列(2)---WebApi 路由请求的理解
    ASP.NET WebApi 学习与实践系列(1)---如何创建 WebApi
    Sqlserver 总结(2) 存储过程
    Image.Save出错 GDI 一般错误
    python导入模块的两种方式
    从1KW条数据中筛选出1W条最大的数
    C# EF更新当前实体报错 ObjectManager无法管理具有相同键值的多个对象
    微信小程序 异步请求拿数据+使用外部js库
    微信小程序入门 第一个页面搭建
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/11782236.html
Copyright © 2020-2023  润新知