Java 内部类(Inner class)--学习笔记
1.类里面在定义类。形式:
class Out{//外部类
class In{//内部类
}
}
2.特点:
(1)内部类可以直接访问外部类中的成员,包括私有的成员
(2)外部类要访问内部类的成员,必须建立内部类的对象
(3)分为成员内部类(类里方法外)和局部内部类(方法里)
3.成员内部类与局部内部类
package innerclass;
/**总结:
* 内部类分为:1.成员内部类(类里方法外)
* 2.局部内部类(方法里)--不常用。注意:直接调用外部类的方法是无法触发局部内部类的功能的,需要再外部类中创建内部类对象并且调用功能
* 局部内部类的功能才能被调用
*
*外部类:想要使用内部类资源,必须先创建内部类对象,通过内部类对象来访问
*内部类:可以使用外部类的资源,包括私有资源*/
public class Test1 {
public static void main(String[] args) {
//创建内部类对象
Out.In1 innerClass = new Out().new In1();
innerClass.eat1();
System.out.println("***********无情的分割线*********");
//当在外部类方法里创建局部内部类并且调用功能后,局部内部类的功能才能被调用
new Out().drink();
}
}
class Out{//创建外部类
String name="外部类成员变量";
private int age;
public void drink() {
System.out.println("外部类普通方法");
//创建局部内部类
class In2{
public void eat2() {
System.out.println("局部内部类普通方法");
}
}
//外部类使用成员内部类资源,必须先创建内部类的对象,通过对象来调用
In1 in = new In1();
System.out.println(in.inName);
in.eat1();
System.out.println("*******无情的分割线*********");
//使用局部内部类的资源,需要在方法里创建局部内部类的对象
In2 in2 = new In2();
in2.eat2();
}
//创建成员内部类
class In1{
String inName="成员内部类-成员变量";
public void eat1() {
System.out.println("成员内部类-普通方法");
//内部类可以使用外部类的资源,包括私有资源
System.out.println(name);
System.out.println("外部类私有成员age="+age);//使用外部类私有成员变量
}
}
}
4.被private修饰和static修饰
package innerclass;
public class Test2 {
public static void main(String[] args) {
//创建外部类对象,间接访问私有内部类资源
new Out2().getIn();
//调用静态内部类普通方法
new Out2.In3().play();
//调用静态内部类静态方法
Out2.In3.play1();//当内部类被static修饰以后,加上“new”会报错
}
}
class Out2{
//提供外界访问私有化内部类的公共方法
public void getIn(){
System.out.println("***********分割线*********");
In in = new In();//外部类创建内部类对象,可以访问内部类的私有成员
in.play();
System.out.println("***********分割线*********");
}
//成员内部类,被private修饰,私有化。因此无法被外界访问
private class In{
public void play() {
System.out.println("私有成员内部类普通方法");
}
}
//内部类被static修饰-不常用!因为浪费内存
static class In3{
public void play() {
System.out.println("静态内部类的普通方法");
}
static public void play1() {
System.out.println("静态内部类的静态方法");
}
}
}
5.匿名内部类
package innerclass;
/**匿名内部类,通常结合着匿名对象一起使用*/
public class Test3 {
public static void main(String[] args) {
new Inner1() {
//重写接口中的抽象方法
@Override
public void save() {
System.out.println("Inner1的save()方法");
}
@Override
public void copy() {
System.out.println("Inner1的copy()方法");
}
}.copy();//匿名对象只能调用一个,且只能调用一次,即匿名对象只干一件事
//匿名对象,必须重写所有抽象方法
new Inner2() {
@Override
public void eat() {
System.out.println("撸个串去!!!");
}
}.eat();
Inner3 in3 = new Inner3();
in3.game();
in3.sleep();
}
}
//创建接口
interface Inner1{
void copy();
void save();
}
//创建抽象类
abstract class Inner2{
abstract public void eat();
public void play() {
System.out.println("抽象类的普通方法");
}
}
//6.创建普通类
class Inner3{
public void game() {
System.out.println("玩什么游戏,赶紧学习!!!");
}
public void sleep() {
System.out.println("不要睡啦,起来嗨");
}
}