• 《JAVA 核心技术 基础知识》 内部类 笔记


    内部类结构

    class Outer
    {
    	private String name="outer";
    	
    	public static void println(String str){
    		System.out.println(str);
    	}
    	
    	class Inner
    	{	
    		String name="inner";
    		public void print()
    		{
    			String name="local";
    			println(name);
    			println(this.name);
    			println(Outer.this.name);
    		}
    	}
    }
    
    public class InnerClassTest {
    	
    	
    	public static void main(String []args)
    	{
    		Outer outer=new Outer();
    		Outer.Inner inner=outer. new Inner();
    		inner.print();
    	}
    
    }
            内部类在没有同名成员变量和局部变量的情况下,会直接访问外部类成员变量,而无需
    指定Outer.this.属性名 否则,内部类中的局部变量会覆盖外部类的成员变量
    访问内部类本身成员变量可以使用this.属性名,访问外部类成员变量 Outer.this.属性名

    静态内部类

    class Outer
    {
    	private String name="outer";
    	private static String string="static";
    	
    	public static void println(String str){
    		System.out.println(str);
    	}
    	
    	static class Inner
    	{	
    		public void print()
    		{
    			//println(name);
    			println(string);
    		}
    	}
    }
    
    public class InnerClassTest {
    	
    	
    	public static void main(String []args)
    	{
    		Outer.Inner inner=new Outer.Inner();
    		inner.print();
    	}
    
    }
    

            将内部类声明为静态,则内部类只能访问外部类的静态成员变量,
    并且不需要外部类对象 new 一个内部类,可以直接 :
    Outer.Inner inner=new Outer.Inner();

    私有类


    class Outer
    {
    	private String name="outer";
    	
    	public static void println(String str){
    		System.out.println(str);
    	}
    	
    	private class Inner
    	{	
    		public void print()
    		{
    			println(name);
    		}
    	}
    }
    
    public class InnerClassTest {
    	
    	
    	public static void main(String []args)
    	{
    		
    		/*	错误代码
    		 * Outer outer=new Outer();
    		 *Outer.Inner inner=outer.new Inner();
    		 */
    	}
    
    }


      内部类定义为私有时,只能由外部类本身使用它,而外部无法操作。

    匿名内部类

    class Outer
    {
    	private String name="outer";
    	
    	public static void println(String str){
    		System.out.println(str);
    	}
    	public void outerPrint(final int x)
    	{
    		new Thread()
    		{
    			public void run()
    			{
    				println(""+x);
    			}
    		}.start();
    		println("x finshed");
    	}
    	
    }
    
    public class InnerClassTest {
    	
    	
    	public static void main(String []args)
    	{
    		
    		Outer outer=new Outer();
    		outer.outerPrint(10);
    	}
    
    }

            因为执行到 println("x finshed");语句的时候方法中的变量x的生命周期就结束
    了,然而run方法中还需要使用x。所以:
            静态内部类中使用的局部变量与方法中的局部变量并不是同一个局部变量,只是值
    和方法中的局部变量的值相等。

            也就说如果局部变量的值在编译期间就可以确定,
    则直接在匿名内部里面创建一个拷贝。如果局部变量的值无法在编译期间确定,
    则通过构造器传参的方式来对拷贝进行初始化赋值。

            既然run方法中的变量x与outerPrint方法中的x不是同一个变量,那如果run方法中
    改变x的值,就会造成数据的不一致,所以必须将变量x限制为final 不允许对x进行更改
    对于引用型的变量则是不允许指向新的对象,这样数据不一致的问题就解决了。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    VSCode一键调用DOSBox运行MASM/TASM代码的自定义任务
    C# | VS2019连接MySQL的三种方法以及使用MySQL数据库教程
    Visual Studio 2019连接MySQL数据库详细教程
    Visual Studio 2022 激活码
    Python | 使用SVM支持向量机进行鸢尾花分类
    Python | __init__.py的神奇用法
    Java简单介绍及Java生态
    NoSQL:一个帝国的崛起
    学习哪门语言好
    浅析HTTP协议
  • 原文地址:https://www.cnblogs.com/Thereisnospon/p/4771098.html
Copyright © 2020-2023  润新知