学习android必备的java基础知识--四大内部类

今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就总结了一下关于四大内部类的知识。

备注: java语言中允许类中再次定义类,这种在其它类内部定义的类叫内部类,内部类分为四种:常规内部类(成员内部类),局部内部类(方法内部类),匿名内部类,静态嵌套内部类

一、常规内部类

  其实常规的内部类就是第一种(成员内部类) 当然 成员内部类由于高内聚,不对外开放原则,比较少用到

/*
* 定义类
*
*/
public class BigDog {
//BigDog 的成员方法
public void GiveChild(){
System.out.println("母狗生孩子!");
}
//定义成员变量内部类 成员内部类
public class SmallDog{
//成员内部类的方法
public void SamllSuck(){
System.out.println("吃奶!");
}
}
}

  如何调用成员内部类,在这里定义的内部类,可以实例化创建,但是又因为是类,引用一个类的前提需要new 对象才能通过点方法的调用

/*
* 定义类
*
*/
public class BigDog {
//BigDog 的成员方法
public void GiveChild(){
System.out.println("母狗生孩子!");
}
//定义成员变量内部类 成员内部类
public class SmallDog{
//成员内部类的方法
public void SamllSuck(){
System.out.println("吃奶!");
}
}
//测试
public static void main(String[] args) {
SmallDog sd = new BigDog().new SmallDog() ;
sd.SamllSuck();
}
}

编译一下,我们看到目录中出现了两个class文件,其中有一个文件名叫做BigDog$SmallDog.class,带了一个$符号,这个特点让我们很容易的认出来这是内部类编译后的class文件。

我们来对内部类做一个总结:

  1. 内部类就像一个实例成员一样存在于外部类中。
  2. 内部类可以访问外部类的所有成员就想访问自己的成员一样没有限制。
  3. 内部类中的this指的是内部类的实例对象本身,如果要用外部类的实例对象就可以用类名.this的方式获得。
  4. 内部类对象中不能有静态成员,原因很简单,内部类的实例对象是外部类实例对象的一个成员。

内部类创建的方法:

  1. 在外部类的内部,可以用可以用SmallDog sd = new  SmallDog() ;  方法直接创建;
  2. 在外部类外部,必须先创建外部类实例,然后再创建内部类实例。

二、局部内部类

局部内部类又称之为方法内部类,顾名思义,就是类中的方法定义类:

/*
* 定义一个类
*/
public class Out { //定义一个成员变量
private String outName; //定义一个方法
public void outFunction(){
//定义方法变量
int i = 2 ;
//定义方法内部类(局部内部类)
class Inner{
int j = 3 ;
//局部内部类的方法
void print(){
int x = 4 ;
System.out.println("此处是局部内部类的方法体内容!");
}
} //调用Inner 局部内部类
Inner inner = new Inner();
inner.print();
}
//测试
public static void main(String[] args) {
Out out = new Out(); //创建对象
out.outFunction(); //调用方法
}
}

最终执行的代码:

我们来对局部内部类进行总结吧:

  1. 局部内部类的地位和方法内的局部变量的位置类似,因此不能修饰局部变量的修饰符也不能修饰局部内部类,譬如public、private、protected、static、transient等
  2. 局部内部类只能在声明的方法内是可见的,因此定义局部内部类之后,想用的话就要在方法内直接实例化,记住这里顺序不能反了,一定是要先声明后使用,否则编译器会说找不到。
  3. 局部内部类不能访问定义它的方法内的局部变量,除非这个变量被定义为final 。

三、匿名内部类

当我们把内部类的定义和声明写到一起时,就不用给这个类起个类名而是直接使用了,这种形式的内部类根本就没有类名,因此我们叫它匿名内部类,同时,在安卓开发中,是使用比较多的,也是最重要的一种内部类

第一: 首选定义一个家长的接口类:Patriarch

/*
* 定义一个家长的接口类
*
*/
public interface Patriarch {
//定义接口方法
public void JiaoXiaoHai();
}

第二: 定义一个抽象的教师类  并实现一个教师另外的一个身份家长的接口类

 /*
*
* 定义一个抽象的教师类 并实现一个教师另外的一个身份 家长 的接口
*
*/
public abstract class Teacher implements Patriarch{
//定义方法
public void doWork(){
System.out.println("在工作!");
}
}

第三:定义一个具体的教师类  “何教师”  具体化实现类

 /*
* 具体的教师类 何教师 具体化实现
*/
public class HeTeacher extends Teacher{ @Override
public void JiaoXiaoHai() {
System.out.println("教两个小孩子!");
}
}

最后定义一个测试类:

 /*
* 定义一个Test类 进行测试
*/
public class Test { //定义一个main 方法
public static void main(String[] args) {
//何老师
HeTeacher heteacher = new HeTeacher();
heteacher.doWork();
heteacher.JiaoXiaoHai();
/*
* 每次需要具体化实现教师 都必须要进行创建一个对象,也就是说要写一个具体类,这就显得比较复杂麻烦
*/
System.out.println("===============分割线===================");
/*
* 采用匿名局部内的来创建对象
*/
//创建Teacher
Teacher Xuteacher = new Teacher(){
@Override
public void JiaoXiaoHai() {
System.out.println("许老师在教一群孩子!");
}
};
Xuteacher.doWork();
Xuteacher.JiaoXiaoHai();
}
}

