当前位置: 首页 > 编程日记 > 正文

「Java基本功」一文读懂Java内部类的用法和原理

内部类初探

一、什么是内部类?

内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类

二、内部类的共性

(1)内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。

(2)内部类不能用普通的方式访问。

(3)内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。

(4)外部类不能直接访问内部类的的成员,但可以通过内部类对象来访问

内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。

因为当某个外围类的对象创建内部类的对象时,此内部类会捕获一个隐式引用,它引用了实例化该内部对象的外围类对象。通过这个指针,可以访问外围类对象的全部状态。

通过反编译内部类的字节码,分析之后主要是通过以下几步做到的:

1 编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象的引用;

2 编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值;

3 在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用。

二、使用内部类的好处:

静态内部类的作用:

1 只是为了降低包的深度,方便类的使用,静态内部类适用于包含类当中,但又不依赖与外在的类。

2 由于Java规定静态内部类不能用使用外在类的非静态属性和方法,所以只是为了方便管理类结构而定义。于是我们在创建静态内部类的时候,不需要外部类对象的引用。

非静态内部类的作用:

1 内部类继承自某个类或实现某个接口,内部类的代码操作创建其他外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。

2 使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响

3 如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。 从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了"多重继承"。

三、 那静态内部类与普通内部类有什么区别呢?问得好,区别如下:

(1)静态内部类不持有外部类的引用 在普通内部类中,我们可以直接访问外部类的属性、方法,即使是private类型也可以访问,这是因为内部类持有一个外部类的引用,可以自由访问。而静态内部类,则只可以访问外部类的静态方法和静态属性(如果是private权限也能访问,这是由其代码位置所决定的),其他则不能访问。

(2)静态内部类不依赖外部类 普通内部类与外部类之间是相互依赖的关系,内部类实例不能脱离外部类实例,也就是说它们会同生同死,一起声明,一起被垃圾回收器回收。而静态内部类是可以独立存在的,即使外部类消亡了,静态内部类还是可以存在的。

(3)普通内部类不能声明static的方法和变量 普通内部类不能声明static的方法和变量,注意这里说的是变量,常量(也就是final static修饰的属性)还是可以的,而静态内部类形似外部类,没有任何限制。

==为什么普通内部类不能有静态变量呢?==

1 成员内部类 之所以叫做成员 就是说他是类实例的一部分 而不是类的一部分

2 结构上来说 他和你声明的成员变量是一样的地位 一个特殊的成员变量 而静态的变量是类的一部分和实例无关

3 你若声明一个成员内部类 让他成为主类的实例一部分 然后又想在内部类声明和实例无关的静态的东西 你让JVM情何以堪啊

4 若想在内部类内声明静态字段 就必须将其内部类本身声明为静态

非静态内部类有一个很大的优点:可以自由使用外部类的所有变量和方法

下面的例子大概地介绍了

1 非静态内部类和静态内部类的区别。

2 不同访问权限的内部类的使用。

