第十章 内部类1

摘要:
内部类理解外部类并可以与之进行通信。创建一个内部类非常简单,只要在另一个类中定义一个类即可。但是,静态或非静态类可以直接在外部类的方法中创建,如创建方法1中那样。外部类通知此方法以获取内部类对象。非静态内部类不能包含静态数据和字段,也不能包含嵌套类。

第十章 内部类1第1张

说明:内部类和组合是完全不同的概念,内部类看起来更像是一种代码隐藏机制。内部类了解外围类,并能与之通信。要创建一个内部类是非常简单的,只要将一个类定义在另一个类的内部即可。

创建内部类对象的方式:

1.如果内部类为公有、静态内部类:

packagethink.in.java.test;

/*** 一个包裹着公有的、静态的、内部类的外部类
 * @authorAdministrator
 *
 */
public classOuter {
    privateString oStr;
    
    Outer(String oStr){
        this.oStr =oStr;
    }
    
    publicInner getInner(String str) {
        return newInner(str);
    }
    
    public static classInner{
        privateString inStr;
        
        Inner(String inStr){
            this.inStr =inStr;
        }
        
        public voidprint() {
            System.out.println(this.inStr);
        }
    }
}

测试程序:

packagethink.in.java.test;

importthink.in.java.test.Outer.Inner;

/*** 创建公有的、静态的、内部类对象的方式
 * @authorAdministrator
 *
 */
public classTset {

    public static voidmain(String[] args) {

        //创建方式1
        Outer o = new Outer("I am outer");
        Inner in1 = o.getInner("I am Inner1");
        in1.print();
        
        //创建方式2 -- 推荐
        Inner in2 = new Inner("I am Inner2");
        in2.print();
        
        //创建方式3
        Outer.Inner in3 = new Outer.Inner("I am Inner3");
        in3.print();
        
        //创建方式4
        Outer.Inner in4 = new Inner("I am Inner4");
        in4.print();
        
        //Illegal enclosing instance specification for type Outer.Inner
        //Outer.Inner in5 = o.new Inner("I am Inner5");
}

}

输出:

I am Inner1
I am Inner2
I am Inner3
I am Inner4

总结:静态内部类不能使用非静态内部类的创建方式,即上测试类中in5对象的创建方式

2.如果内部类为公有、非静态内部类:

packagethink.in.java.test;

/*** 一个包裹着公有的、非静态的、内部类的外部类
 * @authorAdministrator
 *
 */
public classOuter {
    privateString oStr;
    
    Outer(String oStr){
        this.oStr =oStr;
    }
    
    publicInner getInner(String str) {
        //return new Outer.Inner(str);
        return newInner(str);
    }
    
    public classInner{
        privateString inStr;
        
        Inner(String inStr){
            this.inStr =inStr;
        }
        
        public voidprint() {
            System.out.println(this.inStr);
        }
    }
}

测试程序:

packagethink.in.java.test;

importthink.in.java.test.Outer.Inner;

/*** 创建公有的、非静态的、内部类对象的方式
 * @authorAdministrator
 *
 */
public classTset {

    public static voidmain(String[] args) {

        //创建方式1
        Outer o = new Outer("I am outer");
        Outer.Inner in1 = o.getInner("I am Inner1");
        //Inner in1 = o.getInner("I am Inner1");
in1.print();
        
        //创建方式2
        Inner in2 = o.new Inner("I am Inner2");
        //Outer.Inner in2 = o.new Inner("I am Inner2");
in2.print();
        
        //error,不能引用外部类的名字去创建这个对象,你应该使用外部类的对象去创建内部类,像in2那样
        //Inner in3 = o.new Outer.Inner("I am Inner2");
        
        //error!
        //Inner in3 = new Outer.Inner("I am Inner3");
        //Inner in4 = new Inner("I am Inner3");
        //Inner in5 = new Inner("I am Inner5");
}

}

输出:

I am Inner1
I am Inner2

