Java 之 内部类
(static修饰的成员属于整个类,而不属于单个对象)
定义:将一个类放到另一个类的内部定义,这个在内部定义的类就叫做内部类(也有的成嵌套类),包含内部类的类被称为外部类(也有的称宿主类)。
1。非静态内部类
没有使用static修饰的内部类就是非静态内部类。
注意:a。java不允许在非静态内部类中定义静态成员
b。当调用非静态内部类中的实例方法时,必须有一个非静态成员内部类实例,非静态内部类实例必须寄生在外部实例内
c。如果外部类成员变量与内部类成员变量与内部类里的方法的局部变量同名,可通过this,外部类类名.this 作为限定来加以区分。
public class Test { private String prop = "外部类的实例变量"; public class InClass{
private String prop = "内部类中的实例变量";
public void info(){
String prop = "局部变量";
System.out.println("外部类的实例变量值:"+Test.this.prop);
System.out.println("内部类的实例变量值:" + this.prop);
System.out.println("局部变量:" + prop);
}
}
public void test(){
InClass ic = new InClass();
ic.info();
}
public static void main(String[] args){
/*
* Test ts = new Test();
* ts.test();
* 上下的代码作用一样
*/
new Test().test();
}
}
使用非静态内部类:
在外部类以外的地方定义内部类的语法格式: OuterClass.InnerClass VarName
在外部类以外的地方创建非静态内部类实例的语法: OuterInstace .new InnerConstructor()
class Out{
class In
{
public In(String msg){
System.out.println(msg);
}
}
}
public class CreateInnerInstance {
public static void main(String[] args){
//OuterClass.InnerClass varName = new OutInstance.new InnearConstructor();
Out.In in = new Out().new In("测试信息");
/*Out.In in;
*Out out = new Out();
*in2 = out.new In("测试信息"); */
}
}
2.静态内部类
静态内部类是用static修饰的内部类,也称类内部类。
a。静态内部类不能访问外部类的实例成员,只能访问外部类的类成员(同为static 修饰)。
c。外部类依然不能访问静态内部类中的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类中的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类中的实例变量。
public class StaticInnerClassTest {
private int prop = 5 ;
private static int prop1 = 6 ;
static class InClass{
public void accessOuterProp(){ private static int prop = 5;
private int prop1 = 6;
//System.out.println(prop); //这句代码会出错,静态内部类无法访问外部类的非静态成员 System.out.println(prop1);
}
}
public void accessInnerPro(){
//通过静态内部类的类名访问静态内部类中的类成员 System.out.println(InClass.prop);
//通过静态内部类对象作为调用者来访问静态内部类中的实例变量
SYstem.out.println(new InClass().prop1);
}
}
在外部类以外使用使用静态内部类:(和使用非静态比较,相类似)
语法: new OuterClass.InnerConstructor()
class Out{
static class In
{
public In(){
System.out.println("静态内部类的构造器");
}
}
}
public class CreateStaticInnerInstance {
public static void main(String[] args){
Out.In in = new Out.In();
}
}
3.匿名内部类
如果把一个内部类放到方法中定义,则这个内部类就是一个局部内部类,局部内部类仅在该方法里有效。
定义匿名内部类的格式:
new 实现接口 | 父类构造器(实参列表)
{
类体部分
}
可以看出,匿名内部类必须继承一个父类或者实现一个接口。
interface Product{
public Double getPrice();
public String getName();
}
public class AnonymTest { public void ce(Product p){
System.out.println("购买了一个" + p.getName() + ",花掉了" + p.getPrice());
}
public static void main(String[] args){
AnonymTest at = new AnonymTest();
at.ce(new Product() {
@Override
public Double getPrice() {
return 0.5;
}
@Override
public String getName() {
return "辣条";
}
});
}
}
Java 之 内部类的更多相关文章
- Java学习--内部类(一)
Java学习--内部类(一) 一. 内部类的定义和特点 class Outer{ privite int num = 5; class Inner{ public void Display(){ Sy ...
- Java的内部类
Java的内部类 首先我们来了解一下什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类可以是静态static的,也可用public,default,protected和private修饰 ...
- java使用内部类的好处及其初始化
java使用内部类的原因 每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响 java内部类初始化 ForeCatal ...
- JAVA基础——内部类详解
JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...
- JAVA面向对象-----内部类的概述
JAVA面向对象-–内部类的概述s 将类定义在另一个类的内部则成为内部类.其实就是类定义的位置发生了变化. 在一个类中,定义在类中的叫成员变量,定义在函数中的叫成员函数,那么根据类定义的位置也可以分为 ...
- Java的内部类真的那么难以理解?
01 前言 昨天晚上,我把车停好以后就回家了.回家后才发现手机落在车里面了,但外面太冷,冷到骨头都能感受到寒意——实在是不想返回一趟去取了(小区的安保还不错,不用担心被砸车玻璃),于是打定主意过几个小 ...
- 第30节:Java基础-内部类
内部类 // 外部类 class Demo{ private int num = 3; // 定义内部类 class Int{ void show(){ System.out.println(&quo ...
- 【Java】 内部类
[Java]内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 使用内部类的的原因主要有三点: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据. 内部类可以对同一个包中的 ...
- java中内部类的积累
放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所有元素的访 ...
- Java 基础 内部类
Java 基础 内部类 内部类(嵌套类) nested class 目的为外围类enclosing class提供服务. 四种: 静态成员类 static member class 非静态成员类 no ...
随机推荐
- Spring Remoting: Burlap--转
原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-burlap.jsp Concept Overview In the ...
- 谈Mysql索引
myisam和innodb的索引有什么区别? 两个索引都是B+树索引,但是myisam的表存储和索引存储是分开的,索引存储中存放的是表的地址.而innodb表存储本身就是一个B+树,它是用主键来做B+ ...
- 在做excel导出时如何将excel直接写在输出流中
之前做excel导出时,我都是先将文件写在服务器上,然后再下载下来,后来发现原来可以直接将文件写在输出流里边. 下面是一个小demo: package com.huaqin.fcstrp.util; ...
- Winform开发框架之权限管理系统功能介绍
权限管理系统的重要特性总结: 1) 高度集成的权限系统.独立模块,能快速整合使用.2) 符合权限的国际通用标准,基于RBAC(基于角色的访问控制)的角色权限控制.3) 多数据库架构支持,内置支持Sql ...
- JS对象的创建与使用
本文内容: 1.介绍对象的两种类型: 2.创建对象并添加成员: 3.访问对象属性: 4.利用for循环枚举对象的属性类型: 5.利用关键字delete删除对象成 ...
- learning sql (second edition) script
create database bank; use bank; /* begin table creation */ create table department (dept_id smallint ...
- 老外还是喜欢Ubuntu的
有图为证? 开效果应该是Ubuntu的界面了,当然,不知是不是backtrack. 这里面的Hacker用的电脑都不是水果.是没有给钱么.
- 3kb jQuery代码搞定各种树形选择。
自制Jquery树形选择插件. 对付各种树形选择(省市,分类..)90行Jquery代码搞定,少说废话直接上插件代码.稍后介绍使用说明.是之前写的一个插件的精简版. 1.Jquery插件代码 /* * ...
- 线上mysql内存持续增长直至内存溢出被killed分析(已解决)
来新公司前,领导就说了,线上生产环境Mysql库经常会发生日间内存爆掉被killed的情况,结果来到这第一天,第一件事就是要根据线上服务器配置优化配置,同时必须找出现在mysql内存持续增加爆掉的原因 ...
- C++ Const(常类型)的作用总结
C++ Const的作用总结 面试或者工作中,我们经常遇到const修饰符定义的变量,函数和对象等.那么const的作用具体是什么,有哪些.今天自己好好的总结了一下,记录下来方便自己以后时间久了不记得 ...