由上路的代码可见,其实匿名内部类中,需要具体化对象的实现的话,进行直接匿名创建对象,这样就显得比较方便,不至于每次的要使用不同的具体类都得new 文件 写好,直接采用匿名方式,进行实现便可。

四、静态嵌套类

 静态嵌套类相对于以上三种内部类比较简单,也就是多个一个静态的static关键字
例子: 
 /*
* 定义一个 类
*/
public class Out { //定义静态变量
static int x = 1 ; //定义静态内部类
static class OutClass{
//定义静态内部类的方法
void print(){
System.out.println("此方法是Out类的静态内部类");
}
} //main 方法测试
public static void main(String[] args) {
Out.OutClass out = new Out.OutClass();
out.print();
}
}

静态嵌套内部类和其他静态方法一样只能访问其它静态的成员,而不能访问实例成员。因此静态嵌套类和外部类(封装类)之间的联系就很少了,他们之间可能也就是命名空间上的一些关联。

各位小伙伴,我来一个温习提示下:内部类在Android中应用的非常多,理解和多多使用很重要,希望我的理解加上大家的努力相信可以一直往前的,加油,同时,如果分享中的内容有错,或者小伙伴有何更好的见解,那就多多联系我吧,毕竟我是初学者嘛,再此致敬。

 

学习android学习必备的java基础知识--四大内部类的更多相关文章

  1. 主题:学习Spring必学的Java基础知识(9)----HTTP报文

    转: 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些 ...

  2. 学习Spring必学的Java基础知识(2)----动态代理

    Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的 ...

  3. 学习Spring必学的Java基础知识(1)----反射(转)

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  4. 学习Spring必学的Java基础知识(1)----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  5. 学习Spring必学的Java基础知识

    [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http: ...

  6. Android学习笔记(四) JAVA基础知识回顾

    一.接口 1)接口中定义的方法都是public权限,并且默认为public,而不是default. 2)接口的实现(implements)是特殊的继承,类似于父类子类的关系,可以向上转型(非常重要). ...

  7. 反射-----学习Spring必学的Java基础知识之一

    Java允许通过程序化的方式间接对Class进行操作,Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数.属性 ...

  8. Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识

    JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 ...

  9. [源码解析] 深度学习分布式训练框架 Horovod (1) --- 基础知识

    [源码解析] 深度学习分布式训练框架 Horovod --- (1) 基础知识 目录 [源码解析] 深度学习分布式训练框架 Horovod --- (1) 基础知识 0x00 摘要 0x01 分布式并 ...

随机推荐

  1. Android版Ftp服务端软件

    分享一款开发的Android版Ftp服务端软件,支持Android4.0及以上版本,可以实现局域网无线传输文件到手机,或者把手机上的多媒体文件分享到iPad等设备来扩展这些设备的存储空间,详情请见软件 ...

  2. sqlserver -- 学习笔记(四)将一个数据库的表复制到另外一个数据库(备忘)

    --复制结构+数据 select * into 数据库名.dbo.新表名 from 数据库名.dbo.原表名 select * into Stockholder.dbo.SHInfo from dsp ...

  3. ubuntu14.04使用IceGridAdmin图形界面

    打开网页: http://www.rpmfind.net/linux/RPM/index.html输入搜索: icegrid-gui下载文件: icegrid-gui-3.5.1-2.mga4.x86 ...

  4. 客户端请求、服务器响应及其HTTP状态码

    一JSP客户端请求 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信 息头的一部分来传送的.我们可以查阅HTTP协议来获得更多的信息. 下表列出了浏 ...

  5. Hadoop第10周练习—Mahout部署及进行20newsgroup数据分析例子

    :搭建Mahout环境 :运行20newsgroup 内容 运行环境说明 1.1 硬软件环境 线程,主频2.2G,6G内存 l  虚拟软件:VMware® Workstation 9.0.0 buil ...

  6. Redis设计与实现-持久化篇

    redis数据库 默认16个数据库,每个数据库由一个redis.h/redisDb结构表示,此结构里的dict字典与expires字典,其中dict保存了该库所有键值对,此字典即为键空间:expire ...

  7. 如何手动让HttpRequestBase.IsAuthenticated 和 HttpContext.User.Identity.IsAuthenticated 为true.

    今天为了重写权限验证这块需要重写AuthorizeAttribute 这个属性,看了官方文档:HttpContextBase.User.Identity.IsAuthenticated 这个必须是tr ...

  8. 关于foreach中对集合执行Add或者Remove操作引发枚举值被修改异常

    方法传入集合List<string> ids; 执行操作后再次循环引发异常 foreach (string id in ids) { ids.Add("a"); } 更 ...

  9. Python Import 详解

    http://blog.csdn.net/appleheshuang/article/details/7602499 一 module通常模块为一个文件,直接使用import来导入就好了.可以作为mo ...

  10. [PHP] PHP请求Socket接口测试

    使用php读取socket接口的数据,通过php传递请求方法和请求参数,得到返回结果 PHP文件: <?php class Test{ const IP='127.0.0.1'; const p ...