3 外部类和它的内部类之间的关系

  1. //本节讨论内部类以及不同访问权限的控制

  2. //内部类只有在使用时才会被加载。

  3. //外部类B

  4. public class B{

  5.    int i = 1;

  6.    int j = 1;

  7.    static int s = 1;

  8.    static int ss = 1;

  9.    A a;

  10.    AA aa;

  11.    AAA aaa;

  12.    //内部类A

  13.    public class A {

  14. //        static void go () {

  15. //

  16. //        }

  17. //        static {

  18. //

  19. //        }

  20. //      static int b = 1;//非静态内部类不能有静态成员变量和静态代码块和静态方法,

  21.        // 因为内部类在外部类加载时并不会被加载和初始化。

  22.        //所以不会进行静态代码的调用

  23.        int i = 2;//外部类无法读取内部类的成员,而内部类可以直接访问外部类成员

  24.        public void test() {

  25.            System.out.println(j);

  26.            j = 2;

  27.            System.out.println(j);

  28.            System.out.println(s);//可以访问类的静态成员变量

  29.        }

  30.        public void test2() {

  31.            AA aa = new AA();

  32.            AAA aaa = new AAA();

  33.        }

  34.    }

  35.    //静态内部类S,可以被外部访问

  36.    public static class S {

  37.        int i = 1;//访问不到非静态变量。

  38.        static int s = 0;//可以有静态变量

  39.        public static void main(String[] args) {

  40.            System.out.println(s);

  41.        }

  42.        @Test

  43.        public void test () {

  44. //            System.out.println(j);//报错,静态内部类不能读取外部类的非静态变量

  45.            System.out.println(s);

  46.            System.out.println(ss);

  47.            s = 2;

  48.            ss = 2;

  49.            System.out.println(s);

  50.            System.out.println(ss);

  51.        }

  52.    }

  53.    //内部类AA,其实这里加protected相当于default

  54.    //因为外部类要调用内部类只能通过B。并且无法直接继承AA,所以必须在同包

  55.    //的类中才能调用到(这里不考虑静态内部类),那么就和default一样了。

  56.    protected class AA{

  57.        int i = 2;//内部类之间不共享变量

  58.        public void test (){

  59.            A a = new A();

  60.            AAA aaa = new AAA();

  61.            //内部类之间可以互相访问。

  62.        }

  63.    }

  64.    //包外部依然无法访问,因为包没有继承关系,所以找不到这个类

  65.    protected static class SS{

  66.        int i = 2;//内部类之间不共享变量

  67.        public void test (){

  68.            //内部类之间可以互相访问。

  69.        }

  70.    }

  71.    //私有内部类A,对外不可见,但对内部类和父类可见

  72.    private class AAA {

  73.        int i = 2;//内部类之间不共享变量

  74.        public void test() {

  75.            A a = new A();

  76.            AA aa = new AA();

  77.            //内部类之间可以互相访问。

  78.        }

  79.    }

  80.    @Test

  81.    public void test(){

  82.        A a = new A();

  83.        a.test();

  84.        //内部类可以修改外部类的成员变量

  85.        //打印出 1 2

  86.        B b = new B();

  87.    }

  88. }

  89. //另一个外部类

  90. class C {

  91.    @Test

  92.    public void test() {

  93.        //首先,其他类内部类只能通过外部类来获取其实例。

  94.        B.S s = new B.S();

  95.        //静态内部类可以直接通过B类直接获取,不需要B的实例,和静态成员变量类似。

  96.        //B.A a = new B.A();

  97.        //当A不是静态类时这行代码会报错。

  98.        //需要使用B的实例来获取A的实例

  99.        B b = new B();

  100.        B.A a = b.new A();

  101.        B.AA aa = b.new AA();//B和C同包,所以可以访问到AA

  102. //      B.AAA aaa = b.new AAA();AAA为私有内部类,外部类不可见

  103.        //当A使用private修饰时,使用B的实例也无法获取A的实例,这一点和私有变量是一样的。

  104.        //所有普通的内部类与类中的一个变量是类似的。静态内部类则与静态成员类似。

  105.    }

  106. }

内部类的加载

可能刚才的例子中没办法直观地看到内部类是如何加载的,接下来用例子展示一下内部类加载的过程。

1 内部类是延时加载的,也就是说只会在第一次使用时加载。不使用就不加载,所以可以很好的实现单例模式。

2 不论是静态内部类还是非静态内部类都是在第一次使用时才会被加载。

3 对于非静态内部类是不能出现静态模块(包含静态块,静态属性,静态方法等)

4 非静态类的使用需要依赖于外部类的对象,详见上述对象innerClass 的初始化。

简单来说,类的加载都是发生在类要被用到的时候。内部类也是一样

1 普通内部类在第一次用到时加载,并且每次实例化时都会执行内部成员变量的初始化,以及代码块和构造方法。

2 静态内部类也是在第一次用到时被加载。但是当它加载完以后就会将静态成员变量初始化,运行静态代码块,并且只执行一次。当然,非静态成员和代码块每次实例化时也会执行。

总结一下Java类代码加载的顺序,万变不离其宗。

