【.Net vs Java? 】 看一看二者的类有多像?(二)

简介: 【.Net vs Java? 】 看一看二者的类有多像?

6.2 Java的内部类

再看一下Java的内部类:

public class OuterClass {
    public String outerClassName = "outerClass's name";
    public void getNestedClassName() {
        String staticString = NestedStaticClass.staticString;
        //无法直接调用非静态内部类的变量
        //String str = NestedClass.nestedClassName;
    }
    public NestedClass getNestedClass() {
        //可以直接new
        return new NestedClass();
    }
    class NestedClass {
        public String nestedClassName = "nestedClass's name";
        public void printOuterClassName() {
            //可以直接调用外部类的对象
            System.out.println(outerClassName);
        }
        public OuterClass getOuter() {
            //返回外部类实例
            return OuterClass.this;
        }
    }
    static class NestedStaticClass {
        public String nestedClassName = "NestedStaticClass's name";
        public static String staticString = "staticString";
        public void printOuterClassName() {
            //error 不可以直接调用外部类的对象
            //System.out.println(outerClassName);
        }
        //error 无法返回外部类实例
//        public OuterClass getOuter(){
//            return OuterClass.this;
//        }
    }
}
class Test{
    public static void main(String[] args) {
        //不允许直接通过new的方式创建OuterClass.NestedClass
        //OuterClass.NestedClass nestedClass1 = new OuterClass.NestedClass();
        //只能通过外部类的实例创建内部类
        OuterClass outerClass = new OuterClass();
        //通过方法返回内部类实例
        OuterClass.NestedClass nestedClass = outerClass.getNestedClass();
        //通过.new关键字
        OuterClass.NestedClass nestedClass1 = outerClass.new NestedClass();
        //通过内部类实例获取外部类实例
        System.out.println(nestedClass1.getOuter().outerClassName);
        nestedClass.printOuterClassName();
        String staticString = OuterClass.NestedStaticClass.staticString;
        OuterClass.NestedStaticClass nestedStaticClass = new OuterClass.NestedStaticClass();
        System.out.println(nestedStaticClass.nestedClassName);
    }
}

可见,Java的内部类“玩法比较多,完全写来下可以说是一个比较大的专题了,简要列举一下与C#的内部类的不同之处。


6.3 非静态内部类总结

外部类都无法访问内部类的的方法和属性,但Java的内部类可以访问外部类的方法和属性,C#的不可以,Java内外部类互相访问提供了“.New”和“.this"关键字。

创建内部类,new的对象不同,C#通过“new 外部类.内部类() ”方式创建,Java不允许这样,需要外部类的实例,即:”外部类实例.new 内部类()“。

除了上述的内部类定义方式,Java的内部类可以出现在外部类的方法、语句块中。

6.4 静态内部类总结

C#的静态类中不允许有非静态方法和成员属性,Java的静态内部类中可以有。

C#和Java的内部类可以直接通过“外部类.内部类”的方式访问,具体要考虑内部类对应的访问修饰符。

C#的内部类不允许被new出新实例,Java的可以。

Java通过直接的方式访问内部类,只允许访问静态方法和成员属性。通过new的方式产生的实例,即可以访问静态成员也可以访问非静态成员。但不建议通过这种方式访问静态成员。

6.5 其他

Java还可以通过内部类的方式实现匿名类、多重继承等。

Java8之后,一些情形可以通过lamda简化内部类的写法。


目录
相关文章
|
3月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
186 57
|
2月前
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
46 13
|
2月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
存储 缓存 Oracle
Java线程池,白话文vs八股文,原来是这么回事!
本文介绍了Java线程池的原理、实现方式及相关参数。首先,通过类比公司员工的方式解释了线程池的核心概念,如核心线程、最大线程数、任务队列和拒绝策略。接着,详细描述了线程池的任务处理流程,并提供了使用`ThreadPoolExecutor`和`Executors`创建线程池的代码示例,强调了`ThreadPoolExecutor`的灵活性和`Executors`的局限性。最后,总结了线程池的相关参数及不同类型的线程池实现,并附带常见面试题及其解答,帮助读者全面理解线程池的应用场景和优化方法。
51 4
|
2月前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
77 2
|
3月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
87 8
|
3月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
100 17
|
3月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
3月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
151 4
|
3月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
103 2