总结:创建非静态内部类不能使用像静态内部类那样直接创建!但创建静态或非静态类都可以像创建方式1中那样,在外部类的某个方法里直接创建,在由外部类通知这个方法,获取内部类对象。

学习:针对非静态类,在拥有外部类对象之前是不可能创建内部类对象的,这是因为内部类对暗暗地连接到创建它的外部类对象上,这也是为什么非静态内部类具有外部类所有成员访问权的原因,当某个外围类对象创建了一个内部类对象时,此内部类对象必定会秘密捕获一个指向那个外围类对象的引用。然后,在你访问外围类的成员时,就是用那个引用来选择外围类的成员。

对于静态的内部类不具有访问外部类所有成员方法和非静态变量的权利

packagethink.in.java.test;

/*** 一个包裹着公有的、非静态的、内部类的外部类
 * @authorAdministrator
 *
 */
public classOuter {
    privateString oStr;
    
    Outer(String oStr){
        this.oStr =oStr;
    }
    
    publicInner getInner(String str) {
        return newInner(str);
    }
    
    public static voidoPrint(String str) {
        System.out.println(str);
    }
    
    public static classInner{
        privateString inStr;
        
        Inner(String inStr){
            this.inStr =inStr;
        }
        
    }
    
    public static voidmain(String[] args) {
        Outer o = new Outer("i am outer");
        Inner in = new Inner("I am Inner");
        
        System.out.println(o.oStr);
        //不具有访问外围类属性的权利
        //System.out.println(in.oStr);
o.getInner("hello");
        //不具有访问外围类方法的权利
        //in.getInner("hello");
        
        //可以调用外部类静态方法
        oPrint("hello");
        
    }
}

静态的内部类通常被称为嵌套类,它意味着:

1)要创建嵌套类的对象,并不需要其外围类的对象。

2)不能从嵌套类的对象中访问非静态的外委类对象。

非静态内部类中不能含有静态数据与字段,也不能包含嵌套类。

第十章 内部类1第2张

免责声明:文章转载自《第十章 内部类1》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇完全方案:超详细的webpack4配置(webpack3与webpack4的差异)一句话木马:ASP篇下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c++之标准库iomanip

C++ 标准库之iomanip istream & istream::get(char *, int, char = ‘ ’); istream & istream::getline(char *, int, char = ‘ ’); 作用: 从文本中提取指定个数的字符串, 并在串数组末尾添加一个空字符. 区别: get() 不从流中提取终...

Delphi的类与继承

     既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解。有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样;也有人说dephi实际上是面向过程的,他的面向对象并不彻底。实际生活中持这两种观点的人不在少数,就拿我认识的一个非常好的程序员来说吧,他很早就开始用vb,到后来接触到delphi,并且用d...

AESTest

usingGaea.MySql; usingSystem; usingSystem.Data; usingSystem.IO; usingSystem.Security.Cryptography; usingMicrosoft.Extensions.DependencyInjection; usingSystem.Text; usingSys...

Android Volley框架的几种post提交请求方式

首先简单描写叙述一下Google的Android开发团队在2013年推出的一个网络通信框架Volley.它的设计目标是进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比方下载文件等,Volley的表现就不尽如人意。 在app开发中,我们最常见的就是从appclient向服务端发一个http请求.对于两种主要的web请求方式get和post...

C#中文和UNICODE编码转换

C#中文和UNICODE编码转换 //中文轉為UNICODE string str = "中文"; string outStr = ""; if (!string.IsNullOrEmpty(str)) { for (int i = 0; i < str.Length; i++) { //將中文轉為10進制整數,然後轉為16進制unicode out...

springboot+aop切点记录请求和响应信息

本篇主要分享的是springboot中结合aop方式来记录请求参数和响应的数据信息;这里主要讲解两种切入点方式,一种方法切入,一种注解切入;首先创建个springboot测试工程并通过maven添加如下依赖: <!-- AOP --> <dependency> <gr...