ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JAVA基础-内部类

2020-07-03 20:41:08  阅读:267  来源: 互联网

标签:部类 JAVA 内部 show 基础 new Outer public


  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");
		
	}
	
}


标签:部类,JAVA,内部,show,基础,new,Outer,public
来源: https://www.cnblogs.com/JeasonIsCoding/p/13232516.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有