1. 包(Package)、命名空间(NameSpace)

1.1 概念

在Java中常用的是包(Package),较少提到NameSpace的概念。Java官方文档中这样说:

为了使类型更易于查找和使用,避免命名冲突并控制访问,程序员将相关类型的组捆绑到包中。

定义:包是一组提供访问保护和名称空间管理的相关类型。 请注意,类型是指类、接口、枚举和注释类型。 枚举和注解类型分别是特殊类型的类和接口,因此在本课中通常将类型简称为类和接口。

根据这里的概念,Package基本上是对应C#的NameSpace的。

无论是Java还是C#,每个类都有属于一个包/命名空间:

  • Java:
package cn.flylolo.entity;
public class Pig extends Animal{ }
  • C#:
namespace cn.flylolo.entity;
public class Pig : Animal{ }

1.2 命名规则

  • Java一般用域名倒序的方式来作为包名,多个单词用“.”分隔,同时这也对应着目录的层级关系。

  • C#中也可以用这样的规则来命名NameSpace,也见过这样的命名方式,但不强制;并且与目录也可以没有关联关系。

1.3 引用方式

  • Java引用包:
import cn.flylolo.entity.Pig;
  • C# 引用命名空间:
using cn.flylolo.entity.Pig;

C#的命名空间别名:若要引用同名的不同类,处理方式都是写全包/命名空间的名称。C#中觉得较长不美观可以在using的时候设置别名:

using entityPig = cn.flylolo.entity.Pig;

在代码中可以直接使用别名引用。

2.访问修饰符

上一节,Java的包与C#的命名空间类似,但针对访问修饰符,包又与C#的程序集类似。

C# Java 含义
public public 相同,访问不受限制。
protected C#,访问限于包含类或派生自包含类的类型。
private private 访问限于包含类。
internal或不添加修饰符 不添加修饰符 同一(包/程序集)可访问。
protected internal protected 相同,访问限于当前(包/程序集)或派生自包含类的类型。
private protected 访问限于包含类或当前程序集中派生自包含类的类型。 自 C# 7.2 之后可用。

3.类与文件

Java中,一个.java文件中,只允许有一个Public的类,并且文件名与此类名一般相同。

C#中则无上述限制。

4.继承,sealed与final

4.1 继承一个类或实现接口:

  • C#用“:" 符号。

  • Java继承类用extends关键字,实现接口用implements关键字。

4.2 不想让一个类被继承:

  • Java 用final关键字:
public final class Shape
  • C# 用sealed关键字:
public sealed class Shape

注意: JDK15的时候,Java也提供了sealed关键字,用于限制继承,例如下列代码

public sealed class Shape permits Circle, Square, Rectangle {
}

通过sealed+permits两个关键字,限制了子类只能是Circle, Square, Rectangle这三个。

5.Static

  • C#,有静态类和静态方法。

  • Java,有静态类和静态方法,但静态类只能是内部类,详见下一节。

6. 内部类、嵌套类

6.1 C#的内部类

C#的内部类比较简单,类似如下代码:

namespace cn.flylolo.nestedclass;

/**
* @author luozhichao
* @date 2021/10/15 17:50
*/
public class OuterClass
{
public String outerClassName = "outerClass's name"; public void printNestedClassName()
{
//无法直接调用内部类的变量
//Console.WriteLine(NestedClass.nestedClassName);
Console.WriteLine(NestedStaticClass.nestedClassName);
} public class NestedClass
{
public String nestedClassName = "nestedClass's name"; public void printOuterClassName()
{
//error 不可以直接调用外部类的对象
//Console.WriteLine(outerClassName);
} } public static class NestedStaticClass
{
public static String nestedClassName = "NestedStaticClass's name"; public static void printOuterClassName()
{
//error 不可以直接调用外部类的对象
//Console.WriteLine(outerClassName);
}
}
}
class Test
{
public static void main(String[] args)
{
OuterClass.NestedClass nestedClass = new OuterClass.NestedClass(); //可以直接调用静态内部类的方法。
string str = OuterClass.NestedStaticClass.nestedClassName; }
}

代码中做了一些注释,可以看到,对于非静态的内部类,外部类就像给其加了一层“命名空间”,可以通过new OuterClass.NestedClass()的方式进行创建。

对应静态内部类,可以通过OuterClass.NestedStaticClass的方式直接调用其方法和属性,当然这也由对应的访问修饰符决定,例如将NestedStaticClass设置为private,则OuterClass可以直接调用NestedStaticClass,而上例中的Main方法则无法调用NestedStaticClass了。

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简化内部类的写法。