规律一、初始化构造时,先父后子;只有在父类所有都构造完后子类才被初始化

规律二、类加载先是静态、后非静态、最后是构造函数。

静态构造块、静态类属性按出现在类定义里面的先后顺序初始化,同理非静态的也是一样的,只是静态的只在加载字节码时执行一次,不管你new多少次,非静态会在new多少次就执行多少次

规律三、java中的类只有在被用到的时候才会被加载

规律四、java类只有在类字节码被加载后才可以被构造成对象实例

成员内部类

在方法中定义的内部类称为局部内部类。与局部变量类似,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。

需要注意的是: 局部内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。

  1. public class 局部内部类 {

  2.    class A {//局部内部类就是写在方法里的类,只在方法执行时加载,一次性使用。

  3.        public void test() {

  4.            class B {

  5.                public void test () {

  6.                    class C {

  7.                    }

  8.                }

  9.            }

  10.        }

  11.    }

  12.    @Test

  13.    public void test () {

  14.        int i = 1;

  15.        final int j = 2;

  16.        class A {

  17.            @Test

  18.            public void test () {

  19.                System.out.println(i);

  20.                System.out.println(j);

  21.            }

  22.        }

  23.        A a = new A();

  24.        System.out.println(a);

  25.    }

  26.    static class B {

  27.        public static void test () {

  28.            //static class A报错,方法里不能定义静态内部类。

  29.            //因为只有在方法调用时才能进行类加载和初始化。

  30.        }

  31.    }

  32. }

匿名内部类

简单地说:匿名内部类就是没有名字的内部类,并且,匿名内部类是局部内部类的一种特殊形式。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的: 只用到类的一个实例。 类在定义后马上用到。 类非常小(SUN推荐是在4行代码以下) 给类命名并不会导致你的代码更容易被理解。 在使用匿名内部类时,要记住以下几个原则:

1  匿名内部类不能有构造方法。

2  匿名内部类不能定义任何静态成员、方法和类。

3  匿名内部类不能是public,protected,private,static。

4  只能创建匿名内部类的一个实例。

5 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

6  因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

一个匿名内部类的例子:

  1.    public class 匿名内部类 {

  2. }

  3. interface D{

  4.    void run ();

  5. }

  6. abstract class E{

  7.    E (){

  8.    }

  9.    abstract void work();

  10. }

  11. class A {

  12.        @Test

  13.        public void test (int k) {

  14.            //利用接口写出一个实现该接口的类的实例。

  15.            //有且仅有一个实例,这个类无法重用。

  16.            new Runnable() {

  17.                @Override

  18.                public void run() {

  19. //                    k = 1;报错,当外部方法中的局部变量在内部类使用中必须改为final类型。

  20.                    //因为方外部法中即使改变了这个变量也不会反映到内部类中。

  21.                    //所以对于内部类来讲这只是一个常量。

  22.                    System.out.println(100);

  23.                    System.out.println(k);

  24.                }

  25.            };

  26.            new D(){

  27.                //实现接口的匿名类

  28.                int i =1;

  29.                @Override

  30.                public void run() {

  31.                    System.out.println("run");

  32.                    System.out.println(i);

  33.                    System.out.println(k);

  34.                }

  35.            }.run();

  36.            new E(){

  37.                //继承抽象类的匿名类

  38.                int i = 1;

  39.                void run (int j) {

  40.                    j = 1;

  41.                }

  42.                @Override

  43.                void work() {

  44.                }

  45.            };

  46.        }

  47. }

匿名内部类里的final

使用的形参为何要为final

参考文件:http://android.blog.51cto.com/268543/384844

我们给匿名内部类传递参数的时候,若该形参在内部类中需要被使用,那么该形参必须要为final。也就是说:当所在的方法的形参需要被内部类里面使用时,该形参必须为final。

为什么必须要为final呢?

首先我们知道在内部类编译成功后,它会产生一个class文件,该class文件与外部类并不是同一class文件,仅仅只保留对外部类的引用。当外部类传入的参数需要被内部类调用时,从java程序的角度来看是直接被调用:

  1. public class OuterClass {

  2.    public void display(final String name,String age){

  3.        class InnerClass{

  4.            void display(){

  5.                System.out.println(name);

  6.            }

  7.        }

  8.    }

  9. }

