java静态类和非静态类的区别_Java中静态内部类和非静态内部类到底有什么区别?...

内部类(Inner Class)和静态内部类(Static Nested Class)的区别:

定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明 为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。外部类按常规的类访问方式使用内部 类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性。

(1)创建实例

OutClass.InnerClass obj = outClassInstance.new InnerClass(); //注意是外部类实例.new,内部类:

AAA.StaticInner in = new AAA.StaticInner();//

注意是外部类本身,静态内部类

(2)内部类中的this

内 部类中的this与其他类一样是指的本身。创建内部类对象时,它会与创造它的外围对象有了某种联系,于是能访问外围类的所有成员,不需任何特殊条件,可理 解为内部类链接到外部类。 用外部类创建内部类对象时,此内部类对象会秘密的捕获一个指向外部类的引用,于是,可以通过这个引用来访问外围类的成员。

(3)外部类访问内部类

内部类类似外部类的属性,因此访问内部类对象时总是需要一个创建好的外部类对象。内部类对象通过‘外部类名.this.xxx’的形式访问外部类的属性与方法。如:

System.out.println("Print in inner Outer.index=" + pouter.this.index);

System.out.println("Print in inner Inner.index=" + this.index);

(4)内部类向上转型

内部类也可以和普通类一样拥有向上转型的特性。将内部类向上转型为基类型,尤其是接口时,内部类就有了用武之地。如果内部类是private的,只可以被它的外部类问,从而完全隐藏实现的细节。

(5)方法内的类

方法内创建的类(注意方法中也能定义类),不能加访问修饰符。另外,方法内部的类也不是在调用方法时才会创建的,它们一样也被事先编译了。

(6)静态内部类

定义静态内部类:在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。

通常称为嵌套类,当内部类是static时,意味着:

[1]要创建嵌套类的对象,并不需要其外围类的对象;

[2]不能从嵌套类的对象中访问非静态的外围类对象(不能够从静态内部类的对象中访问外部类的非静态成员);

嵌 套类与普通的内部类还有一个区别:普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段, 也不能包含嵌套类。但是在嵌套类里可以包含所有这些东西。也就是说,在非静态内部类中不可以声明静态成员,只有将某个内部类修饰为静态类,然后才能够在这 个类中定义静态的成员变量与成员方法。

另外,在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。普通非静态内部类的 对象是依附在外部类对象之中的,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。静态类和方法只属于类本身,并不属于 该类的对象,更不属于其他外部类的对象。

(7)内部类标识符

每个类会产生一个.class文件,文件名即为类名。同样,内部类也会产生这么一个.class文件,但是它的名称却不是内部类的类名,而是有着严格的限制:外围类的名字,加上$,再加上内部类名字。

(8)为何要用内部类?

1. 内部类一般只为其外部类使用;

2. 内部类提供了某种进入外部类的窗户;

3. 也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。

package com.test.xml;

public class OutClassTest {

static int a;

int b;

public static void test() {

System.out.println("outer class static function");

}

public static void main(String[] args) {

OutClassTest oc = new OutClassTest();

// new一个外部类

OutClassTest oc1 = new OutClassTest();

// 通过外部类的对象new一个非静态的内部类

OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();

// 调用非静态内部类的方法

System.out.println(no_static_inner.getKey());

// 调用静态内部类的静态变量

System.out.println(OutClassTest.InnerStaticClass.static_value);

// 不依赖于外部类实例,直接实例化内部静态类

OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();

// 调用静态内部类的非静态方法

System.out.println(inner.getValue());

// 调用内部静态类的静态方法

System.out.println(OutClassTest.InnerStaticClass.getMessage());

}

private class InnerClass {

// 只有在静态内部类中才能够声明或定义静态成员

// private static String tt = "0";

private int flag = 0;

public InnerClass() {

// 三.非静态内部类的非静态成员可以访问外部类的非静态变量和静态变量

System.out.println("InnerClass create a:" + a);

System.out.println("InnerClass create b:" + b);

System.out.println("InnerClass create flag:" + flag);

//

System.out.println("InnerClass call outer static function");

// 调用外部类的静态方法

test();

}

public String getKey() {

return "no-static-inner";

}

}

private static class InnerStaticClass {

// 静态内部类可以有静态成员,而非静态内部类则不能有静态成员。

private static String static_value = "0";

private int flag = 0;

public InnerStaticClass() {

System.out.println("InnerClass create a:" + a);

// 静态内部类不能够访问外部类的非静态成员

// System.out.println("InnerClass create b:" + b);

System.out.println("InnerStaticClass flag is " + flag);

System.out.println("InnerStaticClass tt is " + static_value);

}

public int getValue() {

// 静态内部类访问外部类的静态方法

test();

return 1;

}

public static String getMessage() {

return "static-inner";

}

}

public OutClassTest() {

// new一个非静态的内部类

InnerClass ic = new InnerClass();

System.out.println("OuterClass create");

}

}

