博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java静态内部类
阅读量:5115 次
发布时间:2019-06-13

本文共 1802 字,大约阅读时间需要 6 分钟。

两种内部类

Java的内部类有两种,一种是静态内部类,另一种是普通内部类,普通内部类可以获得外部对象的引用,

所以在普通内部类能够访问外部对象的成员变量 ,也就能够使用外部类的资源,可以说普通内部类依赖

于外部类,普通内部类与外部类是共生共死的,创建普通内部类的对象之前,必须先创建外部类的对象。

创建普通内部类的代码如下:

Outer o = new Outer();

Outer.Inner inner = o.new Inner();

 

Outer.Inner inner = new o.Inner();         /* 错误 */

Outer.Inner inner = new Outer.Inner();  /* 错误 */

 

静态内部类没有外部对象的引用,所以它无法获得外部对象的资源,当然好处是,静态内部类无需依赖于

外部类,它可以独立于外部对象而存在。创建静态内部类的代码如下:

Outer.Inner inner = new Outer.Inner();

 

静态类的使用场景

在以下场合可以使用静态内部类:

(1) 外部类需要使用内部类,而内部类无需使用外部类的资源

(2) 内部类可以独立外部类创建对象

使用静态内部类的好处是加强了代码的封装性以及提高了代码的可读性,举个例子:

 

Java代码   
  1. public class Person{    
  2.      //姓名    
  3.      private String name;    
  4.      //家庭    
  5.      private Home home;    
  6.      //构造函数设置属性值    
  7.      public Person(String _name){    
  8.           name = _name;    
  9.      }    
  10.      /* home、name的getter/setter方法省略 */    
  11.    
  12.      public static class Home{    
  13.           //家庭地址    
  14.           private String address;    
  15.           //家庭电话    
  16.           private String tel;    
  17.    
  18.           public Home(String _address,String _tel){    
  19.             address = _address;    
  20.             tel = _tel;    
  21.           }    
  22.           /* address、tel的getter/setter方法省略 */    
  23.      }    
  24. }   

 

把Home放在Person内部,一看便知道Home是Person的一个属性。使用的时候也很方便,如下代码:

 

Java代码   
  1. public static void main(String[] args) {    
  2.     Home home = new Person.Home("上海""021");  
  3.     Person p1 = new Person("张三");    
  4.     Person p2 = new Person("李四");    
  5.     p1.setHome(home);    
  6.     p2.setHome(home);    
  7. }   

 

这里创建一个home对象,p1和p2都使用这个home对象,p1和p2共享同一个home对象。

如果把Home换成普通内部类,情况就不同了,这时代码变成:

 

Java代码   
  1. public static void main(String[] args) {    
  2.     Person p1 = new Person("张三");    
  3.     Home home = p1.new Home("上海""021");  
  4.     p1.setHome(home);    
  5.     Person p2 = new Person("李四");    
  6.     p2.setHome(home);    
  7. }   

 

这里p1和p2依然共享同一个home对象,但此时home对象和p1是同生共死的,如果p1对象消亡,那么p2就没有

家了,这对p2来说实在不公平,而如果为p1和p2都创建一个Home对象,又浪费资源。所以在这个例子中,

使用静态内部类比普通内部类要合适。

 

静态内部类和普通内部类的区别

(1)普通内部类不能声明static的方法和变量

普通内部类不能声明static的方法和变量,注意这里说的是变量,常量(也就是final static修饰的属性)

还是可以的,而静态内部类形似外部类,没有任何限制。

(2)使用静态内部类,多个外部类的对象可以共享同一个内部类的对象。

使用普通内部类,每个外部类的对象都有自己的内部类对象,外部对象之间不能共享内部类的对象

转载于:https://www.cnblogs.com/wangerxiansheng/p/3836388.html

你可能感兴趣的文章
封装axios
查看>>
js转义html,反转义
查看>>
Educational Codeforces Round 39 A Partition
查看>>
上传文件
查看>>
12.2日常
查看>>
12.3日常
查看>>
追求心灵的宁静
查看>>
Educational Codeforces Round 25 G. Tree Queries
查看>>
LintCode-73.前序遍历和中序遍历树构造二叉树
查看>>
JS-面向对象-继承
查看>>
JavaScript(3)——Object-Oriented Design
查看>>
92. Reverse Linked List II
查看>>
vs2008 MFC类继承结构
查看>>
windows版mysql添加远程访问
查看>>
hdoj3652 B-number
查看>>
16-基础-过滤器-传参数和串联使用
查看>>
两种排序方法(直接判断)
查看>>
学习进度第十四周
查看>>
这20个正则表达式,让你少写1,000行代码
查看>>
文本两端对齐
查看>>