黑马程序员-- 五、内部类

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

内部类定义:

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


为什么需要内部类

           典型的情况是,内部类继承自某个类或者实现某个接口,内部类的代码操作创建其的外围类的对象,所以你可以认为内部类提供啦某种进入其外围类的窗口,使用内部类最吸引人的原因是:每个内部类都能独立的继承自一个(接口的)实现,,所以无论外围是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的能力,一些设计与编程问题就很难解决,所以,从这个角度看,内部类使得多重继承的解决方案变得完整,接口解决啦部分问题,而内部类有效的实现啦“多重继承”。

java中根据位置的不同,内部类分为啦四种:

静态内部类:

1.使用static 修饰,声明在类体中。

2.静态内部类可以访问外部类的静态成员。


成员内部类:
 1.声明在类体中,不使用static,具有类的成员特征,也就是,必须具有类的实例才能创建内部类的实例。
 2.内部类实例可以访问共享外部类的成员变量(很常用)
特点:

 当内部类定义在外部类的成员位置上时,可以用成员修饰符修饰,遵循修饰符的规则,即具备成员的特性,又具备类的特性,可以继承和被继承。 


局部内部类

把类声明在方法中就是局部内部类,类似于局部变量。

特点:

定义在局部,不可以被成员修饰符修饰,遵循局部顺序调用规则,遵循局部生命周期,具备类的特性,可以继承和被继承。

访问规则:

访问规则:当访问局部的变量时,局变量必须被final修饰。因为局部内部类的成员比就不变量的生命周期长。

匿名内部类

1.匿名类,非常常见,可以写在任何地方,就像一般的语句。

2.语法更像是创建对象,Date d = new Date();

3.匿名类是对原类的一个继承,同时创建了实例,{}就是继承以后的类体,类体中可使用所有类的语法。

4.匿名类不能写构造器。

5.匿名类可以从抽象类或者接口继承,必须提供抽象方法的实现。


 

详解:


|---外部类访问规则:

1、 内部类可以直接访问外部类的成员,包括私有成员:(外部类.this.)成员,

|---内部类中有同名成员的情况:

|---调用内部类成员:this.成员。

|---调用外部同名成员:外部类.this.成员。

|---原理:内部类持有外部类的引用。

2、 外部类要访问内部类的非静态成员,必须建立内部类的对象才能访问。

|---原因:内部类成员被封装在类中,想要访问必须通过对象访问。

import org.junit.Test;

public class ClassDemo {

String s = "外部类成员";

class Inner{

String s = "内部类同名成员";

void show(){

String s = "局部同名成员";

System.out.println(s);//此处调用的是局部的

System.out.println(this.s);//此处调用的是内部类的

System.out.println(ClassDemo.this.s);//访问外部类成员,省略ClassDemo.this

}

}

@Test

void test(){

new Inner().show();//访问内部类成员

}

}

|---外部其他类访问规则:

1、 当成员内部类非私有时,可以直接在外部其他类中直接建立对象使用。外部类.内部类 标识符 = new 外部类().new 内部类()

2、 当内部类访问外部其他类时,和普通一样需要建立外部其他类对象访问。

|---使用:当描述事物时,该事物的内部还有事物,内部的事物用内部类描述。

import org.junit.Test;

class Onter {

class Inner{

String s = "内部类成员";

void show(){

System.out.println(s);//此处调用的是局部的

}

}

}

public class ClassDemo{

@Test

public void test(){

System.out.println("外部其他类访问内部类成员");

new Onter().new Inner().show();//外部其他类访问内部类成员

}

}

注:内部类有静态成员,内部类也必须是静态的,遵循静态的规则,静态只能访问静态。局部内部类不具备成员特性,不能被成员修饰符修饰,所以局部内部类不能有静态成员。

 

|---匿名内部类:必须继承类或实现接口,匿名内部类实质是匿名子类的对象。

|---定义格式:new 父类(){定义子类内容}

|--特点:同普通对象相同,可以赋值给父类引用,可以定义自己的方法并调用。

|---定义位置:常用于方法体中、方法实参处。

注:匿名内部类厂用于定义临时的功能,用过后销毁,所以通常不会给父类引用赋值,直接调用方法使用,所以定义的方法最好不超过三个。

|---源码示例:

import org.junit.Test;

public class  ClassDemo{

@Test

public void test(){

new Inner(){//匿名内部类继承内部类Inner

void show(){

System.out.println("匿名内部类重写的方法");

}

}.show();

new Onter(){//匿名内部类继承外部其他类Onter

}.show();

new Inter(){//匿名内部类实现内部接口

@Override

public void show() {

// TODO Auto-generated method stub

System.out.println("实现内部接口中的方法");

}

}.show();

inter(new Inter() {//调用方法,参数为匿名内部类

@Override

public void show() {

// TODO Auto-generated method stub

System.out.println("参数位置匿名内部类实现内部接口中的方法");

}

});

}

void inter(Inter in){

in.show();

}

class Inner{//内部类

void show(){

System.out.println("内部类");

}

}

interface Inter{

void show();

}

}

class Onter{//外部其他类

void show(){

System.out.println("外部其他类");

}

}

 


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘 要 伴随着人才教学的关注度越来越高,对于人才的培养也是当今社会发展的最为重要的问题之一。为了进一步的进行人才的培养关工作,许多的学校或者是教育的机构逐步的开展了网络信息化的教学和和管理工作,通过信息化的手段和技术实现网络信息化的教育及管理模式,通过网络信息化的手段实现在线答题在线考试和学生信息在线的管理等操作。这样更加的快捷解决了人才培养之中的问题,也在进一步的促进了网络信息化教学方式的快速的发展工作。相较于之前的人才教育和培养工作之中,存在这许多的问题和局限性。在学生信息管理方面通过线下管理的形式进行学生信息的管理工作,在此过程之中存在着一定的局限性和低效性,往往一些突发的问题导致其中工作出现错误。导致相关的教育工作受到了一定的阻碍。在学生信息和学生成绩的管理方面,往常的教育模式之下都是采用的是人工线下的进行管理和整理工作,在这一过程之中存在这一定的不安全和低效性,面对与学生基数的越来越大,学生的信息管理也在面领着巨大的挑战,管理人员面领着巨大的学生信息的信息量,运用之前的信息管理方式往往会在统计和登记上出现错误的情况的产生,为后续的管理工作造成了一定的困难。然而通过信息化的管理方式进行对学生信息的管理不仅可以避免这些错误情况的产生还可以进一步的简化学生信息管理工作的流程,节约了大量的人力和物力的之处。在线答题系统的实现不仅给学生的信息管理工作和在线考试带来了方便也进一步的促进了教育事业信息化的发展,从而实现高效化的教学工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值