`
zsjg13
  • 浏览: 142245 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

内部类总结

    博客分类:
  • Java
 
阅读更多

内部类总结:

1、内部类允许在一个类中定义另一个类。它们为类提供一种范围,因为可以使一个类成为另一个类的成员。
2、“顶级嵌套类”—— 一种标识为static的内部类,从技术上来说并不是真正的内部类。因为静态嵌套类
仍然是一个类。
3、事件处理程序可能是这种情况的一个最好的例子,事实上,这也是把内部类添加到该语言的主要原因之一。
4、内部类实例可以访问外部类的所有成员,甚至是private成员(因为内部类也是外部类的一个成员)。
5、class MyOuter {
class MyInner {

}
}
如果编译它:javac MyOuter.java 将产生两个类文件:MyOuter.class、MyOuter$MyInner.class
用普通方式不能访问这个内部类文件,例如java MyOuter$MyInner希望运行这个内部类的main方法。
常规内部类不能有任何类型的静态声明。能够访问内部类的唯一方法是通过外部类的一个实例。
6、要实例化内部类实例,必须要有一个与它相关的外部类实例,它指不能从外部类的static方法或
者从任何其他类的任何其他代码实例化内部类。
(1)在外部类代码中实例化内部类
class MyOuter {
private int x = 7;
public void makeInner() {
MyInner in = new MyInner();
in.seeOuter();
}
class MyInner {
public void seeOuter() {
System.out.println("Outer x is " + x);
}
}
}
(2)在外部类代码外实例化内部类
从外部类的外部非静态代码中的任何地方建立实例的代码都很简单:
public static void main(String[] args) {
MyOuter mo = new MyOuter();
MyOuter.MyInner inner = mo.new MyInner();
inner.seeOuter();
}
无论main方法是位于MyOuter类中还是某个其他类中(假若其他类可以访问MyOuter),前面代码都是相同的。
如果合为一行,则是:MyOuter.MyInner inner = new MyOuter().new MyInner();
7、在内部类代码内,this引用该内部类的实例。但如何在内部类中访问它的外部类实例呢?
尽管通常情况下内部类代码不需要引用外部类,因为它已经有一个隐含引用,但是如果真的要呢?
class MyOuter {
private int x = 7;
public void makeInner() {
MyInner in = new MyInner();
in.seeOuter();
}
class MyInner {
public void seeOuter() {
System.out.println("Outer x is " + x);
System.out.println("Inner class ref is " + this);
System.out.println("Outer class ref is " + MyOuter.this);
}
}
public static void main(String[] args) {
MyOuter.MyInner inner = new MyOuter().new MyInner();
inner.seeOuter();
}
}
8、应用于内部类的成员修饰符
final、abstract、public、private、protected、static、strictfp。
9、方法本地内部类:
class MyOuter2 {
private String x = "Outer2";
void doStuff() {
class MyInner {
public void seeOuter() {
System.out.println("Outer x is " + x);
}
}
MyInner in = new MyInner();
in.seeOuter();
}
}
(1)方法本地内部类只能在定义该内部类的方法内实例化。
(2)内部类对象不能使用该内部类所在方法的局部变量(不过如果局部变量是final的,则也可以),那为什么呢?
因为不能保证局部变量的存活期与本地内部类对象一样长。
(3)唯一能够应用于本地内部类的修饰符是abstract和final。
(4)在一个静态方法内声明的内部类只能访问该封装类的静态成员。
10、匿名内部类:
(1)可以在方法内、方法的参数内定义。
class Popcorn {
public void pop() {
System.out.println("popcorn");
}
}
class Food {
// 声明Popcorn类型的实例变量p后,声明一个新类,它没有名字,它是Popcorn的子类
Popcorn p = new Popcorn() {
// 建立匿名内部类的关键点:重写父类的一个或多个方法(或设计一个接口的方法)
public void pop() {
System.out.println("anonymous popcorn");
}
}
}
这里要记住的关键一点是Popcorn引用变量不是引用Popcorn实例,而是Popcorn匿名子类的实例。
(2)当涉及到匿名内部类时,多态性在起作用。其含义是什么?
引用变量类型(父类)将不知道关于新方法(定义在匿名子类)的任何内容,因此,如果在匿名
内部类引用上调用父类定义中没有的任何方法,编译出错。
class Horse extends Animal {
void buck() {

}
}
class Animal {
void eat() {

}
}
class Test {
public static void main(String[] args) {
Animal h = new Horse();
h.eat(); // 正确
h.buck(); // 错了
}
}
(3)只能设计一个接口。事实上,一个匿名内部类甚至不能同时扩展一个类和设计一个接口。
11、静态嵌套类也称顶级嵌套类,或静态内部类。但是按照内部类的标准定义,它们根本就不是内部类。
class BigOuter {
static class Nested {

}
}
该类自己并不真正是“静态的”,没有静态类这样的内容。在这种情况下,static修饰符只是说这个嵌套类是
外部类的静态成员。
(1)静态嵌套类不能访问外部类的实例变量和方法。一定要注意静态嵌套类中的代码像非静态(常规)内部类
一样操作。
(2)实例化静态嵌套类:
class BigOuter {
static class Nested {

}
}
class Broom {
public static void main(String[] args) {
BigOuter.Nested n = new BigOuter.Nested();
}
}

分享到:
评论

相关推荐

    java中的匿名内部类总结

    Java 中的匿名内部类总结 Java 中的匿名内部类是一种特殊的内部类,它没有名字,因此也称为匿名类。匿名内部类是一种简洁的编程方式,能够简化代码编写,但它也有一些限制和特点。 匿名内部类的定义 匿名内部类是...

    Java内部类总结

    ### Java内部类总结 在Java编程语言中,内部类是一个重要的概念,它允许开发者在一个类的内部定义另一个类。这种特性极大地增强了代码的封装性和复用性,同时也为解决特定问题提供了灵活的方法。本文将围绕Java内部...

    java内部类总结(含概念和实例)

    Java 内部类总结 Java 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 protected 和 private 修饰(而外部类只能使用 public 和缺省的包...

    JAVA内部类总结

    ### JAVA内部类总结 在Java编程语言中,内部类(Inner Classes)是一种非常重要的特性,它允许我们在一个类的内部定义另一个类。这种结构不仅能够提高代码的组织性,还能帮助我们更好地处理类与类之间的关系。根据...

    Java内部类总结,内部类的共同特征,内部类的分类等

    Java 内部类总结 Java 内部类是 Java 语言的一个重要概念,指的是在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 protected 和 private 修饰(而...

    java语言内部类总结

    定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现...

    Java内部类总结[参考].pdf

    Java内部类总结 Java内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限...

    170331-01.匿名内部类总结.java

    170331-01.匿名内部类总结.java 170331-01.匿名内部类总结.java 匿名 内部类 总结 java

    java中的内部类总结

    Java 中的内部类是面向对象编程的一个重要特性,它允许在一个类的定义内部定义另一个类。内部类的主要优点是能够方便地访问外部类的私有成员,提供了更封装的代码组织方式,以及创建特定上下文的类实例。下面将详细...

    Java内部类总结.pdf

    总结一下,Java内部类是一种强大的工具,它增强了类的封装性和灵活性。通过内部类,开发者可以更好地组织代码,实现更复杂的逻辑,同时保持良好的代码结构。成员内部类提供了对外部类状态的访问,局部内部类提供局部...

    Java中的内部类总结.doc

    Java中的内部类是一种强大的特性,它允许在一个类的定义内部定义另一个类。内部类可以作为外部类的一个成员,提供了一种灵活的代码组织方式,并且能够访问外部类的私有成员,这使得内部类在处理封装和继承时具有独特...

    java内部类总结.pdf

    Java内部类是Java语言的一个独特特性,它允许一个类被定义在另一个类的内部。这种设计使得代码结构更加紧凑,同时也提供了对封装和抽象的新层次。内部类在J2EE编程中可能用得较少,但在GUI编程中尤其常见,主要用于...

    java语言--内部类总结

    《Java语言——内部类详解》 内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类可以提供更复杂的封装,使得代码结构更加清晰,同时还能访问外部类的私有成员,提供了更高级别...

Global site tag (gtag.js) - Google Analytics