静态内部类和内部类的区别_内部类不能定义为抽象类

静态内部类和内部类的区别_内部类不能定义为抽象类今天稍微复习一下静态内部类和内部类的相关知识,平常很少用静态内部类静态内部类,不能访问外部类的非静态成员静态内部类不需要创建外部类的对象就可访问(外部类名.内部类比如newMyMain.Person().display();就创建了静态内部类对象)静态内部类可以有public、protected、默认的、private等多种类型(这个功能我倒是从来没听说,通过实验的确ok…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

今天稍微复习一下 静态内部类和 内部类的相关知识,平常很少用

静态内部类

  • 静态内部类,不能访问外部类的非静态成员
  • 静态内部类 不需要创建外部类的对象就可访问(外部类名.内部类 比如new MyMain.Person().display();就创建了静态内部类对象)
  • 静态内部类可以有public、protected、默认的、private等多种类型 (这个功能我倒是从来没听说,通过实验的确ok)


public class MyMain{ 
   
    private static String name = "kobe bryant";
    private String num = "001";
 
    // 静态内部类可以用public,protected,private修饰
   public static class Person { 
   
        // 静态内部类中可以定义静态或者非静态的成员
        private String address = "Los angeles";

        private static String x = "Laker";
        public String mail = "kobe@yahoo.com.cn";// 内部类公有成员

        public void display() { 
   
            // System.out.println(num);//不能直接访问外部类的非静态成员

            // 静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)
            System.out.println(name);// 只能直接访问外部类的静态成员

            // 静态内部类只能访问外部类的静态成员(包括静态变量和静态方法)
            System.out.println("Inner " + address);// 访问本内部类成员。
        }
    }

    public void printInfo() { 
   
        Person person = new Person();

        // 外部类访问内部类的非静态成员:实例化内部类即可
        person.display();

        // System.out.println(mail);//不可访问
        // System.out.println(address);//不可访问
        
        //访问内部类的成员,都要通过内部类的对象
        System.out.println(person.address);// 可以访问内部类的私有成员

        System.out.println(Person.x);// 外部类访问内部类的静态成员:内部类.静态成员
        System.out.println(person.x);// 这样也能访问,但是不推荐
        System.out.println(person.mail);// 可以访问内部类的公有成员
    }

   public static void main(String[] args) { 
   
        MyMain staticTest = new MyMain();
        staticTest.printInfo();
    }
}

运行结果:
kobe bryant
Inner Los angeles
Los angeles
Laker
Laker
kobe@yahoo.com.cn


当在MyMain类中访问静态内部类,直接可以 new Person();
当然如果在外部类中访问这个静态内部类,则必须 new MyMain.Person();

这个时候我试验了一下 如果定义person类为  private static class Person
那么在其他的类中 尝试访问Person 会报错


public class testMain{ 
   
	public static void main(String[] args) { 
   
		new MyMain.Person().display();//The type MyMain.Person is not visible
    }
}

内部类

  • 内部类中不能有静态成员
  • 可以访问外部类的成员变量(外部类名.this.变量名)
  • 可以定义在方法外(可以有访问修饰符)和方法内(不能有访问修饰符,这个就是匿名内部类了)
public class TestInner { 
   

	private static String name = "kobe bryant";
	private String num = "001";
	private String address = "GreenLand";

	class Person { 
   

		private String address = "Los angeles";

		public String mail = "kobe@yahoo.com.cn";// 内部类公有成员

		public void display() { 
   

			System.out.println(name);// 只能直接访问外部类的静态成员

			System.out.println(TestInner.this.address);//访问外部类的同名非静态成员变量

			System.out.println(address);// 访问本内部类成员。
		}

	}

	public static void main(String[] args) { 
   
		TestInner test = new TestInner();

		//即使在本类中想要调用Person类,都必须这样写,而不能直接 new Person()
		new TestInner().new Person().display();
	}

}

运行结果

kobe bryant
GreenLand
Los angeles

同样如果给person类定义为private,以下语句也会报错,说Person类不可见!
public class testMain{ 
   
	public static void main(String[] args) { 
   
		
		new TestInner().new Person().display();
    }
}

最后一点小补充

参考静态内部类和非静态内部类的区别中提到的 正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static 的。只是将嵌套类置于接口的命名空间内,这并不违反接口的规则,我试验了一下 ,无论是静态类还是非静态类都可以写在接口里。

public interface IShot { 
   

	
	class Animal{ 
   
		public  String name="fox";
	}
	
	static class Human{ 
   
		public String  name ="老王";
	}
	
}


public class TestInterface implements IShot { 
   

	public static void main(String[] args) { 
   
		
		System.out.println(new IShot.Animal().name);
		System.out.println(new IShot.Human().name);
	}
}
//运行结果
fox
老王


都过jad发现编译了生成了三个顶级类

ARtUBt.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/183155.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • obs录制黑屏怎么解决_obs窗口捕获黑屏

    obs录制黑屏怎么解决_obs窗口捕获黑屏00.目录文章目录00.目录01.问题描述02.问题分析03.问题解决04.成功测试01.问题描述打开OBS后,新建场景、新建显示器捕获后,黑屏没有显示,即使点击开始录制,然后结束录制后,录制的视频仍然是黑屏。02.问题分析安装包是从官网下载的,安装过程没有报错,启动过程也没有报错,但是却捕捉不到显示器中的图像。首先考虑的是软件兼容性的问题,但是在我将兼容性设置成”W…

  • C#中HttpWebRequest的用法详解

    C#中HttpWebRequest的用法详解HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择。它们支持一系列有用的属性。这两个类位于System.Net命名空间,默认情况下这个类对于控制台程序来说是可访问的。请注意,HttpWebRequest对象不是利用new关键字通过构造函数来创建的,而是利用工厂机制(factorymechanism)通过Create()方法来创建的。另外,你可…

  • Flash动画制作实例教程

    Flash动画制作实例教程1、该资料见网址:http://www.webjx.com/htmldata/2007-07-26/1185439125.html2、http://www.enet.com.cn/eschool/includes/zhuanti/flash1130/3、http://www.webjx.com/htmldata/2007-10-04/119151291…

  • choropleth map_Mapsource

    choropleth map_Mapsource简介MapStruct是满足JSR269规范的一个Java注解处理器,用于为JavaBean生成类型安全且高性能的映射。它基于编译阶段生成get/set代码,此实现过程中没有反射,不会造成额外的性能损失。您所要做的就是定义一个mapper接口(@Mapper),该接口用于声明所有必须的映射方法。在编译期间MapStruct会为该接口自动生成实现类。该实现类使用简单的Java方法调用来映射source-target对象,在此过程中没有反射或类似的行为发生。性能优点与手工编..

    2022年10月26日
  • Map<String,Object>转为JSONObject ,JSONObject 转为JsonObject,JsonObject转为JsonElement

    Map<String,Object>转为JSONObject ,JSONObject 转为JsonObject,JsonObject转为JsonElementpackagecom.tianjian.property.jieshuns.service;importjava.util.Map;importjava.util.Properties;importorg.apache.http.HttpStatus;importorg.apache.http.client.methods.CloseableHttpRes

  • java map()_java之map的基本介绍

    java map()_java之map的基本介绍map简介在讲解Map排序之前,我们先来稍微了解下map。map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。其中这四者的区别如下(简单介绍):HashMap我们最常用的Map,它根据key的HashCode值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问速度。HashMap最多只允许一条记录的…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号