静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
答:
Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺诡异的,如下所示。
/**
* 扑克类(一副扑克)
* @author 骆昊
*
*/
public class Poker {
private static String[] suites = {"黑桃", "红桃", "草花", "方块"};
private static int[] faces = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
private Card[] cards;
/**
* 构造器
*
*/
public Poker() {
cards = new Card[52];
for(int i = 0; i < suites.length; i++) {
for(int j = 0; j < faces.length; j++) {
cards[i * 13 + j] = new Card(suites[i], faces[j]);
}
}
}
/**
* 洗牌 (随机乱序)
*
*/
public void shuffle() {
for(int i = 0, len = cards.length; i < len; i++) {
int index = (int) (Math.random() * len);
Card temp = cards[index];
cards[index] = cards[i];
cards[i] = temp;
}
}
/**
* 发牌
* @param index 发牌的位置
*
*/
public Card deal(int index) {
return cards[index];
}
/**
* 卡片类(一张扑克)
* [内部类]
* @author 骆昊
*
*/
public class Card {
private String suite; // 花色
private int face; // 点数
public Card(String suite, int face) {
this.suite = suite;
this.face = face;
}
@Override
public String toString() {
String faceStr = "";
switch(face) {
case 1: faceStr = "A"; break;
case 11: faceStr = "J"; break;
case 12: faceStr = "Q"; break;
case 13: faceStr = "K"; break;
default: faceStr = String.valueOf(face);
}
return suite + faceStr;
}
}
}
测试代码:
class PokerTest {
public static void main(String[] args) {
Poker poker = new Poker();
poker.shuffle(); // 洗牌
Poker.Card c1 = poker.deal(0); // 发第一张牌
// 对于非静态内部类Card
// 只有通过其外部类Poker对象才能创建Card对象
Poker.Card c2 = poker.new Card("红心", 1); // 自己创建一张牌
System.out.println(c1); // 洗牌后的第一张
System.out.println(c2); // 打印: 红心A
}
}
面试题 - 下面的代码哪些地方会产生编译错误?
class Outer {
class Inner {}
public static void foo() { new Inner(); }
public void bar() { new Inner(); }
public static void main(String[] args) {
new Inner();
}
}
注意:Java中非静态内部类对象的创建要依赖其外部类对象,上面的面试题中foo和main方法都是静态方法,静态方法中没有this,也就是说没有所谓的外部类对象,因此无法创建内部类对象,如果要在静态方法中创建内部类对象,可以这样做:
new Outer().new Inner();
转载于:https://www.cnblogs.com/zhangkai0106/p/5011083.html
静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?相关推荐
- 【Java 面向对象】基础、Java程序的内存划分、嵌套类(内部类、静态嵌套类)、局部类、接口的升级问题(默认方法、静态方法)、instanceof
面向对象 对象的内存 复杂对象的内存 对象数组的内存 思考:方法存储在哪里? Java程序的内存划分 this.super 注解(Annotation) 访问控制(Access Control) to ...
- java嵌套类与内部类
一.嵌套类(Nested Classes) 使用嵌套类减少了命名冲突,一个内部类可以定义在一个类中,一个方法中甚至一个表达式中. (1)定义 A nested(嵌套) class is any cla ...
- java 嵌套类: Nested classes
java 嵌套类: Nested classes 嵌套类分类 静态嵌套类 非静态嵌套类 普通内部类: Common classes 局部内部类: Local classes 匿名内部类: Anonym ...
- Java嵌套类(Nested Classes)总结
Nested Classes定义 在java语言规范里面,嵌套类(Nested Classes)定义是: A nested class is any class whose declaration o ...
- Java 嵌套类和内部类演示样例lt;二gt;
嵌套类(nested class)是一个在还有一个类或接口内部声明的类. 嵌套类分为两种:静态内部类(static inner class)和非静态嵌套类(non-static nested clas ...
- java 内部类_java的内部类和静态内部类(嵌套类)
背景 开发新项目,写Swager的mode的时候用到了嵌套Model,于是在代码中,出现了静态内部类.在codeReview的时候稍微和大家聊了一下.尤其是Static 修饰类和修饰对象和变量不一样呢 ...
- 【java开发系列】—— 嵌套类与内部类
嵌套类与内部类在java中使用的很广泛,为了避免难以理解,这里用了几个小例子,说明它的用法. 嵌套类与内部类的结构如下图 静态嵌套类 静态嵌套类,是一种在类之外声明的嵌套类,由于是静态的,所以不经过初 ...
- c++ 嵌套类 内部类
转自:http://www.cnblogs.com/charley_yang/archive/2011/04/05/2005897.html 一.嵌套类 在一个类的内部定义另一个类,我们称之为嵌套类( ...
- Java基础篇:介绍嵌套类和内部类
在另一个类中定义的类就是嵌套类(nested classes).嵌套类的范围由装入它的类的范围限制.这样,如果类B被定义在类A之内,那么B为A所知,然而不被A的外面所知. 嵌套类可以访问嵌套它的类的成 ...
最新文章
- Linux下的Shell工作原理
- 从 no-code 到 low-code 再到 pro-code
- python nose(二)
- Numpy中array和matrix转换
- * 完成随机点名案例;学生姓名都提前写在文件中;:每次敲回车,随机显示一个学生姓名,每人最多显示一次,所有人都显示完了就结束程序;
- mysql内部_MySQL SQL语句内部剖析
- PRML-系列一之1.2.5~1.2.6
- Sublime中查找重复行的正则表达式
- 7.25 Ext JS下拉单选框(Combobox,TagFied)使用及疑难问题解决
- Codejock Suite Pro ActiveX 20.0 Crack
- 软件测试报告模板怎么写,这篇文章告诉你
- rp:linux debug tools - 摄心神,致虚极,守静笃
- IDEA设置版权信息
- 腾讯2016实习招聘-安全岗笔试题答案详细解释
- 如何解决Mac电脑中的“AppStore无法下载软件”问题?
- java--与君初相识之jdk的环境配置
- git fatal: detected dubious ownership in repository
- MATLAB设置图片输出的尺寸大小与字体(适用科研论文)
- ROS学习笔记之小乌龟跟随
- 谷歌推出以太坊区块链的大数据视图