• JAVA基础-内部类


    1. 概述把类定义在另一个类的内部,该类就被称为内部类。举例:把类Inner定义在类Outer中,类Inner就被称为内部类。

      class Outer {
          class Inner {
      
          }
      }
      
    2. 内部类的访问规则​

      • 可以直接访问外部类的成员,包括私有
      • 外部类要想访问内部类成员,必须创建对象
    3. 内部类的分类​

      • 成员内部类​
      • 局部内部类​
      • 静态内部类​
      • 匿名内部类
    4. 内部类好处:
      每个内部类都能独立的继承一个接口的实现,所以无论外部类是否
      已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得
      多继承的解决方案变得完整。

    成员内部类

    • 成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括
      private成员和静态成员)
    • 同名属性名方法名时 访问外部类 外部类.this.成员名
    • 成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部
      类的对象,前提是必须存在一个外部类的对象。所以在外部类访问内
      部类的时候
      Outter outter = new Outter();
      Outter.Inner inner = outter.new Inner();
    • 成员内部类可以使用四种权限修饰符进行修饰
    • 成员内部类中不能书写静态变量和方法
    //成员内部类
    
    
    //外部类  只能使用public 和默认值修饰 
    public class Outer {
    
    	static String name;
    	int age=10;
    	
    	public static void outerShow() {
    		
    	}
    	public void show() {
    		System.out.println("外部类show");
    	}
    	 class Inner{//成员内部类   跟外部类成员是同一级别 修饰符:public 默认的  private protected
    		//static String sex;//成员内部类中 不能使用static关键字修饰
    		 //成员内部类  访问外部类的属性(包含静态)和方法(包含静态)
    		int age=20;
    		
    		public void show() {
    			outerShow();//调用外部类方法
    			System.out.println(name);//调用外部类的属性
    			System.out.println(age);
    			System.out.println("innershow方法");
    			//当内部类属性与外部类属性名相同时,我想在内部类中访问外部类属性
    			//格式 外部类名.this.变量名
    			System.out.println(Outer.this.age);
    			//访问外部类 方法 同名时
    			Outer.this.show();
    		}
    	}
    	 
    		public static void main(String[] args) {
    			//成员内部类 创建对象的步骤   他依附于外部类
    			Outer outer=new Outer();
    			Outer.Inner inner=outer.new Inner();
    			inner.show();
    		}
    }
    
    

    局部内部类

    局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内
    部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

    这段代码,主要看调用show方法里面的age是如何调用的:

    //局部内部类
    public class Outer {
    	
    	static String password;
    	
    	
    	public void show() {
    		int age=0;
    		String sex="男";
    		 class Inner{//局部内部类 内部不能使用static关键字
    			 //局部内部类 只能使用默认权限修饰符修饰类
    			 //局部内部类 可以访问方法中局部变量
    			 //局部内部类与局部变量使用范围一样 在此方法内部
    			 //创建对象  
    			 //局部内部类 可以方法外部类中属性和方法(包含静态)
    			 //访问方法中的局部变量  通过方法参数传递完成
    			 //外部类与内部类重名 使用外部类.this.成员名(方法名())
    			int age=23;
    			String name;
    			public void show(int age) {
    				System.out.println(age);
    				System.out.println(sex);
    				System.out.println(this.age);
    				System.out.println(password);
    			}
    		
    		}
    		 //局部内部类 创建对象 要在方法内部 局部内部类的外部声明
    		 Inner n1=new Inner();
    		 n1.show(age);
    		 
    	}
    	public static void main(String[] args) {
    		Outer outer=new Outer();
    		outer.show();
    		
    	}
    }
    
    

    静态内部类

    • 静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一
      个关键字static。
    • 静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点
      类似,并且它不能使用外部类的非static成员变量或者方法
    • 静态内部类中即能声明静态成员 也可以声明非静态成员
    public class Outer {
    	static String sex="nan";
    
    	 static class Inner{//静态内部类 声明四种权限修饰符都可以
    		 //类中可以声明静态方法和非静态方法  以及成员变量和静态变量 
    		 //静态内部类中不能访问外部类非静态成员
    		int age;
    		static String name;
    		
    		public void show() {
    			System.out.println(sex);
    		}
    		
    		public static void display() {
    			System.out.println(sex);
    		}
    	}
    	 
    	 public static void main(String[] args) {
    		 //静态内部类 不依附外部类对象 直接new对象
    		Inner i1=new Inner();
    		i1.show();
    		Inner.display();
    	}
    	 
    }
    
    
    

    匿名内部类

    匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

    new 父类构造器(实参列表)|实现接口(){
    //匿名内部类的类体部分
    }
    
    
    interface A{
    	void show();
    }
    
    
    public class Outer {
    
    	String name;
    	public void callInner(A a) {
    		a.show();
    	}
    	public static void main(String[] args) {
    //		Outer outer=new Outer();
    //		outer.callInner(a);
    //		new Outer().display();
    		//安卓应用特别广泛
    	    //java 主要是做接口回调 优化
    		//匿名内部类
    		
    		new Outer().callInner(new A() {
    			
    			@Override
    			public void show() {
    				// TODO Auto-generated method stub
    				System.out.println("show");
    			}
    		});
    		
    		//通过实现子类
    		new Outer().callInner(new AImpl());
    		
    		//分步通过子类实现
    		Outer k = new Outer();
    		k.callInner(   new AImpl()   );
    	}
    	public void display() {
    		System.out.println("display");
    	}
    }
    class AImpl implements A{
    
    	@Override
    	public void show() {
    		System.out.println("show");
    		
    	}
    	
    }
    
    
    
  • 相关阅读:
    TensorFlow gfile文件操作详解
    ROS学习之日志消息
    typeid().name()获取类型名
    Ubuntu Qt配置QVTKWidget控件
    python-pcl简易文档(不包含自建函数与pcl_grabber包)
    ros源码之初始化函数init()调用的几个初始化函数
    奇异值分解(SVD)原理
    ROS节点的初始化及退出详解(ros::init、SIGINT、ros::ok、ros::NodeHandle)
    ROS Nodehandle句柄
    C++可变参数模板
  • 原文地址:https://www.cnblogs.com/JeasonIsCoding/p/13232516.html
Copyright © 2020-2023  润新知