从上面代码中看好像name参数应该是被内部类直接调用?其实不然,在java编译之后实际的操作如下:

  1. public class OuterClass$InnerClass {

  2.    public InnerClass(String name,String age){

  3.        this.InnerClass$name = name;

  4.        this.InnerClass$age = age;

  5.    }

  6.    public void display(){

  7.        System.out.println(this.InnerClass$name + "----" + this.InnerClass$age );

  8.    }

  9. }

所以从上面代码来看,内部类并不是直接调用方法传递的参数,而是利用自身的构造器对传入的参数进行备份,自己内部方法调用的实际上时自己的属性而不是外部方法传递进来的参数。

直到这里还没有解释为什么是final

在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类中我对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的。

毕竟站在程序的角度来看这两个根本就是同一个,如果内部类该变了,而外部方法的形参却没有改变这是难以理解和不可接受的,所以为了保持参数的一致性,就规定使用final来避免形参的不改变。

简单理解就是,拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变。

故如果定义了一个匿名内部类,并且希望它使用一个其外部定义的参数,那么编译器会要求该参数引用是final的。

内部类初始化

我们一般都是利用构造器来完成某个实例的初始化工作的,但是匿名内部类是没有构造器的!那怎么来初始化匿名内部类呢?使用构造代码块!利用构造代码块能够达到为匿名内部类创建一个构造器的效果。

  1. public class OutClass {

  2.    public InnerClass getInnerClass(final int age,final String name){

  3.        return new InnerClass() {

  4.            int age_ ;

  5.            String name_;

  6.            //构造代码块完成初始化工作

  7.            {

  8.                if(0 < age && age < 200){

  9.                    age_ = age;

  10.                    name_ = name;

  11.                }

  12.            }

  13.            public String getName() {

  14.                return name_;

  15.            }

  16.            public int getAge() {

  17.                return age_;

  18.            }

  19.        };

  20.    }

内部类的重载

如果你创建了一个内部类,然后继承其外围类并重新定义此内部类时,会发生什么呢?也就是说,内部类可以被重载吗?这看起来似乎是个很有用的点子,但是“重载”内部类就好像它是外围类的一个方法,其实并不起什么作用:

  1. class Egg {

  2.       private Yolk y;

  3.       protected class Yolk {

  4.              public Yolk() {

  5.                     System.out.println("Egg.Yolk()");

  6.              }

  7.       }

  8.       public Egg() {

  9.              System.out.println("New Egg()");

  10.              y = new Yolk();

  11.       }

  12. }

  13. public class BigEgg extends Egg {

  14.       public class Yolk {

  15.              public Yolk() {

  16.                     System.out.println("BigEgg.Yolk()");

  17.              }

  18.       }

  19.       public static void main(String[] args) {

  20.              new BigEgg();

  21.       }

  22. }

  23. 复制代码

  24. 输出结果为:

  25. New Egg()

  26. Egg.Yolk()

缺省的构造器是编译器自动生成的,这里是调用基类的缺省构造器。你可能认为既然创建了BigEgg 的对象,那么所使用的应该是被“重载”过的Yolk,但你可以从输出中看到实际情况并不是这样的。 这个例子说明,当你继承了某个外围类的时候,内部类并没有发生什么特别神奇的变化。这两个内部类是完全独立的两个实体,各自在自己的命名空间内。

内部类的继承

因为内部类的构造器要用到其外围类对象的引用,所以在你继承一个内部类的时候,事情变得有点复杂。问题在于,那个“秘密的”外围类对象的引用必须被初始化,而在被继承的类中并不存在要联接的缺省对象。要解决这个问题,需使用专门的语法来明确说清它们之间的关联:

  1. class WithInner {

  2.        class Inner {

  3.                Inner(){

  4.                        System.out.println("this is a constructor in WithInner.Inner");

  5.                };

  6.        }

  7. }

  8. public class InheritInner extends WithInner.Inner {

  9.        // ! InheritInner() {} // Won't compile

  10.        InheritInner(WithInner wi) {

  11.                wi.super();

  12.                System.out.println("this is a constructor in InheritInner");

  13.        }

  14.        public static void main(String[] args) {

  15.                WithInner wi = new WithInner();

  16.                InheritInner ii = new InheritInner(wi);

  17.        }

  18. }

输出结果为: this is a constructor in WithInner.Inner this is a constructor in InheritInner

可以看到,InheritInner 只继承自内部类,而不是外围类。但是当要生成一个构造器时,缺省的构造器并不算好,而且你不能只是传递一个指向外围类对象的引用。此外,你必须在构造器内使用如下语法: enclosingClassReference.super(); 这样才提供了必要的引用,然后程序才能编译通过。

有关匿名内部类实现回调,事件驱动,委托等机制的文章将在下一节讲述。

转载于:https://www.cnblogs.com/xll1025/p/10252882.html

相关文章:

从一致性hash到ceph crush算法演进图谱(持续更新)

参考文档&#xff1a; https://ceph.com/wp-content/uploads/2016/08/weil-crush-sc06.pdf Ceph剖析&#xff1a;数据分布之CRUSH算法与一致性Hash

[原]unity3d之http多线程异步资源下载

郑重声明&#xff1a;转载请注明出处 U_探索 本文诞生于乐元素面试过程&#xff0c;被面试官问到AssetBundle多线程异步下载时&#xff0c;愣了半天&#xff0c;同样也被深深的鄙视一回&#xff08;做了3年多u3d 这个都没用过&#xff09;&#xff0c;所以发誓要实现出来填补一…

android首页图片轮播效果,Android_Android自动播放Banner图片轮播效果,先看一下效果图支持本地图 - phpStudy...

Android自动播放Banner图片轮播效果先看一下效果图支持本地图片以及网络图片or本地网络混合。使用方式&#xff1a;android:id"id/banner"android:layout_width"match_parent"android:layout_height"230dip">核心代码&#xff1a;int length …

mongodb 入门

在NOSQL的多个数据库版本中,mongodb相对比较成熟,把学mongodb笔记整理在这&#xff0c;方便以后回顾。这笔记预计分三部分&#xff1a; 一&#xff0c;基础操作&#xff0c;二、增删改查详细操作&#xff0c;三、高级应用。一、在linux在安装mongodb&#xff0c;在linux下安装m…

springboot 学习笔记(三)

&#xff08;三&#xff09;用jar包启动springboot项目 1、首先需要在pom文件中添加依赖&#xff0c;spring-boot-starter-parent包含有打包的默认配置&#xff0c;如果要修改的话要可以进行重新定义&#xff0c;具体内容参考https://docs.spring.io/spring-boot/docs/2.1.1.RE…

搜索:深搜/广搜 获取岛屿数量

题目描述&#xff1a; 用一个二维数组代表一张地图&#xff0c;这张地图由字符“0”与字符“1”组 成&#xff0c;其中“0”字符代表水域&#xff0c;“1”字符代表小岛土地&#xff0c;小岛“1”被 水“0”所包围&#xff0c;当小岛土地“1”在水平和垂直方向相连接时&#xf…

2.4.4.1、Django新建APP(acounts)

$django-admin.py startapp accounts 在oss/accounts修改forms.py(新建)和views.py如下&#xff1a; 注&#xff1a;绿字部分为注释 views.py ################################################################ #codingutf-8 from django.core.urlresolvers import reverse f…

vue html引入资源dev下404,webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)...

