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外部类与内部类的关系详解,希望对大家有所帮助。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • java外部类与内部类简介

     一.内部类 内部类就是将一个类A定义在类B里边,里边的那个类A称为内部类,外边的类B称为外部类 成员内部类定义格式: class 外部类{ class 内部类{ } } class A{ class B{ } } 在描述一个事物是,事物的里边还有另外一个事物就可以用到内部类 访问特点: 1.内部类可以直接访问外部类的成员,包括私有成员. 2.外部类要访问内部类的成员,必须要建立内部类的对象. 创建内部类格式: 外部类.内部类 对象名=new 外部类型().new 内部类型(); 二.匿名内部类

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

     private,public,protected,default的访问权限区别 在学习外部类与内部类之前我们首先要弄明白private,public,protected,default在访问权限上有什么不同,这对我们之后的理解会有一定的帮助. 1.private:访问权限最低的访问控制符,被它修饰的变量只能访问本类的对象. 2.public:访问权限最高,不仅是本类,子类,本包,其他的包,都可以去访问它修饰的对象. 3.default:访问权限限制在本类以及本包内. 4.protected:访

  • Django中ORM外键和表的关系详解

    外键 在 MySQL 中,表有两种引擎,一种是 InnoDB ,另外一种是 myisam .如果使用的是 InnoDB 引擎,是支持外键约束的.外键的存在使得 ORM 框架在处理表关系的时候异常的强大.因此这里我们首先来介绍下外键在 Django 中的使用. 类定义为 class ForeignKey(to,on_delete,**options) .第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有 CASCADE . SET_NULL 等.

  • java 内部类的实例详解

    java 内部类的实例详解 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类. public class OuterClass { private String name ; private int age; public String getName() { return name; } p

  • Java创建内部类对象实例详解

    Java创建内部类对象实例详解 要想使用new生成一个内部类的实例,需要先指向一个外部类的实例,也就是先生成外部类的实例, 因为内部类可以调用外部类的成员,当没有外部类实例的时候也就没有这些成员的内存空间,内部类在实例化的时候,调用外部类的成员就会出错,所以需要使用外部类的实例 + 点 + new 的方式实例化一个新的内部类 class TestInner{ public static void main(String [] args) { Outer outer = new Outer();

  • java 中内部类的实例详解

    java 中内部类的实例详解 一:内部类可直接访问外部类的成员变量,包括外部类私有的成员变量 二:外部类要访问内部类的成员变量,需要建立内部类的对象 class Outer{ int x=110; public void show(){ System.out.println("外部类的x="+x); } public void showInner(){ Inner inner=new Inner(); inner.show(); System.out.println(inner.x);

  • java接口语法以及与类的关系详解

    1.语法: public interface 接口名{} public class 类名 implements 接口名{} interface +接口名 implements: 实现 创建接口对象: Jumping p=new Cat(); 接口对象可以访问: Cat类中的成员变量和成员方法 但接口要写跟类一样的定义方法,接口对象才能引用类的方法 在interface里面的变量都是public static final 的.所以你可以这样写: public static final int i=

  • Java中==与equals()及hashcode()三者之间的关系详解

    目录 1.= = 2.equals() 3.重写equals() 4.equals()比较流程 5.hashcode() 1.= = =为赋值运算符,==为比较运算符,仅比较对象的内存地址,无法比较真正意义上的相等! JDK里的equals方法就是通过==来实现的比较对象的内存地址 以Integer为例 Integer a = 127; Integer b = 127; System.out.println(a == b);//true Integer c = 128; Integer d =

  • Java编程多线程之共享数据代码详解

    本文主要总结线程共享数据的相关知识,主要包括两方面:一是某个线程内如何共享数据,保证各个线程的数据不交叉:一是多个线程间如何共享数据,保证数据的一致性. 线程范围内共享数据 自己实现的话,是定义一个Map,线程为键,数据为值,表中的每一项即是为每个线程准备的数据,这样在一个线程中数据是一致的. 例子 package com.iot.thread; import java.util.HashMap; import java.util.Map; import java.util.Random; /*

  • Java四种权限修饰符知识点详解

    Java中有四种权限修饰符 public protected (default) private 同一个类 yes yes yes yes 同一个包 yes yes yes no 不同包子类 yes yes no no 不同包非子类 yes no no no Warning:(default)并不是关键字"default",而是根本不写 知识点补充: Java语言4种访问权限修饰符 Java语言4种访问权限修饰符,但是仅有3个关键字,因为不写访问权限,在Java中被称为默认权限,或同包

随机推荐