学习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文件。
我们来对内部类做一个总结:
- 内部类就像一个实例成员一样存在于外部类中。
- 内部类可以访问外部类的所有成员就想访问自己的成员一样没有限制。
- 内部类中的this指的是内部类的实例对象本身,如果要用外部类的实例对象就可以用类名.this的方式获得。
- 内部类对象中不能有静态成员,原因很简单,内部类的实例对象是外部类实例对象的一个成员。
内部类创建的方法:
- 在外部类的内部,可以用可以用SmallDog sd = new SmallDog() ; 方法直接创建;
- 在外部类外部,必须先创建外部类实例,然后再创建内部类实例。
二、局部内部类
局部内部类又称之为方法内部类,顾名思义,就是类中的方法定义类:
/*
* 定义一个类
*/
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(); //调用方法
}
}
最终执行的代码:
我们来对局部内部类进行总结吧:
- 局部内部类的地位和方法内的局部变量的位置类似,因此不能修饰局部变量的修饰符也不能修饰局部内部类,譬如public、private、protected、static、transient等
- 局部内部类只能在声明的方法内是可见的,因此定义局部内部类之后,想用的话就要在方法内直接实例化,记住这里顺序不能反了,一定是要先声明后使用,否则编译器会说找不到。
- 局部内部类不能访问定义它的方法内的局部变量,除非这个变量被定义为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 文件 写好,直接采用匿名方式,进行实现便可。
四、静态嵌套类
/*
* 定义一个 类
*/
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基础知识--四大内部类的更多相关文章
-
主题:学习Spring必学的Java基础知识(9)----HTTP报文
转: 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些 ...
-
学习Spring必学的Java基础知识(2)----动态代理
Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的 ...
-
学习Spring必学的Java基础知识(1)----反射(转)
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
-
学习Spring必学的Java基础知识(1)----反射
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
-
学习Spring必学的Java基础知识
[1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http: ...
-
Android学习笔记(四) JAVA基础知识回顾
一.接口 1)接口中定义的方法都是public权限,并且默认为public,而不是default. 2)接口的实现(implements)是特殊的继承,类似于父类子类的关系,可以向上转型(非常重要). ...
-
反射-----学习Spring必学的Java基础知识之一
Java允许通过程序化的方式间接对Class进行操作,Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数.属性 ...
-
Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识
JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 ...
-
[源码解析] 深度学习分布式训练框架 Horovod (1) --- 基础知识
[源码解析] 深度学习分布式训练框架 Horovod --- (1) 基础知识 目录 [源码解析] 深度学习分布式训练框架 Horovod --- (1) 基础知识 0x00 摘要 0x01 分布式并 ...
随机推荐
-
Linux分区:超过2TB硬盘分区
测试iscsi服务是否正常 [root@FocusBackup ~]# service iscsi restart 停止 iscsi: ...
-
mybatis一个怪异的问题: Invalid bound statement not found
ssm中报一下错误: invalid bound statement (not found): me.tspace.pm.dao.userdao.getuser at org.apache.ib ...
-
imx6 uboot saveenv fail
uboot设置环境变量之后,不能保存在EMMC中,出现错误. MX6SDL SABRESD U-Boot > saveenv Saving Environment to SPI Flash... ...
-
JavaScript思维导图—DOM基本操作
JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/ DOM基本 ...
-
Cocos开发中性能优化工具介绍之使用Windows任务管理器
说到Windows平台,我们很快就想到了Visual Studio 2012,然而Visual Studio 2012在这方面没有很好的工具.如果我们只是想知道大体上内存.CPU等在某一事件前后变化情 ...
-
java开发规范总结_命名规范
规范需要平时编码过程中注意,是一个慢慢养成的好习惯 1.文件 1.属性文件后缀为properties,并且符合java中i18n的规范: 2.对于各产品模块自己的配置文件必须放置在自己模块的con ...
-
Shortest Word Distance 解答
Question Given a list of words and two words word1 and word2, return the shortest distance between t ...
-
vs2005编译QT4.5版本
1. 下载代码:qt-win-opensource-src-4.5.02. 设置环境变量 Add to PATH: ‘;%QTDIR%/bin’3. 输入cmd,启动到vs2005安装目录下,进入Mi ...
-
浅谈PHP的CI框架(一)
作为前端开发人员,掌握一门后端语言是必不可少的,PHP的CI框架是一个快速开发框架,基于MVC,比较接近原生PHP,在原有的PHP代码上封装了许多类,易上手,容易扩展,适用于小项目,并且CI的文档及案 ...
-
Win7 系统记事本乱码及cmd闪退解决办法
打开控制面板,点击时钟.语言和区域 中文(简体)改为英语(英国),然后重启电脑,重启电脑之后,继续此操作,在把英语(英国)改为中文(简体),再次重启电脑,就OK了.