java内部类

news/2024/4/28 4:36:13/文章来源:https://www.cnblogs.com/hjdcf/p/16632491.html

一、基本介绍

一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。是我们类的第五大成员

类的五大成员:属性、方法、构造器、代码块、内部类

内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系

基本语法:

class Outer{  //外部类class Inner{  //内部类}
}
class Other{ //外部其他类}

示意图:

基本代码演示:

// 外部其他类
public class InnerClass01 {public static void main(String[] args) {}
}
//外部类
class Outer{//属性private int n1 = 10;//构造器public Outer(int n1) {this.n1 = n1;}//方法public void m1(){System.out.println("m1() 方法");}//代码块{System.out.println("外部类代码块");}//内部类,在Outer类的内部class Inner{}
}

二、内部类的四大分类

基本说明:

定义在外部类局部位置上(比如方法内):

1、局部内部类(有类名)

2、匿名内部类(没有类名,开发中用的很多)

定义在外部类的成员位置上:

1、成员内部类(没有static修饰)

2、静态内部类(使用static修饰)

1、局部内部类

说明:局部内部类是定义在外部类的局部位置,比如说方法中,并且有类名。

1、可以直接访问外部类的所有成员,包含私有的

2、不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用 final 修饰,因为局部变量也可以使用 final

3、作用域:仅仅在定义它的方法或代码块中

4、局部内部类-----访问----->外部类成员 【访问方式:直接访问】

5、外部类-----访问----->局部内部类的成员【访问方式:创建对象,再访问(注意:必须再作用域内)】

6、外部其他类------不能访问-------->局部内部类(因为局部内部类地位是一个局部变量)

7、如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

原因:

示例代码:代码中的注释就是解释

public class LocalInnerClass {public static void main(String[] args) {Outer02 outer02 = new Outer02();outer02.m1();}
}class Outer02 {//属性private int n1 = 100;private int n2 = 1;//外部类的私有方法private void m2(){System.out.println("我是外部类的私有方法");}//方法public void m1(){//1、局部内部类是定义在外部类的局部位置,通常是在方法//3、不能添加访问修饰符(public、private等),但是可以用final修饰,但是修饰过后的内部类不允许被继承class Inner02{ //局部内部类(本质仍然是一个类)//内部类的成员变量,与外部类成员变量同名private int n1 = 20; //这个成员变量会最先被访问到,遵循就近原则//2、可以直接访问外部类的所有成员,包含私有public void f1(){ //属于局部内部类的方法System.out.println("内部类的n1 = " + n1); //输出的是内部类的成员变量的值,因为外部类和内部类的成员变量同名//由于同名的缘故,需要(外部类.this.属性)进行访问//那个类调用了m1这个方法,那么内部类的this指向就是指向调用了m1方法的类//这里是Outer02调用了m1方法,所以this指向的就是Outer02System.out.println("外部类的n1 = " + Outer02.this.n1);//直接访问外部类的私有成员System.out.println("外部类的n2 = " + n2);m2();//调用外部类的私有方法}}//final关键字修饰过后的内部类是不可以被继承的//内部类可继承其他内部类,但仅限于在它定义的方法和代码块中class Inner03 extends Inner02{}//4、外部类在方法中,可以创建内部类对象,然后调用方法即可Inner02 inner02 = new Inner02();//调用内部类的方法inner02.f1();}public void m3(){//代码块{//内部类中仍然可以定义内部类class Inner04{class Inner06{class Inner07{}}}//代码块中的内部类可以继承其他存在代码块的内部类class Inner05 extends Inner04{}}}
}

记住:

1、局部内部类定义在方法中、代码块中

2、作用域在方法体内或者代码块中

3、内部类的本质其实还是一个类,内部类中仍然可以定义内部类

2、匿名内部类(重点)

说明:

(1)本质还是一个类

(2)定义在一个类的内部,本质还是一个内部类

(3)该类没有名字,名字是由系统起的

(4)匿名内部类同时还是一个对象

匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名

1、匿名内部类的基本语法

new 类或接口(参数列表){类体
};

2、匿名内部类的语法比较奇特,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特征,因此可以调用匿名内部类方法

演示:

public class AnonymousInnerClassDetail {public static void main(String[] args) {Outer05 outer05 = new Outer05();outer05.f1();}
}class Outer05{private int n = 99;// Outer05 方法public void f1(){//第一种调用方法//创建一个基于类的匿名内部类Person p = new Person() {//重写 hi 方法@Overridepublic void hi() {System.out.println("匿名内部类重写了hi方法");}};p.hi(); //动态绑定//第二种调用方法new Person(){@Overridepublic void hi() {System.out.println("我是第二种调用方法");}}.hi();//匿名内部类传参new Person(){@Overridepublic void ok(String str) {System.out.println("重写ok方法,接收的参数是 " + str);}}.ok("outer05穿传参");}
}class Person{public void hi(){System.out.println("person say hi~");}public void ok(String str){System.out.println("person接收参数 " + str);}
}

3、可以直接访问外部类的所有成员,包含私有的

4、不能添加访问修饰符,因为它的地位就是一个局部变量

5、作用域:仅仅在定义它的方法或者代码块中

6、匿名内部类----访问----->外部类成员 [直接访问]

7、外部其他类----不能访问---->匿名内部类(因为匿名内部类地位是一个局部变量)

8、如果外部类和匿名内部类的成员重名是,内部类访问的话,遵循就近原则,如果想访问外部类其他成员,则可以使用(外部类名.this.成员)访问

使用匿名内部类的原因:

为了简化开发,当开发中遇到有一个类指向使用一次,后面不再使用,就是用匿名内部类的方式

基于接口的匿名内部类示例代码:

public class AnonymousInnerClass {public static void main(String[] args) {//基于接口的匿名内部类,简化开发Outer04 outer04 = new Outer04();outer04.method();}
}
class Outer04{ //外部类private int n1 = 10; //属性public void method(){ //方法//问题:tiger的编译类型 :接口类型IA//问题:tiger的运行类型:匿名内部类 Outer04$1/*匿名内部类底层:xxx 是底层分配的名: Outer04$1 系统分配的名字class xxx implements IA{@Overridepublic void cry() {System.out.println("老虎叫。。。");}}*/// jdk底层在创建匿名内部类 Outer04$1 ,立即马上创建了 Outer04$1 实例,并且把地址返回给tiger// 匿名内部类使用一次就不能再使用了,但是对象tiger可以使用IA tiger = new IA() {@Overridepublic void cry() {System.out.println("老虎叫。。。");}};System.out.println("tiger的运行类型---> " + tiger.getClass());tiger.cry();}
}
//接口
interface IA{public void cry();
}

基于类的匿名内部类示例代码:

public class AnonymousInnerClass {public static void main(String[] args) {//基于接口的匿名内部类,简化开发Outer04 outer04 = new Outer04();outer04.method();}
}
class Outer04{ //外部类private int n1 = 10; //属性public void method(){ //方法//基于类的匿名内部类//father的编译类型:Father//father的运行类型:Outer04$2 匿名内部类//底层会创建一个匿名内部类/*底层:class Outer04$2 extends Father{}*///同时也直接返回了匿名内部类 Outer04$2 的对象//参数列表会传递给Father的构造器Father father = new Father("tom") {//匿名内部类重写test方法@Overridepublic void test() {System.out.println("我重写了test方法");}};System.out.println("father对象的运行类型---> " + father.getClass());father.test();}
}//类
class Father{public Father(String name){//构造器System.out.println("Father的--name ==> " + name);}public void test(){ //方法}
}

基于抽象类的匿名内部类:

public class AnonymousInnerClass {public static void main(String[] args) {//基于接口的匿名内部类,简化开发Outer04 outer04 = new Outer04();outer04.method();}
}
class Outer04{ //外部类private int n1 = 10; //属性public void method(){ //方法//基于抽象类的匿名内部类Animal animal = new Animal() {//必须要实现抽象类中的抽象方法@Overridevoid eat() {System.out.println("我是抽象类中的抽象方法");}};animal.eat();}
}
//抽象类
abstract class Animal{abstract void eat();
}

练习一:

public class InnerClassExercise01 {public static void main(String[] args) {//接口当做实参进行传递,通过匿名内部类重写方法f1(new IL() {//这里重写了接口中的show方法,实现自己的逻辑@Overridepublic void show() {System.out.println("我是接口show方法的重写");}});//传统的写法//首先有一个实现了IL的实现类,再将这个类传入 f1 这个方法Pictrue pictrue = new Pictrue();f1(pictrue);}//静态方法,方法的参数是接口类型public static void f1(IL il){//调用接口的方法il.show();}
}
// 接口
interface IL{void show();
}//实现 IL的类
class Pictrue implements IL{@Overridepublic void show() {System.out.println("这是一幅名画。。。");}
}

练习二:

要求:

1、有一个铃声接口 Bell,里面有一个 ring 方法

2、有一个手机类 CellPhone,具有闹钟功能 alarmclock,参数是 Blee类型

3、测试手机类闹钟功能,通过匿名内部类(对象)作为参数,打印:闹钟响了

4、再传入另一个匿名内部类(对象),打印:上课了

实现代码:

public class InnerClassExercise02 {public static void main(String[] args) {//实例化手机CellPhone cellPhone = new CellPhone();//调用手机的闹钟功能并传入铃声接口,实现匿名内部类的接口方法cellPhone.alarmclock(new Bell() {@Overridepublic void ring() {System.out.println("闹钟响了");}});cellPhone.alarmclock(new Bell() {@Overridepublic void ring() {System.out.println("要上课了");}});}
}// 铃声接口
interface Bell{// ring 方法void ring();
}//手机类
class CellPhone{// 闹钟功能,参数是 Bell 类型public void alarmclock(Bell bell){//调用接口的 ring 方法bell.ring();}
}

3、成员内部类

基本介绍:

1、成员内部类是定义在外部类的成员位置,并且没有static修饰,可以直接访问外部类的所有成员,包含私有的

2、成员内部类可以添加任一访问修饰符(public、protected、默认、private),因为它的地位就是一个成员

示例代码:

public class MemberInnerClass01 {public static void main(String[] args) {Outer08 outer08 = new Outer08();outer08.m1();}
}
class Outer08{private int n1 = 100;public String name = "tom";//可以用修饰符进行修饰/*public*/ /*protected*/ /*private*/ class Inner08{public void say(){System.out.println("Outer08的 n1 = " + n1 +" Outer08的 name = " + name);}}//在Outer08的 m1 方法中,实例化成员内部类 Inner08public void m1(){Inner08 inner08 = new Inner08();//调用成员内部类的 say 方法inner08.say();}
}

3、作用域和外部类的成员一样,为整个类体,比如之前的案例,在外部类的成员方法中创建成员内部类对象,再调用方法

4、成员内部类----访问---->外部类(比如属性)[访问方式:直接访问]

public class MemberInnerClass01 {public static void main(String[] args) {Outer08 outer08 = new Outer08();outer08.m1();}
}
class Outer08{//私有方法private void hi(){System.out.println("我是外部类的私有方法  hi()");}class Inner08{//内部类方法public void say(){//调用外部类的私有方法,直接调用hi();}}//在Outer08的 m1 方法中,实例化成员内部类 Inner08public void m1(){Inner08 inner08 = new Inner08();//调用成员内部类的 say 方法inner08.say();}
}

5、外部类-----访问---->内部类(说明)[访问方式:创建对象,再访问]

6、外部其他类---->访问----成员内部类

public class MemberInnerClass01 {public static void main(String[] args) {Outer08 outer08 = new Outer08();// outer08.m1();//外部其他类调用成员内部类的三种方式//第一种方式Outer08.Inner08 inner08 = outer08.new Inner08(); //new Outer08().new Inner08();inner08.say();//第二种方式   在外部类中编写一个方法,返回Inner08对象实例Outer08.Inner08 getInner08 = outer08.getInner08();getInner08.say();}
}
class Outer08{//私有方法private void hi(){System.out.println("我是外部类的私有方法  hi()");}class Inner08{public void say(){//调用外部类的私有方法,直接调用hi();}}//方式二public Inner08 getInner08(){return new Inner08();}//在Outer08的 m1 方法中,实例化成员内部类 Inner08public void m1(){Inner08 inner08 = new Inner08();//调用成员内部类的 say 方法inner08.say();}
}

7、如果外部类和内部类的成员重名时,内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,可以使用(外部类.this.成员)去访问

public class MemberInnerClass01 {public static void main(String[] args) {Outer08 outer08 = new Outer08();outer08.m1();}
}
class Outer08{private int n1 = 100;class Inner08{private int n1 = 6;public void say(){//就近原则System.out.println("n1的值是内部类的n1 = " + n1);//访问外部类重名的属性System.out.println("外部类n1的值 = " + Outer08.this.n1);}}//在Outer08的 m1 方法中,实例化成员内部类 Inner08public void m1(){Inner08 inner08 = new Inner08();//调用成员内部类的 say 方法inner08.say();}
}

4、静态内部类

说明:静态内部类是定义在外部类的成员位置,并且有static修饰

1、可以直接访问外部类的所有静态成员,包含私有的,但是不能直接访问非静态成员

2、可以添加任一访问修饰符(public、protected、默认、private),因为它的地位就是一个成员

3、作用域:同其他的成员一样,为整个类体

示例代码:

public class StaticInnerClass01 {public static void main(String[] args) {Outer09 outer09 = new Outer09();outer09.show();}
}
class Outer09{private int n1 = 10;private static String name = "张三";//1、放在外部类的成员位置//2、使用static修饰//4、可以添加任一访问修饰符(public、protected、默认、private),因为它的地位就是一个成员/*public*/ /*private*/ /*protected*/ static class Inner02{public void say(){//3、可以直接访问外部类的所有静态成员,包含私有的,但是不能直接访问非静态成员System.out.println("访问外部类静态成员属性:" + name);//不能直接访问外部类的非静态成员//System.out.println("外部类非静态成员属性:" + n1);}}//5、作用域:同其他的成员一样,为整个类体//外部类方法public void show(){//外部类使用内部类new Inner02().say();}
}

4、静态内部类----访问----外部类(比如:静态属性)[访问方式:直接访问所有静态成员]

5、外部类----访问----静态内部类 [访问方式:创建对象,再访问]

6、外部其他类-----访问----->静态内部类

public class StaticInnerClass01 {public static void main(String[] args) {Outer09 outer09 = new Outer09();outer09.show();//外部其他类访问静态内部类//方式一  因为静态内部类,是可以通过类名直接访问(前提是满足访问权限)Outer09.Inner02 getInner02 = new Outer09.Inner02();getInner02.say();//方式二 通过编写一个方法,返回静态内部类的对象实例Outer09.Inner02 inner021 = outer09.getInner02();inner021.say();}
}
class Outer09{private int n1 = 10;private static String name = "张三";//外部类静态方法private static void f1(){System.out.println("我是外部类静态方法 f1()");}//1、放在外部类的成员位置//2、使用static修饰//4、可以添加任一访问修饰符(public、protected、默认、private),因为它的地位就是一个成员/*public*/ /*private*/ /*protected*/ static class Inner02{public void say(){//3、可以直接访问外部类的所有静态成员,包含私有的,但是不能直接访问非静态成员System.out.println("访问外部类静态成员属性:" + name);//不能直接访问外部类的非静态成员//System.out.println("外部类非静态成员属性:" + n1);//可以直接调用外部类静态方法f1();}}//5、作用域:同其他的成员一样,为整个类体//外部类方法public void show(){//外部类使用内部类new Inner02().say();}//方式二 返回静态内部类的对象实例public Inner02 getInner02(){return new Inner02();}
}

7、如果外部类和静态内部类的成员重名时,静态内部类访问时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类.成员)去访问

public class StaticInnerClass01 {public static void main(String[] args) {Outer09 outer09 = new Outer09();outer09.show();}
}
class Outer09{private static String name = "张三";static class Inner02{//内部类的静态属性private static String name = "李四";public void say(){//就近原则System.out.println("我是内部类的静态成员变量:" + name);System.out.println("外部类的静态成员变量:" + Outer09.name);}}//5、作用域:同其他的成员一样,为整个类体//外部类方法public void show(){//外部类使用内部类new Inner02().say();}}

三、小结

1、内部类有四种

局部内部类、匿名内部类(重要)、成员内部类、静态内部类

2、重点还是掌握匿名内部类的使用

语法:

new 类/接口(参数列表){//....
};

3、成员内部类、静态内部类 是放在外部类的成员位置,本质上还是一个成员

练习:

public class TestInnerClass01 {public static void main(String[] args) {TestInner testInner = new TestInner();TestInner.Inner inner = testInner.new Inner();System.out.println("main方法中的值:" + inner.a);}
}class TestInner{public TestInner(){Inner inner01 = new Inner();inner01.a = 10;Inner inner02 = new Inner();System.out.println("外部类的test方法中的值:" + inner02.a);}class Inner{public int a = 5;}
}

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

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

相关文章

redis主从数据同步原理

what:redis高可用:1、数据尽量不丢失;2、尽可能的提供服务;栗子:AOF 和 RDB 保证了数据持久化尽量不丢失;主从复制就是增加副本,一份数据保存到多个实例上。即使有一个实例宕机,其他实例依然可以持续服务;主从:复制——为单向的,即:只能从主复制到从;读写指责——…

Linux驱动开发十六.input系统——2.input_event

我们上一章完成了input子系统的设备构成,并且在用户空间通过hexdump命令拿到了一堆不知道是什么的信息。今天我们就要借助input_event这个结构体来了解内核怎么通过那个结构体了解输入事件。 可能有心人已经发现了,上一章我们在加载完模块以后在/dev/input路径下生成了一个新…

(0828)【vivado版本-对仿真工具版本要求】

(1)https://blog.csdn.net/Alonger1988/article/details/120506385 vivado,vsim版本兼容问题 (2)版本匹配:http://dengkanwen.com/567.html

Ingress

为什么需要Ingress Service是基于四层TCP和UDP协议转发的,而Ingress可以基于七层的HTTP和HTTPS协议转发,可以通过域名和路径做到更细粒度的划分,如下图所示。 图1 Ingress-ServiceIngress工作机制 要想使用Ingress功能,必须在Kubernetes集群上安装Ingress Controller。Ingr…

Rayman Mini for Mac(雷曼迷你跑酷游戏)中文

Rayman Mini for Mac是一款运行在MacOS平台上的经典跑酷类游戏,玩家在Rayman Mini可以看到经典的传统角色,与玩家一起在世界中探险,还有超多全新的角色出现。游戏包含动作横向跑酷和剧情解谜探索为一体,呈现了一个别样的世界。 详情:Rayman Mini for Mac(雷曼迷你游戏) 游…

Java09-继承,抽象类

继承:就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接 访问父类中的非私有的属性和行为。父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意…

IDEA配置方法注释

之前配置过,但是忘记了,再次记录下. IDEA版本(IntelliJ IDEA 2019.3.1 x64)类注释如下位置配置,创建类时自动生成注释.点击查看代码 /** * ${NAME} * *@author ${USER} *@version 1.0 *${DATE} ${TIME} **/效果如下:方法注释 如下位置建立tempalte group.1.新增add,这里add可以…

程序设计大赛

一开始可以分清楚板块1.背景2.基本功能介绍 + 难点功能 可以里面的内容串起来3.重难点+亮点 分清楚,难点,亮点 我们答辩时间是10分钟,背景大概是1分半,首先是整个系统爬取数据,经行一个总的说明,构建情况然后我是通过一首诗来进行串的,从知人论事开始说起,知人就…

ansible 001 ansible介绍 原理

ansible 自动化运维 ansible 部署应用程序 (在操作系统层面之上) 系统初始化过程 主机名,yun源,网络,服务,时间同步,内核参数 (可以在pxe这里完成) ansible可以方便100多台服务器来变更,不至于pxe重新安装 PXE 预启动的执行环境 PXE (Pre-boot Execution Enviro…

使用小乌龟来更新代码-02

小乌龟更新代码使用的是pull 右击项目文件,TortoiseGit--->pull来更新代码,从远程仓库拉取最新的代码,拉取后。 点击OK 然后点击Pulled Diff,点击Show log看看当前版本和最新版本相比哪里有修改,是否有冲突: 例如,我把一个压缩文件给删除了,还有修改了Default里的一…

【Prometheus+Grafana系列】监控MySQL服务

前言 前面的一篇文章已经介绍了 docker-compose 搭建 Prometheus + Grafana 服务。当时实现了监控服务器指标数据,是通过 node_exporter。Prometheus 还可用来监控很多服务,比如常见的 MySQL。本文就介绍如何通过 mysqld_exporter 来监控 MySQL 指标。 下载安装包 cd /opt w…

CrystalDiskMark 磁盘读写性能测试 All In One

CrystalDiskMark 磁盘读写性能测试 All In OneCrystalDiskMark 磁盘读写性能测试 All In One https://crystalmark.info/en/software/crystaldiskmark/macOS ❌ 不支持 Windows 系统 ✅ 支持 U盘,移动固态硬盘,硬盘refs©xgqfrms 2012-2020www.cnblogs.com/xgqfrms 发布文…

彻底理解线程

操作系统支持多个应用程序同时执行,每个应用至少对应一个进程,彼此之间的操作和数据不受干扰。当一个进程需要磁盘IO的时候,CPU就切换到另外的进程,提高了CPU利用率。有了进程,为什么还要线程?因为进程的成本太高了。启动新的进程必须分配独立的内存空间,建立数据表维护…

软件质量保障流程

一. 软件质量保障流程 1.1 微服务产品的特点 微服务架构下,一个大型复杂软件系统不再是一个单体,而是一系列相互独立的微服务,特点鲜明:每个服务独立,开发技术栈独立 每个服务可以独立开发、部署、发布 服务之间通过轻量级通信机制沟通,常用的是 RESTful APIMicro Servic…

JavaScript实现栈结构(Stack)

Js实现栈结构 一、前言 1.1 什么是数据结构 数据结构就是在计算机中,存储和组织数据的方式。 例如:图书管理,怎样摆放图书才能既能放很多书,也方便取? 常见的数据结构:栈(Stack) 队列(Queue) 链表(Linked List) 集合(Set) 哈希(Hash) 树(Tree) 图(Graph)1.…

Jenkins设置中文

Jenkins是一个持续集成的平台,但是初次安装Jenkins之后,是英文的状态。下面给大家介绍如何将Jenkins设置为中文语言。一、下载Locale插件1点击【Manage Jenkins】选项。2点击【Manage Plugins】选项。 点击【可选插件】选项。 右侧搜索栏输入【Locale】选项。 勾选【插件选项…

URL重定向及绕过方法

1 概述 URL重定向漏洞也称URL任意跳转漏洞,是由于网站信任了用户的输入导致恶意跳转。URL重定向主要用来钓鱼,比如URL跳转中最常见的跳转在登录口、支付口,也就是一旦登录将会跳转任意自己构造的网站,如果设置成指定的URL,则会造成钓鱼等危害。 2 详情 2.1 跳转常用参数 在…

js删除css样式

js删除css样式_百度知道 https://zhidao.baidu.com/question/680409425108037292.html1、如果使用class加的样式的话,可以使用document.getElementById("objid").className=""来清空样式;  2、如果是直接加的style="***"属性的话,可以使用…

ArcGIS API forJavaScript4.x去除地图获取焦点的黑色边框

ArcGIS API forJavaScript4.x去除地图获取焦点的黑色边框CSS /* 去掉地图聚焦边框 */ .esri-view-surface--inset-outline:focus::after {outline: none !important; }箴言:因为这些东西是非常简单的。不要抱怨自己学不会,那是因为你没有足够用心。

NetCDF库编译安装

1. 准备 系统环境,全部是deepin系统自带,并无单独安装deepin 20.6 gcc 8.3.0 g++ 8.3.0 cmake 3.22.1 netcdf安装版本:此次使用最新4.9.0,系统为deepin 20.6,大于4.3.0 源码下载地址,下载netcdf-c-4.9.0.tar.gz: https://downloads.unidata.ucar.edu/netcdf/ netCDF-C S…