4.内部类详解
4.1 什么是内部类?
将一个类定义在另一个类的内部,该类就称为内部类
4.2 类中定义的内部类特点
-
内部类作为外部类的成员,可以直接访问外部类的成员
(包括 private 成员),反之则不行。 -
内部类做为外部类成员,可声明为 private、默认、protected
或 public。 -
内部类成员只有在内部类的范围之内是有效的。
-
用内部类定义在外部类中不可访问的属性。这样就在外部
类中实现了比外部类的 private 还要小的访问权限。
内部类的优缺点:
优点:内部类可以直接访问外部类的私有属性
缺点:破坏了类的结构
4.2 内部类的分类 -
成员内部类
内部类相当于外部类的成员 -
静态内部类
-
方法中的内部类
只能在方法中使用,相当于方法中的局部变量
JDK1.8 新特性
a) JDK1.8 之前方法中的内部类要访问外部类的局部变
量,必须加上 final 关键字 (常量)
b) JDK1.8 开始,在访问外部类的局部变量时,则可以不
加 final 关键字 -
匿名内部类 (存在继承或实现关系)
a) 可以实现一个接口,或者继承一个父类
b) 只能实现一个接口
c) 适合创建那种只需要一次使用的类,不能重复使用。
比较常见的是在图形界面编程 GUI 里用得到。
代码:
匿名内部类:
package cn.sxt.java04;
public class AnonymityInner {//匿名内部类,实现一个接口或者继承一个父类
public static void main(String[] args) {
//父类指向子类,
//Father f=new Son();有名字的内部类
Father f=new Father() {@Override public void dream() { System.out.println("实现父亲的愿望"); } }; f.dream(); } } abstract class Father{ public abstract void dream(); } class Son extends Father{//子类是有名称的 @Override public void dream() { } }
什么是内部类:
package cn.sxt.java04;
public class InnnerClass {
class inner{//内部类
}
}
成员内部类:
package cn.sxt.java04;
public class MemberInnner {//成员内部类
private String shape="瓜子脸";
String y="大帅哥";
class Nose{
private String shape="高鼻梁";
public void show() {
System.out.println(shape);
System.out.println("鼻子长在"+MemberInnner.this.y+"上");
/**
* 在成员内部类中,如果访问外部类的的属性,需要 :类名.this.属性属性变量
*/
}
}
public static void main(String[] args) {
MemberInnner f=new MemberInnner();
Nose n=f.new Nose();//创建成员内部类的实例,类名 对象名=外部对象名.new 类名();
n.show();
}
}
方法内部类:
package cn.sxt.java04;
public class MethdInner {
public void show() {
int age=14;
class Inner3{//内部类相当于show方法中的局部变量
public void play() {
System.out.println("加油");
}
}
Inner3 i3=new Inner3();//在方法中创建对象,
i3.play();
}
public static void main(String[] args) {
MethdInner m=new MethdInner();
m.show();
}
}
静态内部类:
package cn.sxt.java04;
public class StaticInner {
private static String name="张三";
static class Inner{
/**
* 静态内部类不能访问外部类非静态的属性
* 如果内部类的方法也是静态的,那么类必须是静态
*/
public void show() {
System.out.println(name);
}
}
static class Innner2{
public static void show() {//如果内部类的方法也是静态的,那么类必须是静态
System.out.println("杨杰");
}
}
}
实现静态内部类:
package cn.sxt.java04;
import cn.sxt.java04.StaticInner.Inner;
public class TestStaticInner {
public static void main(String[] args) {
StaticInner.Inner i=new StaticInner.Inner();//访静态内部类
i.show();
//访问静态内部类的静态方法
StaticInner.Innner2.show();
}
}