首页 > 其他分享 >01内部类

01内部类

时间:2023-10-20 20:03:05浏览次数:26  
标签:部类 01 内部 System println public out

内部类

一、内部类的分类

  • 成员内部类
  • 静态内部类(static)
  • 局部内部类:类在方法的内部
  • 匿名内部类

二、内部类的概念(什么是内部类?)

  • 在一个类的内部再定义一个完整的类

    class Outer{
        class Inner{
            
        }
    }
    

三、内部类的特点

  • 编译之后可生成独立的字节码文件
  • 内部类可以直接访问外部类的私有成员,而不破坏封装。

四、成员内部类

  • 在类的内部定义,与实例变量、实例方法同级别的类。

  • 内部类是外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象。(下面实例化对象的两种方式)

    • Outer out = Outer;
      Inner in = out.new Inner();
      
    • Inner inner = new Inner();

  • 当外部类、内部类存在重名的属性时,会优先访问内部类的属性,如果要访问外部类属性可以用 外部类.this.属性 的方式访问。

  • 成员内部类不能定义静态成员,但是可以定义静态常量。

五、静态内部类

  • 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员。

    //外部类
    public class Outer {
    	private String name = "xxx";
    	private int age = 18;
    	
    	//静态内部类:和外部类相同
    	static class Inner2{
    		private  String address="上海";
    		private  String phone="111";
    		//静态成员
    		private static int count = 1000;
    		
    		public void show() {
    			//静态内部类show方法要怎么调用外部类的属性呢?
    			//1先创建外部类对象
    			Outer outer = new Outer();
    			
    			//2调用外部类对象属性
    			System.out.println(outer.name);
    			System.out.println(outer.age);
    			
    			//调用静态内部类的属性方法
    			System.out.println(address);
    			System.out.println(phone);
    			
    			//调用静态内部类的静态属性
    			System.out.println(Inner2.count);
    		}
    		
    	}
    }
    

    测试类:

    public class Mytest {
    	public static void main(String[] args) {
    		//直接创建静态内部类对象
    		Outer.Inner2 inner = new Outer.Inner2();
    		//调用内部类show方法
    		inner.show();
    	}
    }
    

六、局部内部类

  • 局部内部类定义在外部类的方法当中,作用范围和创建对象范围仅限于当前方法(只能在方法内使用)。

  • 局部内部类访问外部类的当前方法中局部变量时,因无法保障的生命周期与自身相同,变量添加final修饰。

  • 限制类的使用范围

    //外部类
    public class Outer2 {
    	private String name = "刘德华";
    	private int age  = 35;
    	
    	public void show() {
    		//定义局部变量
    		final String address="深圳";
    		
    		//局部内部类(在show方法里面的类):注意不能加任何访问修饰符
    		class Inner{
    			//局部内部类的属性
    			private String phone="15888888888";
    			private String email="[email protected]";
    			
    			//在内部类再定义一个方法
    			public void show2() {
    				//访问外部类的属性
    				System.out.println(Outer2.this.name);
    				System.out.println(Outer2.this.age);
    				//访问内部类的属性
    				System.out.println(this.phone);
    				System.out.println(this.email);
    				
    				//访问局部变量,jdk1.7要求:变量必须是常量final,jdk1.8可以自动添加fianl
    				System.out.println(address);
    			}
    			
    		}
    		//创建局部内部类对象,在用内部类对象inner调用show2方法里面的内容
    		Inner inner = new Inner();
    		inner.show2();
    	}
    }
    

    测试类:

    public class Mytest1 {
    	public static void main(String[] args) {
    		Outer2 out = new Outer2();
    		out.show();
    	}
    }
    

七、匿名内部类

  • 没有类名的内部类(一切特征都与局部内部类相同)

  • 必须继承一个父类或者一个接口

  • 定义类、实现类、创建对象的的语法合并,只能创建一个该类的对象。

  • 优点:减少代码量

  • 缺点:可读性较差

    接口类:

    //接口
    public interface Usb {
    	//服务方法
    	void service();
    }
    

    鼠标类:

    public class Mouse implements Usb{
    	@Override
    	public void service() {
    		// TODO Auto-generated method stub
    		System.out.println("连接成功,鼠标开始工作!");
    		
    	}
    }
    

    测试类:

    public class Mytest2 {
    	public static void main(String[] args) {
    		/*
    		//创建接口变量
    		Usb usb = new Mouse();
    		usb.service();
    		
    		//局部内部类
    		class Fan implements Usb{
    			@Override
    			public void service() {
    				// TODO Auto-generated method stub
    				System.out.println("连接电脑成功,风扇开始工作了!");
    			}
    		}
    		
    		//使用局部内部类创建对象
    		Usb usb2 = new Fan();
    		usb2.service();
    		*/
    		//以上的类只使用一次,所以没必要单独定义一个类,这时候就可以使用内部类
    		
    		//使用匿名内部类优化(相当于创建一个局部内部类),只用一次之后,后面就不再用了
    		Usb usb3 = new Usb(){
    			@Override
    			public void service() {
    				// TODO Auto-generated method stub
    				System.out.println("连接电脑成功,风扇开始工作了!");
    			}
    		};
    		
    		usb3.service();
    		
    	}
    }
    