最近在使用webpack vue做个人娱乐项目时&#xff0c;发现npm run build后&#xff0c;css js img静态资源文件均找不到路径&#xff0c;报404错误。。。网上查找了一堆解决办法&#xff0c;总结如下一、首先修改config目录下的index.js文件将其中build的配置项assetsPublicPat…

解决.net webservice的WebClient或HttpWebRequest首次连接缓慢问题

【编程环境】Visual Studio 2010, NET4.0 【开发语言】C#, 理论上VB.NET等依赖.NET Framework框架的语言均受此影响 【问题描述】 使用HttpWebRequest抓取网页内容,但首次请求总是莫名奇妙的阻塞在Request.GetResponse();上,不过一旦这次请求成功&#xff0c;后续的操作就很快了…

2019-1-11

unique的使用&#xff1a; 1. unique是把相邻的重复元素放到最后面。所以在对无序数列使用之前&#xff0c;需要用sort先排序。 2.unique的返回值是不重复区的的最后一个元素加一的地址。 sort(V.begin(), V.end() ); vector<int>::iterator end_unique unique&#xff…

搜索:广搜 词语阶梯

问题描述以及解决过程如下导图 广搜实现如下 #include <iostream> #include <algorithm> #include <vector> #include <string> #include <queue> #include <set> #include <map>using namespace std;/*判断两个单词是否有连接状态…