【.Net vs Java? 】 看一看二者的类有多像?的更多相关文章

  1. 解密随机数生成器(二)——从java源码看线性同余算法

    Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...

  2. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  3. PHP笔记——java程序员看懂PHP程序

    PHP笔记——java程序员看懂PHP程序   php是一种服务器端脚本语言,类型松散的语言. <?php   ?>       xml风格 <script language=”ph ...

  4. 站在Java的角度看LinkedList

    站在Java的角度看,玩队列不就是玩对象引用对象嘛! public class LinkedList<E> implements List<E>, Deque<E> ...

  5. java初学者必看之构造方法详细解读

    java初学者必看之构造方法详细解读 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法. 格式 public 类名称(参数类型 参数名称){ 方法体 } 注 ...

  6. P1162_填涂颜色(JAVA语言)(速看!全洛谷最暴力解法!QAQ)

    思路:看了看数据n<=30,于是我们可以暴力求解(主要是BFS学的不咋地~2333).枚举每个0的位置,看上下左右四个方向上是否都有1.都有1的话说明被1包围,即在闭合圈的内部,开个数组标记一下 ...

  7. 瞧一瞧,看一看呐,用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!!

    瞧一瞧,看一看呐用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!! 现在要写的呢就是,用MVC和EF弄出一个CRUD四个页面和一个列表页面的一个快速DEMO,当然是在不 ...

  8. 2015年4月27日---C语言:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!

    ---恢复内容开始--- 题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful! 1.程序分析:字符共有256个.不同字符,图形不一样. 2.程序源代码: [code=c] #i ...

  9. Loj#6183. 看无可看

    Loj#6183. 看无可看 题目描述 首先用特征根求出通项公式\(A_n=p\cdot 3^n+q\cdot(-1)^n\).通过给定的\(f_0,f_1\)可以解出\(p,q\). 然后我们要求的 ...

  10. 看无可看 分治FFT+特征值方程

    题面: 看无可看(see.pas/cpp/c) 题目描述 “What’s left to see when our eyes won’t open?” “若彼此瞑目在即,是否终亦看无可看?” ---- ...

随机推荐

  1. Mybatis-技术专区-如何清晰的解决出现「多对一模型」和「一对多模型」的问题

    前提介绍 在mybatis如何进行多对一.一对多(一对一)的多表查询呢?本章带你认识如何非常顺滑的解决! 基础使用篇 一对一 association association通常用来映射一对一的关系,例 ...

  2. Robot framework随机文件

    *** Variables *** @{Example} One Two Three *** Test Cases *** Example ${value}= Evaluate random.choi ...

  3. 【Python机器学习实战】决策树与集成学习(六)——集成学习(4)XGBoost原理篇

    XGBoost是陈天奇等人开发的一个开源项目,前文提到XGBoost是GBDT的一种提升和变异形式,其本质上还是一个GBDT,但力争将GBDT的性能发挥到极致,因此这里的X指代的"Extre ...

  4. 知乎大佬图文并茂的epoll讲解,看不懂的去砍他

    select.poll.epoll的文章很多,自己也看过不少经典好文.不过第一次看到讲的如此通俗易懂.又图文并茂的.因此拿来分享下,供后续翻看学习. 原文链接:https://zhuanlan.zhi ...

  5. C语言实现任务调度与定时器

    代码实现是在xl2tpd的源码中get到的,感觉很有意思的一段代码.基本功能就是实现定时器,时间到后从定时队列中取出,然后完成指定的任务. 1. schedule.c代码(自己添加了main函数,用来 ...

  6. javaScript对象——function对象

    1.基本对象和Function(函数)方法对象 2.概念 3.创建function对象的三种方式: 第一种不建议使用 2.3两种方式就是方法名位置不同,建议使用: 4.方法调用只要名字对,实参不一定完 ...

  7. rune和byte在处理字符/字符串中的应用.

    rune和byte在处理字符/字符串中的应用. 定义: rune是int32的别名,-2147483648->2147483647,常用来表示UNICODE字符集,可以用来处理包含中文/非中文的 ...

  8. 谈谈raft fig8 —— 迷惑的提交条件和选举条件

    谈谈raft fig8 -- 迷惑的提交条件和选举条件 前言 这篇文章的思路其实在两个月前就已经成型了,但由于实习太累了,一直没来得及写出来.大概一个月前在群里和群友争论fig8的一些问题时,发现很多 ...

  9. Jetpack Compose学习(5)——从登录页美化开始学习布局组件使用

    原文:Jetpack Compose学习(5)--从登录页美化开始学习布局组件使用 | Stars-One的杂货小窝 本篇主要讲解常用的布局,会与原生Android的布局控件进行对比说明,请确保了解A ...

  10. str.strip(chars)

    strip会去除给定字符串的指定字符,指定字符可以是一个或多个,去除从左右分别进行,没有则忽略,如果需要去除某个中间的字符,必须先去除外围的字符 看几个例子,以s为例,故意设置为非对称结构, s = ...