Java内部类的定义和使用
为什么要用到内部类:
在java开发学习中我们经常会碰到内部类。内部类又有很多的优势:首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法名称参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。不过你可能要质疑,更改一下方法的不就行了吗?的确,以此作为设计内部类的理由,实在没有说服力。真正的原因是这样的,java中的内部类和接口加在一起,从而java 通过内部类加上接口,可以很好的实现多继承的效果。
内部类的分类和使用
package one;
public class Outer{
private static int outer_i = 1;
private int k=20;
public static void outer1(){
//...
}
//成员内部类
class Inner{
int j=100;//内部类中外部类的实例变量可以共存
int inner_i=1;
void inner1(){
System.out.println(outer_i);//外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量
System.out.println(j);//在内部类中访问内部类自己的变量直接用变量名
System.out.println(this.j);//也可以在内部类中用"this.变量名"来访问内部类变量
//访问外部类中与内部类同名的实例变量可用"外部类名.this.变量名"。
System.out.println(k);//外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量
outer1();
}
}
//外部类的非静态方法访问成员内部类
public void outer2(){
Inner inner = new Inner();
inner.inner1();
}
//外部类的静态方法访问成员内部类,与在外部类外部访问成员内部类一样
public static void outer3(){
Outer out = new Outer();//step1 建立外部类对象
Inner inner=out.new Inner();//step2 根据外部类对象建立内部类对象
inner.inner1();//step3 访问内部类的方法
}
public static void main(String[] args){
outer3();
}
}
2、局部内部类: 即在方法中定义的内部类,与局部变量类似,在局部内部类前不加修饰符public或private,其范围为定义它的代码块。
public class Outer {
public void say(){
System.out.println("关门说真话!");
}
}
public class Test {
public void ting(){
class MiMi extends Outer{//定义一个局部的内部类,继承Outer方法
//……
}
new MiMi().say();//调用局部内部类中继承的say方法
System.out.println("别人都不知道");
}
public static void main(String[] args) {
new Test().ting();
}
}
3、静态内部类: 静态内部类定义在类中,任何方法外,用static定义。注意:静态内部类中可以定义静态或者非静态的成员
package three;
public class StaticTest {
private static String name="abc";
private String sex="男";
static class Person{
private String age = "18";//内部私有成员
public String heigth = "180";//内部类公有成员
public void display(){
//System.out.println(sex);//报错,不能直接访问外部类的非静态成员
System.out.println(name);//只能直接访问外部类的静态成员
System.out.println(age);//访问本内部类成员。
}
}
public void testone(){
Person person = new Person();
person.display();
//System.out.println(heigth);//报错,是因为不可以直接访问内部类私有成员
//System.out.println(age);//报错,是因为不可以直接访问内部类公有成员
System.out.println(person.age);//可以访问内部类的私有成员
System.out.println(person.heigth);//可以访问内部类的公有成员
}
public void testtwo(){
StaticTest st = new StaticTest();
System.out.println(name);
System.out.println(sex);
//System.out.println(age);//不可以直接访问内部类的成员
//System.out.println(heigth);//不可以直接访问内部类的成员
}
public static void main(String[] args) {
//调用StaticTest
StaticTest staticTest = new StaticTest();
staticTest.testone();
staticTest.testtwo();
}
}
package three;
abstract class parent {
public abstract void like();
}
public class Demo {
public static void main(String[] args) {
parent pt = new parent(){
public void like(){
System.out.println("吃饭睡觉打豆豆。。。");
}
};
pt.like();
}
}
匿名类与内部的联系与区别:
内部类总结:
Java内部类的定义和使用的更多相关文章
- java内部类的定义原则
/*内部类的访问规则:1,内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 外部类名.this2,外部类要访问内部类,必 ...
- 基础篇:JAVA内部类的使用介绍
目录 1 四种内部类 2 内部类的使用场景和优点 3 成员内部类 4 成员内部类的访问范围详解 5 静态内部类 6 局部内部类 7 匿名内部类 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 四 ...
- java中内部类的定义与访问规则
java内部类总结 简单来说,内部类就是在我们所熟悉的类中的里面再定义一个类 为什么需要内部类? 当我们描述事物时,事物之中还有事物,我们就用内部类描述事物 因为内部事物在使用外部事物的内容 我举一个 ...
- java内部类深入详解 内部类的分类 特点 定义方式 使用
本文关键词: java内部类 内部类的分类 特点 定义方式 使用 外部类调用内部类 多层嵌套内部类 内部类访问外部类属性 接口中的内部类 内部类的继承 内部类的覆盖 局部内部类 成员内 ...
- Java内部类final语义实现
本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...
- JAVA内部类有关
最近在看单例模式的实现,看到有一种利用JAVA静态内部类的特性来实现,对于内部类我还真是不了解,遂了解了一下,代码贴上. /** * 内部类分为:成员内部类.局部内部类.匿名内部类和静态内部类. */ ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- Java 内部类摘抄
关于Java的内部类,要说的东西实在太多,这篇博文中也无法一一具体说到,所以就挑些重点的讲.关于内部类的使用,你可能会疑问,为什么我们要使用内部类?为了回答这个问题,你需要知道一些关于内部类的重点.所 ...
- java 内部类 *** 最爱那水货
注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...
随机推荐
- BaaS、IaaS、PaaS、SaaS
参考资料:http://www.zhihu.com/question/23048744
- maven构建简单的web项目
把jdk给换掉 项目修改好了以后写个页面测试一下,结果正常 下面应该添加依赖让web项目一步步丰满起来. 0-添加依赖 1-建一个servlet 2-web.xml中添加servlet声明 3-重新运 ...
- 经典排序算法 – 插入排序Insertion sort
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...
- Linux Shell中单引号、双引号、反引号的区别【转载】
linux shell可以识别4种不同类型的引字符号: 单引号字符' 双引号字符" 反斜杠字符\ 反引号字符` 1. 单引号 ( '' )# grep Susan phonebook Sus ...
- SQL基本语句汇总
语句:CREATE TABLE 作用:创建表格 格式:CREATE TABLE tableName (columnName1 columnDataType1, columnName2 columnDa ...
- android 从服务器获取新闻数据并显示在客户端
新闻客户端案例 第一次进入新闻客户端需要请求服务器获取新闻数据,做listview的展示, 为了第二次再次打开新闻客户端时能快速显示新闻,需要将数据缓存到数据库中,下次打开可以直接去数据库中获取新闻直 ...
- HTTP 错误 500.21 - Internal Server Error 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
HTTP 错误 500.21 - Internal Server Error 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipe ...
- WDM驱动加载方式理解
当PC得知有新设备插入时,总线驱动会创建相应的物理驱动PDO,然后提示有新设备插入,这时候调用相应Driver的AddDevice方法创建功能驱动FDO 下面是一个典型的AddDevice方法 #pr ...
- IEEE/ACM ASONAM 2014 Industry Track Call for Papers
IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 In ...
- ios使用CocoaHTTPServer实现文件共享
CocoaHTTPServer下载地址:https://github.com/robbiehanson/CocoaHTTPServer 实现效果:在电脑端输入192.168.0.100:8080,出现 ...