标签:部类,01,内部,System,println,public,out
From: https://www.cnblogs.com/ahbzbn/p/17777897.html

相关文章

  • ZJOI2015 地震后的幻想乡
    「ZJOI2015」地震后的幻想乡前言:想了很久,最后只能失败告终。基本分析到了一半,只是没有将其转化为古典概型后考虑求解方案数。说实话有点可惜……题意:给定一张\(n\)个点\(m\)条边的无向连通图,每条边的边权是\([0,1]\)之间的随机实数,求其最小生成树上最大边权的期望值......
  • [BJWC2018] 序列合并
    朴素的\(O(n^4)\)是容易的,考虑如何优化,通过一些观察可以发现\(\texttt{dp}\)不具有凸性和决策单调性,所以只能用普通的矩阵乘法来优化,我们令\(\texttt{dp}\)数组构成的矩阵为\(A\),那么\(dp_{l,r}\)则可以从所有\(L\leqslantx\leqslantR\)的\(A^x\)转移而来,我们采用......
  • P6378 [PA2010] Riddle-2sat优化建图
    P6378[PA2010]Riddle-2sat优化建图\(n\)个点\(m\)条边的无向图被分成\(k\)个部分。每个部分包含一些点。请选择一些关键点,使得每个部分恰有一个关键点,且每条边至少有一个端点是关键点。\(1\leqn,m\leq10^6\)边的限制用\(n\)个变量\(x_1\dotsx_n\),其中\(x_i\)......
  • [CERC2014] Outer space invaders
    题目描述Thealiensfromouterspacehave(finally!)invadedEarth.Defendyourself,orbedisintegrated!Orassimilated.Oreaten.Wearenotyetsure.Thealiensfollowaknownattackpattern.Therearennattackers,thei−thi−thoneappearsattimeaiai......
  • Win2012 搭建NTP 服务器
    1、regedit1、修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config中"AnnounceFlags"值为52、修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer中"Enabled"值为12、servi......
  • cuda visual studio integration vs2017安装失败
    版本不匹配?还是之前安装了旧的nvidia程序?参考1:https://zhuanlan.zhihu.com/p/150579521?utm_id=0()参考2:https://blog.csdn.net/qq_40963335/article/details/104907922(有用)删除任何已安装的nvidia相关程序包。再安装cuda就不报错了。 (以下信息仅适用于NsightVisualStudio功......
  • 01_二极管
    二极管单向导通性:电流只能从正极流向负极,不能从负极流向正极二极管测试电路图特性:​ 二极管导通之后,它所分的电压值为0.7V;​ 发光二极管导通之后所分的电压值为1~2V,电流值为5~20mA结论:(对于1N4148)​ 当二极管两端的电压很小时,它是不导通的,当电压达到0......
  • Windows 10连接网络打印机报错“0x0000011b”的解决方法
    网络打印,win10/11都经常遇到这样那样的问题。今天遇到一台新装的windows10系统连接网络打印机报错:0x0000011b网上查了一圈,普遍说的是这个情况,微软官方介绍:通过命名管道使用RPC  也就是网上说的最多的注册表方式:WindowsRegistryEditorVersion5.00[HKEY_LOCAL_MACHINE\S......
  • 20231018 NOIP 模拟赛
    时间安排7:50~8:00看题,只会A。8:00~8:10写完A。8:10~9:00推式子+写40pts,少乘了一个\(n-i+1\)调了半天。9:00~9:01看了一眼C的式子,猜一手结论。9:01~10:21觉得可以换根,写个暴力\(dp\)。10:09会了50pts,换下根就行了,10:21调出来了。10:21~10:50给B和C加......
  • 20231019
    20231019NOIP#24总结时间安排7:40~8:10看题,\(A,B,C\)各会一点,\(D\)没想法。8:10~8:30写\(A\)的暴力。8:30~9:00写\(C\)的暴力。9:00~9:30会\(A\)写了。9:30~11:00马上看出了\(B\)的做法,但是可能太久没写了写挂了,调了一个小时。11:00~11:40\(D\)写半天看......