7.面向对象――内部类
7.1内部类
内部类:将一个类定义在另一个类里面,里面那个类就称为内部类.
格式:
class OutClass{
class InnerClass{//内部类
}
}
注意:内部类可以定义在外部类的成员位置,也可以是在外部类的局部位置.
如:
class OutClass{
public void method(){
class InnerClass{//内部类在外部的局部位置上.
}
}
}
注意:内部类可以直接访问外部类中的成员,包括私有的,而外部类要访问内部类中的成员,必须要创建内部类的对象.
7.1.1什么时候需要定义内部类呢?
在分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容,这时就把还有的事物定义成内部类来描述.
7.1.2访问格式
第一种情况:直接通过外部类创建内部类对象
如:
class OuterClass//外部类
{
class InnerClass//内部类
{
void method(){
System.out.println("内部类的方法");
}
}
}
public class Demo
{
public static void main(String[]args){
OuterClass.InnerClass oi=new OuterClass().new InnerClass();//直接通过外部类创建内部类对象,调用内部类的成员.
oi.method();//调用内部类成员
}
}
第二种情况:当内部类中有static修饰的静态成员时,那么,内部类也必须是静态的.
如:
class OuterClass//外部类
{
static class InnerClass//内部类前面加static
{
static void method(){//method是静态的,所在的内部类也必须是静态的
System.out.println("内部类的静态method方法");
}
void show(){
System.out.println("内部类的非静态show方法");
}
}
}
public class Demo
{
public static void main(String[]args){
OuterClass.InnerClass oi=new OuterClass.InnerClass();//因为内部是静态的,所以可以用这种方法创建对象
oi.show();//调用内部类的非静态成员方法.
}
}
第三种情况:直接调用内部类中的静态成员,可以不创建对象,直接用类名调用.
如:
class OuterClass//外部类
{
static class InnerClass//内部类前面加static
{
static void method(){//method是静态的,所在的内部类也必须是静态的
System.out.println("内部类的静态method方法");
}
void show(){
System.out.println("内部类的非静态show方法");
}
}
}
public class Demo
{
public static void main(String[]args){
OuterClass.InnerClass.method();//如果直接调用内部类中的静态成员时,可以不创建对象用类名直接调用.
}
}
7.1.3为什么内部类可以直接访问外部类中的成员,包括私有的.
因为,内部类持有了外部类的引用:外部类类名.this.
如:
class OuterClass//外部类
{
private int num=3;//外部类的私有成员
class InnerClass
{
void show(){
System.out.println("外部类的成员:num="+num);
//打印结果:3,因为内部类持有外部类的引用,实际上是调用了:OuterClass.this.num;相当于: System.out.println("外部类的成员:num="+OuterClass.this.num);
}
}
}
public class Demo
{
public static void main(String[]args){
new OuterClass().new InnerClass().show();
}
}
7.1.4局部位置上的内部类
class OuterClass//外部类
{
void method(){
class InnerClass//内部类在局部位置上
{
}
}
}
注意:1,内部类在局部位置时不能被成员修饰符修饰。
2,当内部类在局部位置上时,只能访问由final修饰的局部变量.
如:
class OuterClass//外部类
{
void method(){
final int num=3;//这里的局部变量num必须要加上final,否则无法访问.
class InnerClass//内部类在局部位置上
{
void show(){
System.out.println(num);//内部类在访问局部变量num
}
}
new InnerClass().show();//外部类要访问内部类的成员,必须要创建内部类的对象,完成调用.
}
}
public class Demo
{
public static void main(String[]args){
new OuterClass().method();//调用外部类的成员方法,完成对局部内部类的成员的调用.
}
}
7.1.5匿名内部类
匿名内部类,就是没有名字的内部类,匿名内部类是内部类的简写形式,前提是,内部类必须继承或者实现一个外部类或者接口,匿名内部类实际上就是匿名子类对象.完成对父类或者接口的方法的覆写和调用.
如:
格式:new 父类或接(){
定义子类的内容;
}
interface Inter//接口
{
void show();
}
class OuterClass//外部类
{
class InnerClass implements Inter//匿名内部类的前提:必须继承或实现一个外部类或接口
{
public void show(){//覆写接口中的show()方法
System.out.println("覆写接口Inter中的show方法");
}
}
void method(){
new InnerClass().show();//创建子类对象并调用show方法
}
}
public class Demo
{
public static void main(String[]args){
new OuterClass().method();
}
}
//以上代码,用匿名内部类的形式可以写成:
interface Inter//接口
{
void show();
}
class OuterClass//外部类
{
/*
class InnerClass implements Inter//匿名内部类的前提:必须继承或实现一个外部类或接口
{
public void show(){//覆写接口中的show()方法
System.out.println("覆写接口Inter中的show方法");
}
}
*/
//将注释的代码写成匿名内部类的形式
void method(){
new Inter(){//这里就是创建Inter接口的子类对象
public void show(){//完成对接口中抽象方法的覆写
System.out.println("覆写接口Inter中的show方法");
}
}.show();//直接调用show方法
}
}
public class Demo
{
public static void main(String[]args){
new OuterClass().method();//创建外部类对象,并调用method方法.
}
}
注意:以上接口中只定义了一个抽象方法,那么如果接口中有多个抽象方法,该如何调用呢.
这时,就可以给匿名子类对象起个名字,再完成方法的调用.
如:
interface Inter//接口
{
void show1();
void show2();
}
class OuterClass//外部类
{
void method(){
Inter in=new Inter(){//这里就是创建Inter接口的子类对象,并赋值给引用型变量in.相当于给子类对象起个名字
public void show1(){//完成对接口中抽象方法的覆写
System.out.println("覆写接口Inter中的show1方法");
}
public void show2(){//完成对接口中抽象方法的覆写
System.out.println("覆写接口Inter中的show2方法");
}
};
in.show1();//在这里分别调用两个方法
in.show2();
}
}
public class Demo
{
public static void main(String[]args){
new OuterClass().method();//创建外部类对象,并调用method方法.
}
}
总结:内部类中需要注意,成员修饰符的特点,以及外部类和内部类相互访问的方式,如何在主函数中创建内部类对象,完成对内部类成员的调用,内部类中有静态成员时,内部类的修饰符的变化.内部类在局部位置时,访问局部变量的前提.在匿名内部中要注意书写格式.
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------