float属性html,详解CSS样式中的float属性

详解CSS样式中的float属性。float是 css样式的定位属性。我们在印刷排版中&#xff0c;文本可以按照需要围绕图片。一般把这种方式称为“文本环绕”。在网页设计中&#xff0c;应用了CSS的float属性的页面元素就像在印刷布局里面的被文字包围的图片一样。浮动的元素仍然是网页流…

机房收费系统系列一:运行时错误‘-2147217843(80040e4d)’;用户‘sa’登陆失败...

做机房收费系统的时候&#xff0c;首先在SQL server数据库中添加好charge数据库&#xff08;在对象资源管理器中&#xff0c;右击数据库&#xff0c;点击附加&#xff0c;找到charge的mdf文件&#xff0c;点击确定&#xff09;&#xff0c;然后用ODBC配置好数据库&#xff0c;把…

JQuery新浪1630个表情插件

1.http://***/Detail.aspx?id131 2.http://***/Detail.aspx?id81转载于:https://www.cnblogs.com/zrp2013/archive/2013/05/17/3082961.html

linux open系统调用的O_DIRECT标记

前言 open系统调用中针对打开的文件描述符&#xff0c;可以增加一个O_DIRECT标记&#xff0c;该标记能够使得针对该文件描述符的写操作绕过操作系统page cache&#xff0c;直接进入通用块设备层&#xff0c;从而减少页缓存对IO效率的影响。 但是针对O_DIRECT标记有一个问题&a…

计算机专业每年都有国企招老吗,这十大专业在国企中最受欢迎,待遇高、前景好,有你的专业吗?...

古语说“三百六十行&#xff0c;行行出状元”这句话一点没错&#xff0c;但是当你报考传说中的“铁饭碗”、“金饭碗”的时候&#xff0c;你会发现&#xff0c;想入对行&#xff0c;首先你得选对专业&#xff0c;不管是对于报考还是以后的职业发展来说&#xff0c;选对专业和嫁…

实现一个基于 SharePoint 2013 的 Timecard 应用(下)

现在&#xff0c;基于 Timecard 数据来一点儿数据分析。 应用需求 对于 Timecard&#xff0c;分析下面 2 个方面&#xff1a; 对于单个项目&#xff0c;分析其中每个成员的工时占比&#xff0c;以此了解工作量分配&#xff0c;为组间人员调度提供参考。对于整个公司&#xff0c…

新书来了!《ActionScript 3.0游戏设计基础(第2版)》

已经开始预售&#xff1a;猛戳这里&#xff01;多谢支持&#xff01;文后附件为译者序。转载于:https://blog.51cto.com/58script/1202944

springcloud-spring cloud config统一配置中心

统一配置中心 为什么需要统一配置中心? 统一配置中心顾名思义,就是将配置统一管理,配置统一管理的好处是在日后大规模集群部署服务应用时相同的服务配置一致,日后再修改配置只需要统一修改全部同步,不需要一个一个服务手动维护 统一配置中心的架构图: 服务者消费者集群&#x…

a-awk外部变量传入,内部变量传出,同时过滤空格及其他字符