/**

* 总结:

* 1.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。

* 2.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。

* 3.实例化一个非静态的内部类的方法:

* a.先生成一个外部类对象实例

* OutClassTest oc1 = new OutClassTest();

* b.通过外部类的对象实例生成内部类对象

* OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();

* 4.实例化一个静态内部类的方法:

* a.不依赖于外部类的实例,直接实例化内部类对象

* OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();

* b.调用内部静态类的方法或静态变量,通过类名直接调用

* OutClassTest.InnerStaticClass.static_value

* OutClassTest.InnerStaticClass.getMessage()

*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java写便签_如何编写一个便签程序(用Java语言编写)

如何编写一个便签程序(用Java语言编写)热度:336 发布时间:2011-02-18 11:44:16如何编写一个便签程序(用Java语言编写)因为以前没有好好学习Java,都搞忘了,请大家原谅,也请你们指导一下,怎么编写这个程序&…

java 生成log4j_Java log4j配置每天生成一个日志文件 - 永恒ぃ☆心 的日志 - 网易博客...

一、配置属性文件log4j.propertieslog4j.rootLoggerINFO,stdout,Rlog4j.appender.stdoutorg.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layoutorg.apache.log4j.PatternLayout# Pattern to output the callers file name and line number.log4j.appender.stdout.layo…

java 子进程输出流_具有输入/输出流的Java进程

首先,我建议更换这条线路。Process process Runtime.getRuntime ().exec ("/bin/bash");带着线条ProcessBuilder builder new ProcessBuilder("/bin/bash");builder.redirectErrorStream(true);Process process builder.start();ProcessBuil…

java中if 运算符_[Java]Java基本语法结构(运算符,流程控制语句,if语句)

1:运算符(掌握)(1)算术运算符A:,-,*,/,%,,--B:的用法a:加法b:正号c:字符串连接符C:/和%的区别数据做除法操作的时候,/取得是商,%取得是余数D:和--的用法a:他们的作用是自增或者自减b:使用**单独使用放在操作数据的前面和后面效果一样。a或者a效果一样。*…

java 变量取值范围_JAVA中的变量及取值范围

字节是二进制数据的单位。一个字节通常8位长。但是,一些老型号计算机结构使用不同的长度。为了避免混乱,在大多数国际文献中,使用词代替byte。变量:变量的数据类型;变量名变量值数据类型基本型数值型(整数)布尔型浮点型…

java object强制类型转换_scala object 转Class Scala强制类型转换

asInstanceOf[T]将对象类型强制转换为T类型。还是由于泛型存在类型擦除的原因,1.asInstanceOf[String]在运行时会抛出ClassCastException异常,而List(1).asInstanceOf[List[String]]将不会。packageresti.webimportorg.springframework.beans.factory.annotation.Au…

java毛玻璃_模糊效果(毛玻璃效果)

模糊效果(毛玻璃效果)效果演示:1. 使用iOS自带的 UIImageImageEffects 文件文件中有这么几个方法:- (UIImage *)applyLightEffect;- (UIImage *)applyExtraLightEffect;- (UIImage *)applyDarkEffect;- (UIImage *)applyTintEffectWithColor:(UIColor *)…

java程序崩溃怎么重启_android 异常崩溃后 重启app(进程守护方式实现)

【实例简介】【实例截图】【核心代码】package com.sunfusheng.daemon.sample;import android.content.ComponentName;import android.content.Intent;import android.os.Looper;import android.util.Log;import com.blankj.utilcode.util.AppUtils;import com.sunfusheng.daem…

mysql 存储过程 循环结构 命名_mysql存储过程----循环结构

循环结构一共分为三种:三种循环结构分别为while、repeat、loop。while循环语法while 表达式(如果表达式为true则执行业务逻辑,否则不执行,与repeat循环相反,repeat循环满足表达式退出循环,不满足一直执行) do业务逻辑e…

mysql 组合索引 or_Mysql_组合索引和单列索引

一、目标什么时候使用组合索引,什么时候使用单独索引组合索引、单独索引区别组合索引:最左前缀匹配原则二、前期数据准备1. 建表CREATE TABLE user (uidint(11) NOT NULLAUTO_INCREMENT,namevarchar(50) DEFAULT NULL,pwdvarchar(50) DEFAULT NULL,creat…

mysql与mangodb多租户_MongoDB多租户(Java):如何使用MongoClient在运行时切换具有不同数据库凭据的MongoDB数据库?...

我正面临一个关于MongoDB多租户的问题.我有两个不同的mongoDB数据库(db1和db2).这两者都有不同的凭据.db1凭据:userName:admin密码:passwddb2凭据:userName:admin1密码:passwd1我需要在运行时从一个数据库切…

python 库 全局变量_python局部变量和全局变量global

当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。使用局部变量例7.3 使用局部…

java 自省_自知 自省 自立 自信 自尊 自治 自强 自制

自知 自省 自立 自信 自尊 自治 自强 自制能知人者有智力,能自知才是真正的智者;能战胜别人者有力量,能战胜自己才是真正的强者;能知足者就是富有,能勤奋顽强坚持才是真正的有志者;不失其立足之地的人可以长…

java中json重复数据结构_JAVA把各种数据结构转换为JSON格式

Java代码import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import net.sf…

字节字符区别Java_【JAVA基础】字符数组与字节数组的区别

String.getBytes()和String.tocharArray(),字节数组和字符数组的区别String.getBytes()是将字符串转化为一个字节数组。而String.toCharArray()是将一个字符串转化为一个字符数组。【例如】byte bys[] “国庆60周年”.getBytes();char chs[]“国庆60周年”.toCharAr…

mysql日志管理_关于MySQL的日志管理(binlog)

关于MySQL的日志管理(binlog)一、查看binlog的启用状态最常用的mysql版本是5.7,默认不开启binlog,可以在登录mysql之后,利用以下命令查看当前的binlog启用状态:mysql show variables like "%log_bin%";图中显示“ON”&a…

java精确测量文本高度_基于文本精确计算UITableViewCell的高度

我正在开发一个ios应用程序,并使用autolayout我正在尝试创建一个具有不同行高的表视图 .原型单元的布局如下:我有一个主单元格(黑色)里面有一个UIView(红色),里面有一个UILabel(蓝色)我添加的Autolayout约束如图所示:The UIView h…

php做一个微信退款,PHP实现微信退款功能

大家好,我是小编,最近在调微信退款接口,发现有许多坑,更大家分享一下① 要是在测试的时候,网页提示 curl 58 说明 证书的路径出现问题(这里要填物理路径,也就是绝对路径)②网页提示curl 52 说明你的证书引入…

php显示时间,php实现用已经过去多长时间的方式显示时间

本文实例讲述了php用已经过去多长时间的方式显示时间的方法。分享给大家供大家参考。具体如下:这里以一种可读性比较好的方式显示已经过去多长时间,比如:距离现在10秒,距离现在1天等等。function time_is_older_than($t, $check_t…

java中日期计算时间差,java中依据,两个日期,计算时间差

java中根据,两个日期,计算时间差。分别获取两个时间的毫秒数Date.getTime(),相减,得到的值/1000为秒数,/60*1000为分钟数,/60*60*1000为小时数。/*** 计算时间差** param begin* param end* return*/public…