java外部类与内部类的关系详解

 更新时间:2021年12月08日 14:34:54   作者:mayifan_blog  
本文详细讲解了java外部类与内部类的关系,用代码演示了外部类调用内部类的方法。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

 private,public,protected,default的访问权限区别

在学习外部类与内部类之前我们首先要弄明白private,public,protected,default在访问权限上有什么不同,这对我们之后的理解会有一定的帮助。

  • 1、private:访问权限最低的访问控制符,被它修饰的变量只能访问本类的对象。
  • 2、public:访问权限最高,不仅是本类,子类,本包,其他的包,都可以去访问它修饰的对象。
  • 3、default:访问权限限制在本类以及本包内。
  • 4、protected:访问的范围是本类,本包内,子类,但别的包不可以访问。

外部类访问内部类

在外部类的main方法中创建了外部类的对象,并通过它创建了内部类的对象,并调用了内部类的方法,这里我们观察调用时,age变量的变化。

public class People {	
	         private String name;
	         private int age=20;
	         private int ID ;	     	     
	         public static void main(String[] args){
		    	 People p = new People();
		    	 People.Student s = p.new Student();
		    	 s.study();	    	 
	     }	    	
	    class Student {
		    	private String name;
		    	private int age=18;
		    	private int studentNumber;
	    		public void study(){
		    		System.out.println("输出age"+age);
		    		System.out.println("内部类变量"+this.age);
		    		System.out.println("外部类变量"+People.this.age);			    		
	    	}	    	    	
	    }		
}

输出结果:

输出age18、内部类变量18、外部类变量20

经测试,我们可以发现内部类对象不能直接获得,只能由外部类的对象获取。并且我们通过输出结果,可以发现当外部类和内部类有相同属性时,在内部类中会优先输出内部类的属性,只有通过外部类的对象来调用age属性,才会在本例中输出20。在内部类中,使用this,可以获取内部类的属性。

局部内部类

这时候,我们转变一下思路,索性把Student类的创建放在People类的方法里,再看看结果会怎么样。

public class People {	
	       private String name;
	       private int age=20;
	       private int ID ;	          
	       public static void main(String[] args){
		       People p = new People();
		       class Student {
			       private String name;
			       private int age=18;
			       private int studentNumber;	    	
		  	       public void study(){
		  	       System.out.println("输出age"+age);
		               System.out.println("内部类变量"+this.age);
		  	       System.out.println("外部类变量"+p.age);			    		
	    	   }	 
	        }
	        new Student().study();
	    }
}

输出结构和之前是一样的,这也不奇怪,我们只是把类在方法里定义了,我们可以联想到局部变量的定义,只能在本方法中使用,那么,方法内的类自然也只是属于这个方法,访问权限只限于方法内。

静态嵌套类

既然开始了我们就不停下探索的脚步,我们把内部类变成静态类,我们可以理解为,这个内部类现在属于外部类了,外部类可以通过类名来调用这个类并创建对象,毫无疑问,结果是输出18。

public class People {
	     private String name;
	     private int age=20;
	     private int ID ;	     	     
	     public static void main(String[] args){
		     People p = new People();	    	 
		     new People.Student().study();	    	 
	     }	    	
	    static class Student {
		    private String name;
		    private int age=18;
		    private int studentNumber;
	            public void study(){
			    System.out.println("输出age"+age);
			    System.out.println("内部类变量"+this.age);  			    		
	    	}	    	    	
	    }
}

匿名内部类

匿名内部类的实现涉及到了抽象类的实现,那么什么是抽象类呢?抽象类拥有一系列抽象的属性或者方法,它本身不能new对象,只有在它被继承并被重写所有抽象方法之后才能得到实现。我们这次要通过创建一个匿名内部类的对象来使得一个抽象的类得到实体化并执行一系列方法。首先我们需要创建一个抽象类,然后再写一个类创建匿名内部类的对象实现抽象类的方法(此处我们没有用到继承)。

abstract class People {	
	     private String name;
	     private int age=20;
	     private int ID ;	     	     
	     public abstract void work();    
}
 public class Test{	   	   
	     public static void main(String[] args){	    	  
		     Test t = new Test();
		      t.test(new People(){
		      public void work(){
		      System.out.println("我在工作");
	        	}
	         });
	      }	        
	       public void test(People people){
		         people.work();
		}			
}	

这段代码的关键部分在:

 t.test(new People(){
		      public void work(){
		      System.out.println("我在工作");
	        	}
	         });

似乎我们new了一个抽象类People的对象,但其实我们通过了匿名内部类来实现People类的实例化,它实现了work()抽象方法,然后调用此方法,输出“我在工作”。

以上所述是小编给大家介绍的java外部类与内部类的关系详解,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • SpringBoot配置shiro安全框架的实现

    SpringBoot配置shiro安全框架的实现

    这篇文章主要介绍了SpringBoot配置shiro安全框架的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 适用于Java程序员的10道XML面试题 新鲜出炉

    适用于Java程序员的10道XML面试题 新鲜出炉

    这篇文章主要为大家详细介绍了Java程序员的10道XML面试题,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • idea中Maven镜像源详细配置步骤记录(对所有项目)

    idea中Maven镜像源详细配置步骤记录(对所有项目)

    Maven是一个能使我们的java程序开发节省时间和精力,是开发变得相对简单,还能使开发规范化的工具,下面这篇文章主要给大家介绍了关于idea中Maven镜像源详细配置(对所有项目)的相关资料,需要的朋友可以参考下
    2023-05-05
  • java8 stream排序以及自定义比较器方式

    java8 stream排序以及自定义比较器方式

    这篇文章主要介绍了java8 stream排序以及自定义比较器方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 深入浅析Mybatis的缺陷问题

    深入浅析Mybatis的缺陷问题

    Mybatis是业界非常流行的持久层框架,轻量级、易用,在金融IT领域完全是领军地位,比Hibernate更受欢迎,优势非常多,也是非常值得我们学习的。这篇文章主要介绍了Mybatis的缺陷问题的相关资料,需要的朋友可以参考下
    2016-10-10
  • MyBatis-Plus将字段修改为空值的解决方案

    MyBatis-Plus将字段修改为空值的解决方案

    这篇文章主要介绍了MyBatis-Plus将字段修改为空值的解决方案,本文给大家分享三种常用的解决方案,感兴趣的朋友一起看看吧
    2023-12-12
  • SpringBoot+Hutool+thymeleaf完成导出Excel的实现方法

    SpringBoot+Hutool+thymeleaf完成导出Excel的实现方法

    这篇文章主要介绍了SpringBoot+Hutool+thymeleaf完成导出Excel,本篇示例当中不仅仅有后端,而且还提供了前端html,html当中利用js将后端 输出流直接下载为文件,需要的朋友可以参考下
    2022-03-03
  • springMVC+jersey实现跨服务器文件上传

    springMVC+jersey实现跨服务器文件上传

    这篇文章主要介绍了springMVC+jersey实现跨服务器文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • java正则表达式使用示例

    java正则表达式使用示例

    这篇文章主要介绍了java正则表达式使用示例,实现拆分字符串、替换字符串、判断字符串是否与制定模式匹配等功能,需要的朋友可以参考下
    2014-03-03
  • Spring配置多数据源导致事物无法回滚问题

    Spring配置多数据源导致事物无法回滚问题

    这篇文章主要介绍了Spring配置多数据源导致事物无法回滚问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论