变量传递 外部变量传入 lsblk|awk -v A$A -v B$B {print A,B}lsblk | awk {print A,B} A$A B$B 内部变量传出 eval $(lsblk|awk {print "A$1"})eval $(lsblk|awk printf("A%s\n",$1)) 同时过滤空格及其他字符 df -Th|grep ceph- 2>/dev/null|awk -F…

UVa12096.The SetStack Computer

题目链接&#xff1a;http://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem3248 1391605812096The SetStack ComputerAcceptedC0.3022014-07-21 03:43:15The SetStack Computer Background from Wikipedia: \Set theory…

网络设置计算机,怎么重置电脑网络设置

现如今网络已经融入了我们的生活&#xff0c;我们对网络的要求也越来越过了&#xff0c;那么你知道怎么重置电脑网络设置吗?下面是学习啦小编整理的一些关于怎么重置电脑网络设置的相关资料&#xff0c;供你参考。重置电脑网络设置的方法开始→运行→输入&#xff1a;CMD 点击…

centos 学习日记 文件默认权限:umaks

使用方法&#xff1a; [rootkin /]# umask 0022 [rootkin /]# umask -S urwx,grx,orx上面显示的是本机上面文件默认的权限。 第二个好理解。 第一个要注意的是&#xff1a; umask的分值是指"该默认值需要减掉的权限" 第一个数字可以不管他 第二&#xff0c;三&…

linux 基础命令一

linux命令基础 hash&#xff1a;hash操做 shell搜寻到的外部命令的路径结果会缓存至kv(key-value)存储中history&#xff1a;查看历史 history命令:管理命令历史。登录shell时,会读取命令历史文件中记录下的命令:~/.bash_history&#xff0c;而且新执行的命令只会记录在缓存中:…

ceph pool 相关命令

文章目录Pool创建ec pool创建副本pool创建Pool参数创建根故障域及添加osd其他命令Tier相关Pool创建 ec pool创建 创建profile ceph osd erasure-code-profile set $profile_name k$k m$m crush-failure-domainhost crush-root$group_name 创建规则 ceph osd crush rule creat…

临平职高计算机专业高职考大学,临平职高高考再传捷报 本科连续四年蝉联杭州市第一...

又到一年放榜时&#xff0c;几家欢喜几家愁。然而&#xff0c;2018年的高考成绩出来后&#xff0c;可把临平市职业高级中学(以下简称“临平职高”)的师生们乐坏了。正所谓三年寒窗&#xff0c;开出芬芳&#xff1b;三年磨剑&#xff0c;努力未变&#xff1b;三年坚守&#xff0…

音频编辑大师 3.3 注冊名 注冊码

username&#xff1a;cae3_user000注冊码&#xff1a;beslbFVpFEhxvxA0F23xW7heAeWoWjuWhvBIMN0Je1o我试过了&#xff0c;绝对能够用。转载于:https://www.cnblogs.com/mfrbuaa/p/3858221.html

兰戈 —— Rango

2019独角兽企业重金招聘Python工程师标准>>> 一部西部卡通片&#xff0c;据说恶搞了《正午》这部著名的西部片&#xff0c;可惜我没有看过《正午》。非常喜欢这部片子里的音乐&#xff0c;恢宏大气。 剧情&#xff1a; 兰戈&#xff08;约翰尼德普 Johnny Depp 配…

C#/.Net判断是否为周末/节假日

判断节假日请求的Api&#xff1a;http://tool.bitefu.net/jiari/ /// <summary>/// 判断是不是周末/节假日/// </summary>/// <param name"date">日期</param>/// <returns>周末和节假日返回true&#xff0c;工作日返回false</retu…

ceph 部署单机集群

文章目录ceph-deploy部署集群ceph-deploy 部署单机ceph-deploy 创建osdceph osd创建资源池ceph创建rbd块设备ceph创建fs文件系统本文档主要参考ceph官方命令进行部署&#xff0c;使用的时侯ceph-deploy原生命令方式进行集群各个组件的创建&#xff0c;删除&#xff0c;后续会增…