Java 内部类innerclasses

内部类(innerclasses)

一般情况,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,成为内部类

内部类的作用:

1.内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问。

2.内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。但外部类不能访问内部类的内部属性。

内部类的使用场合:

由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性。所以通常内部类在只为所在外部类提供服务的情况下优先使用。

内部类的分类

1.成员内部类(可以使用private/proteted/public 任意进行修饰。类文件:外部类$内部类.class)

(a)非静态内部类(外部类里使用非静态内部类和平时使用其他类没有区别)

Ⅰ.非静态内部类必须寄存在一个外部类对象里。因此,如果有一个非静态内部类对象那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。

Ⅱ.非静态内部类可以使用外部类的成员,但是外部类不能直接访问非静态内部类成员。

Ⅲ.非静态内部类不能有静态方法、静态属性、静态初始化块。

Ⅳ.静态成员不能访问非静态成员:外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量、创建实例。

Ⅴ.成员变量访问要点:

1.内部类里方法的局部变量:变量名

2.内部类属性:this.变量名

3.外部类属性:外部类名.this.变量名

Ⅵ.内部类的访问:

1.外部类中定义内部类:new InnerClass()

2.外部类以外的地方使用非静态内部类:Outer.inner varname=OuterObject.new Inner();

(b)静态内部类

Ⅰ.定义方式:

static class ClassName{

类体

}

Ⅱ.使用要点:

1.当一个静态内部类存在,并不一定存在对应的外部类对象。因此,静态内部类的实例方法不能直接访问外部类的实例方法。

2.静态内部类看做外部类的一个静态成员。因此,外部类的方法中可以通过:静态内部类.名字 访问静态内部类的静态成员。

   通过new静态内部类()访问静态内部类的实例。

3.在外部类的外面创建静态内部类:

Face.TestStaticInner aInner=new Face.TestStaticInner();

2.匿名内部类

适合那种只需要使用一次的类。比如:键盘监听操作等等。

语法:new 父类构造器(实参列表)或者 实现接口(){匿名内部类类体};

3.局部内部类

定义在方法内部。作用域只限于本方法。用的非常少。


class Test{

A.b test01=new A().new b(); //非静态内部类实例化

A.c test02=new A.c();//静态内部类实例化

}

class A{

class b{

}

static class c{

}

}

、Person的多态性设计。 设计一个Person,其中包含一个方法pay(),计算工资支出。再从Person派生出助教(Assistant)、讲师(Instructor)、副教授(AssistantProfessor)和教授(Professor)。其中:工资支出=基本工资+授课时数teachingHours*每课时课金。 助教基本工资为800元,每课时课金25元;讲师基本工资为1000元,每课时课金35元;副教授基本工资为1200元,每课时课金40元;教授基本工资为1400元,每课时课金50元;在主方法中显示各人员的工资支出。用以下两种方式实现: ○1将Person设计为抽象,pay()为抽象方法,设计程序实现多态性。 ○2将Person设计为接口,设计程序实现多态性。 提示:设置授课时数teachingHours为成员变量,计算工资支出为成员方法,考虑是否定义构造方法。 2、编写一个Java程序,在程序中定义一个接口Achievement,其中有一个计算平均分的抽象方法avg();定义一个Person,其中有数据成员:姓名name和年龄age,构造方法初始化数据成员name和age,重写toString()方法显示成员信息;定义一个Student继承Person并实现接口Achievement,增加数据成员:语文成绩chnScore、数学成绩mathScore和英语成绩engScore,增加设置三门课成绩的setScore()方法,并实现接口Achievement的计算平均分的抽象方法avg(),主函数中测试,部分代码如下所示: Student s=new Student(“张三”,16); //创建对象 System.out.println(s.toString()); //显示s的个人信息,调用继承父的toString方法 s.setScore(80,88,95); //设置三门课的成绩 System.out.printf(“三门课的平均分:%.2f”, s.avg()); //显示对象s的三门课的平均分 输出结果如下: 姓名:张三,年龄:16 三门课的平均分:87.67 3、编写一个Java程序,在程序中定义一个School,在School类中定义一个内部类Student,分别创建两个对象访问各个对象中的方法,其中: School: 数据成员:学院名称schoolName; 成员方法:显示信息方法showSchoolMsg():在方法中创建内部类Student对象,并显示该对象的信息(调用内部类Student的显示信息的成员方法)。 Student: 数据成员:姓名sname,年龄sage; 构造方法,初始化姓名sname、年龄sage以及所属学院名(即外部数据成员:学院名称schoolName); 成员方法:显示信息showStudentMsg(),显示的信息包括:姓名、年龄以及所属学院名。 主函数中测试,部分代码如下所示: …… // 创建外部School对象 …… // 通过外部对象调用其显示信息的方法showSchoolMsg() System.out.println(“-------------我是华丽的分割线-------------”); …… // 创建内部类Student对象 …… // 通过内部类对象调用其显示信息的方法showStudentMsg()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_Pmc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值