java基础探秘---Java内部类详解[内部、静态内部、匿名内部、局部内部]

Java中的四种访问权限(private,public,protected,无修饰) /实体类属性和数据库字段名称不一致//实体类属性和数据库字段名称不一致return id;return age;emp.test();//直接调用public修饰的变量//private修饰的变量进行赋值//调用private修饰的变量1、public修饰符定义的属性和方法通过对象实例化进行调用,2、private修饰的属性通过set、get方法进行调用。 阅读详情

一.内部类基础

  在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。

  1.成员内部类

  成员内部类是最普通的内部类,它的定义为位于另一个类的内部,形如下面的形式:

1

2

3

4

5

6

7

8

9

10

11

12

13

class Circle {

    double radius = 0;

     

    public Circle(double radius) {

        this.radius = radius;

    }

     

    class Draw {     //内部类

        public void drawSahpe() {

            System.out.println("drawshape");

        }

    }

}

  这样看起来,类Draw像是类Circle的一个成员,Circle称为外部类。成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

class Circle {

    private double radius = 0;

    public static int count =1;

    public Circle(double radius) {

        this.radius = radius;

    }

     

    class Draw {     //内部类

        public void drawSahpe() {

            System.out.println(radius);  //外部类的private成员

            System.out.println(count);   //外部类的静态成员

        }

    }

}

  不过要注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

1

2

外部类.this.成员变量

外部类.this.成员方法

  虽然成员内部类可以无条件地访问外部类的成员,而外部类想访问成员内部类的成员却不是这么随心所欲了。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

class Circle {

    private double radius = 0;

 

    public Circle(double radius) {

        this.radius = radius;

        getDrawInstance().drawSahpe();   //必须先创建成员内部类的对象,再进行访问

    }

     

    private Draw getDrawInstance() {

        return new Draw();

    }

     

    class Draw {     //内部类

        public void drawSahpe() {

            System.out.println(radius);  //外部类的private成员

        }

    }

}

  成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。创建成员内部类对象的一般方式如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

public class Test {

    public static void main(String[] args)  {

        //第一种方式:

        Outter outter = new Outter();

        Outter.Inner inner = outter.new Inner();  //必须通过Outter对象来创建

         

        //第二种方式:

        Outter.Inner inner1 = outter.getInnerInstance();

    }

}

 

class Outter {

    private Inner inner = null;

    public Outter() {

         

    }

     

    public Inner getInnerInstance() {

        if(inner == null)

            inner = new Inner();

        return inner;

    }

      

    class Inner {

        public Inner() {

             

        }

    }

}

  内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。比如上面的例子,如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。我个人是这么理解的,由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。

  2.局部内部类

  局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

class People{

    public People() {

         

    }

}

 

class Man{

    public Man(){

         

    }

     

    public People getWoman(){

        class Woman extends People{   //局部内部类

            int age =0;

        }

        return new Woman();

    }

}

  注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

  3.匿名内部类

实例1:不使用匿名内部类来实现抽象方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

abstract class Person {

    public abstract void eat();

}

 

class Child extends Person {

    public void eat() {

        System.out.println("eat something");

    }

}

 

public class Demo {

    public static void main(String[] args) {

        Person p = new Child();

        p.eat();

    }

}

运行结果:eat something

可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用

但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?

这个时候就引入了匿名内部类

 

实例2:匿名内部类的基本实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

abstract class Person {

    public abstract void eat();

}

 

public class Demo {

    public static void main(String[] args) {

        Person p = new Person() {

            public void eat() {

                System.out.println("eat something");

            }

        };

        p.eat();

    }

}

运行结果:eat something

可以看到,我们直接将抽象类Person中的方法在大括号中实现了

这样便可以省略一个类的书写

并且,匿名内部类还能用于接口上

实例3:在接口上使用匿名内部类

interface Person {

    public void eat();

}

 

public class Demo {

    public static void main(String[] args) {

        Person p = new Person() {

            public void eat() {

                System.out.println("eat something");

            }

        };

        p.eat();

    }

}

运行结果:eat something

 

由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现

最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口

 

实例4:Thread类的匿名内部类实现

public class Demo {

    public static void main(String[] args) {

        Thread t = new Thread() {

            public void run() {

                for (int i = 1; i <= 5; i++) {

                    System.out.print(i + " ");

                }

            }

        };

        t.start();

    }

}

运行结果:1 2 3 4 5

实例5:Runnable接口的匿名内部类实现

1

2

3

4

5

6

7

8

9

10

11

12

13

public class Demo {

    public static void main(String[] args) {

        Runnable r = new Runnable() {

            public void run() {

                for (int i = 1; i <= 5; i++) {

                    System.out.print(i + " ");

                }

            }

        };

        Thread t = new Thread(r);

        t.start();

    }

}

运行结果:1 2 3 4 5

匿名内部类也是不能有访问修饰符和static修饰符的。

  匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

  4.静态内部类

  静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class Test {

    public static void main(String[] args)  {

        Outter.Inner inner = new Outter.Inner();

    }

}

 

class Outter {

    public Outter() {

         

    }

     

    static class Inner {

        public Inner() {

             

        }

    }

}

二.深入理解内部类

  1.为什么成员内部类可以无条件访问外部类的成员?

  在此之前,我们已经讨论过了成员内部类可以无条件访问外部类的成员,那具体究竟是如何实现的呢?下面通过反编译字节码文件看看究竟。事实上,编译器在进行编译的时候,会将成员内部类单独编译成一个字节码文件,下面是Outter.java的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public class Outter {

    private Inner inner = null;

    public Outter() {

         

    }

     

    public Inner getInnerInstance() {

        if(inner == null)

            inner = new Inner();

        return inner;

    }

      

    protected class Inner {

        public Inner() {

             

        }

    }

}

  编译之后,出现了两个字节码文件:

  反编译Outter$Inner.class文件得到下面信息:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

E:\Workspace\Test\bin\com\cxh\test2>javap -v Outter$Inner

Compiled from "Outter.java"

public class com.cxh.test2.Outter$Inner extends java.lang.Object

  SourceFile: "Outter.java"

  InnerClass:

   #24= #1 of #22; //Inner=class com/cxh/test2/Outter$Inner of class com/cxh/tes

t2/Outter

  minor version: 0

  major version: 50

  Constant pool:

const #1 = class        #2;     //  com/cxh/test2/Outter$Inner

const #2 = Asciz        com/cxh/test2/Outter$Inner;

const #3 = class        #4;     //  java/lang/Object

const #4 = Asciz        java/lang/Object;

const #5 = Asciz        this$0;

const #6 = Asciz        Lcom/cxh/test2/Outter;;

const #7 = Asciz        <init>;

const #8 = Asciz        (Lcom/cxh/test2/Outter;)V;

const #9 = Asciz        Code;

const #10 = Field       #1.#11; //  com/cxh/test2/Outter$Inner.this$0:Lcom/cxh/t

est2/Outter;

const #11 = NameAndType #5:#6;//  this$0:Lcom/cxh/test2/Outter;

const #12 = Method      #3.#13; //  java/lang/Object."<init>":()V

const #13 = NameAndType #7:#14;//  "<init>":()V

const #14 = Asciz       ()V;

const #15 = Asciz       LineNumberTable;

const #16 = Asciz       LocalVariableTable;

const #17 = Asciz       this;

const #18 = Asciz       Lcom/cxh/test2/Outter$Inner;;

const #19 = Asciz       SourceFile;

const #20 = Asciz       Outter.java;

const #21 = Asciz       InnerClasses;

const #22 = class       #23;    //  com/cxh/test2/Outter

const #23 = Asciz       com/cxh/test2/Outter;

const #24 = Asciz       Inner;

 

{

final com.cxh.test2.Outter this$0;

 

public com.cxh.test2.Outter$Inner(com.cxh.test2.Outter);

  Code:

   Stack=2, Locals=2, Args_size=2

   0:   aload_0

   1:   aload_1

   2:   putfield        #10; //Field this$0:Lcom/cxh/test2/Outter;

   5:   aload_0

   6:   invokespecial   #12; //Method java/lang/Object."<init>":()V

   9:   return

  LineNumberTable:

   line 16: 0

   line 18: 9

 

  LocalVariableTable:

   Start  Length  Slot  Name   Signature

   0      10      0    this       Lcom/cxh/test2/Outter$Inner;

 

 

}

  第11行到35行是常量池的内容,下面逐一第38行的内容:

final com.cxh.test2.Outter this$0;

  这行是一个指向外部类对象的指针,看到这里想必大家豁然开朗了。也就是说编译器会默认为成员内部类添加了一个指向外部类对象的引用,那么这个引用是如何赋初值的呢?下面接着看内部类的构造器:

public com.cxh.test2.Outter$Inner(com.cxh.test2.Outter);

  从这里可以看出,虽然我们在定义的内部类的构造器是无参构造器,编译器还是会默认添加一个参数,该参数的类型为指向外部类对象的一个引用,所以成员内部类中的Outter this&0 指针便指向了外部类对象,因此可以在成员内部类中随意访问外部类的成员。从这里也间接说明了成员内部类是依赖于外部类的,如果没有创建外部类的对象,则无法对Outter this&0引用进行初始化赋值,也就无法创建成员内部类的对象了。

  2.为什么局部内部类和匿名内部类只能访问局部final变量?

  想必这个问题也曾经困扰过很多人,在讨论这个问题之前,先看下面这段代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public class Test {

    public static void main(String[] args)  {

         

    }

     

    public void test(final int b) {

        final int a = 10;

        new Thread(){

            public void run() {

                System.out.println(a);

                System.out.println(b);

            };

        }.start();

    }

}

  这段代码会被编译成两个class文件:Test.class和Test1.class。默认情况下,编译器会为匿名内部类和局部内部类起名为Outter

x.class(x为正整数)。

  

  根据上图可知,test方法中的匿名内部类的名字被起为 Test$1。

  上段代码中,如果把变量a和b前面的任一个final去掉,这段代码都编译不过。我们先考虑这样一个问题:

  当test方法执行完毕之后,变量a的生命周期就结束了,而此时Thread对象的生命周期很可能还没有结束,那么在Thread的run方法中继续访问变量a就变成不可能了,但是又要实现这样的效果,怎么办呢?Java采用了 复制  的手段来解决这个问题。将这段代码的字节码反编译可以得到下面的内容:

  我们看到在run方法中有一条指令:

bipush 10

  这条指令表示将操作数10压栈,表示使用的是一个本地局部变量。这个过程是在编译期间由编译器默认进行,如果这个变量的值在编译期间可以确定,则编译器默认会在匿名内部类(局部内部类)的常量池中添加一个内容相等的字面量或直接将相应的字节码嵌入到执行字节码中。这样一来,匿名内部类使用的变量是另一个局部变量,只不过值和方法中局部变量的值相等,因此和方法中的局部变量完全独立开。

  下面再看一个例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

public class Test {

    public static void main(String[] args)  {

         

    }

     

    public void test(final int a) {

        new Thread(){

            public void run() {

                System.out.println(a);

            };

        }.start();

    }

}

  反编译得到:

  我们看到匿名内部类Test$1的构造器含有两个参数,一个是指向外部类对象的引用,一个是int型变量,很显然,这里是将变量test方法中的形参a以参数的形式传进来对匿名内部类中的拷贝(变量a的拷贝)进行赋值初始化。

  也就说如果局部变量的值在编译期间就可以确定,则直接在匿名内部里面创建一个拷贝。如果局部变量的值无法在编译期间确定,则通过构造器传参的方式来对拷贝进行初始化赋值。

  从上面可以看出,在run方法中访问的变量a根本就不是test方法中的局部变量a。这样一来就解决了前面所说的 生命周期不一致的问题。但是新的问题又来了,既然在run方法中访问的变量a和test方法中的变量a不是同一个变量,当在run方法中改变变量a的值的话,会出现什么情况?

  对,会造成数据不一致性,这样就达不到原本的意图和要求。为了解决这个问题,java编译器就限定必须将变量a限制为final变量,不允许对变量a进行更改(对于引用类型的变量,是不允许指向新的对象),这样数据不一致性的问题就得以解决了。

  到这里,想必大家应该清楚为何 方法中的局部变量和形参都必须用final进行限定了。

  3.静态内部类有特殊的地方吗?

  从前面可以知道,静态内部类是不依赖于外部类的,也就说可以在不创建外部类对象的情况下创建内部类的对象。另外,静态内部类是不持有指向外部类对象的引用的,这个读者可以自己尝试反编译class文件看一下就知道了,是没有Outter this&0引用的。

三.内部类的使用场景和好处

  为什么在Java中需要内部类?总结一下主要有以下四点:

  1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,

  2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。

  3.方便编写事件驱动程序

  4.方便编写线程代码

  个人觉得第一点是最重要的原因之一,内部类的存在使得Java的多继承机制变得更加完善。

四.常见的与内部类相关的笔试面试题

 1.根据注释填写(1),(2),(3)处的代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

public class Test{

    public static void main(String[] args){

           // 初始化Bean1

           (1)

           bean1.I++;

           // 初始化Bean2

           (2)

           bean2.J++;

           //初始化Bean3

           (3)

           bean3.k++;

    }

    class Bean1{

           public int I = 0;

    }

 

    static class Bean2{

           public int J = 0;

    }

}

 

class Bean{

    class Bean3{

           public int k = 0;

    }

}

  从前面可知,对于成员内部类,必须先产生外部类的实例化对象,才能产生内部类的实例化对象。而静态内部类不用产生外部类的实例化对象即可产生内部类的实例化对象。

  创建静态内部类对象的一般形式为:  外部类类名.内部类类名 xxx = new 外部类类名.内部类类名()

  创建成员内部类对象的一般形式为:  外部类类名.内部类类名 xxx = 外部类对象名.new 内部类类名()

  因此,(1),(2),(3)处的代码分别为:

       Test test = new Test();

  Test.Bean1 bean1 = test.new Bean1();

       Test.Bean2 b2 = new Test.Bean2();

       Bean bean = new Bean();

       Bean.Bean3 bean3 = bean.new Bean3();

2.下面这段代码的输出结果是什么?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

public class Test {

    public static void main(String[] args)  {

        Outter outter = new Outter();

        outter.new Inner().print();

    }

}

 

 

class Outter

{

    private int a = 1;

    class Inner {

        private int a = 2;

        public void print() {

            int a = 3;

            System.out.println("局部变量:" + a);

            System.out.println("内部类变量:" + this.a);

            System.out.println("外部类变量:" + Outter.this.a);

        }

    }

}

 

3

2

1

 

  最后补充一点知识:关于成员内部类的继承问题。一般来说,内部类是很少用来作为继承用的。但是当用来继承的话,要注意两点:

  1)成员内部类的引用方式必须为 Outter.Inner.

  2)构造器中必须有指向外部类对象的引用,并通过这个引用调用super()。这段代码摘自《Java编程思想》

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

class WithInner {

    class Inner{

         

    }

}

class InheritInner extends WithInner.Inner {

      

    // InheritInner() 是不能通过编译的,一定要加上形参

    InheritInner(WithInner wi) {

        wi.super(); //必须有这句调用

    }

  

    public static void main(String[] args) {

        WithInner wi = new WithInner();

        InheritInner obj = new InheritInner(wi);

    }

}

 

 参考资料:

  《java编程思想》     

        http://www.cnblogs.com/dolphin0520/p/3811445.html

 

深入解析Java中的protected修饰符 当方法或实例变量使用protected修饰符时,它们可以在同一包内的任何类中访问,并且也可以在继承它们的子类中访问。在上面的示例中,myMethod()方法和myVariable实例变量被声明为protected,因此它们可以在com.example包中的任何类中访问,以及继承MyClass的子类中访问。当父类的方法或变量使用protected修饰符时,它们可以在子类中进行访问和重写,但对于同一包中的其他类来说是不可见的。protected修饰符只允许同一包中的类访问,以及继承了它的子类访问。 阅读详情

相关推荐

java中private,public,protected详解

参照甲骨文的java文档:点击打开链接 访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。有两个级别的访问控制: 1.在顶级 - public或package-private(没有显式修饰符即默认权限)。 类可以用修饰符public声明,在这种情况下,类对所有类都可见。如果一个类没有修饰符(默认,也称为package-private),它只在自己的包中可见。 2.在成员级

Duan的博客 11万+

Java内部类详解

Java内部类详解   说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法。今天我们就来一探究竟。下面是本文的目录大纲:   一.内部类基础   二.深入理解内部类   三.内部类的使用场景和好处   四.常见的与内部类相关的笔试面试题   若有不正之处,请...

weixin_30578677的博客 3791

sentaurus学习笔记(VDMOS仿真)(三)

在Sentaurus中,这通常意味着在2D仿真中,x轴指向下,y轴指向右。定义了在2D模拟中,网格尺寸按照一定的增长率进行扩展,这里的增长率为2.0,意味着远离最小尺寸区域的网格单元大小将是最小尺寸的两倍。定义了2D模拟中网格单元的最小尺寸为0.001微米,这有助于控制网格的最小大小,从而影响仿真的精度和计算成本。表示启用中等级别的日志信息输出,这有助于用户了解仿真过程中发生的事件和可能的问题。表示启用保存调试文件,这可以帮助用户在仿真过程中检查和验证模型的状态。这行代码设置了仿真过程中使用的线程数。

qq_52640792的博客 1807

访问权限修饰符(public、protected、private)、封装(私有化类属性、私有化类的某些方法)

如:单例模式:单个实例,在系统中,想让某个类只能创建一个对象(如计算机电脑上的任务管理器在Windows系统下只能创建一个)(1)修饰对象:类(包括正常类和内部类)、成员变量、方法(包括构造方法和成员方法)(1)修饰对象:类(包括正常类和内部类)、成员变量、方法(包括构造方法和成员方法),必须通过类中提供的方法来实现对隐藏信息的操作(赋值)和访问(取值)(2)权限范围:被修饰对象只能在本类、同包类、不同包子类中被访问。(1)隐藏了类的某些信息,保护了类中属性的数据值。

Watermelon_Mr的博客 5292

模型检测--工具KeYmaera

论文:KeYmaera: A Hybrid Theorem Prover for Hybrid Systems 作者:Andre Platzer and JanKeYmaera摘要1 介绍2用于混合系统的KeYmaera验证工具3混合系统,混合自动机和混合程序 摘要 KeYmaera是一种用于混合系统的混合验证工具,它结合了演绎,实数代数和计算机代数证明者技术。它是自然的自动和交互式定理证明器 混合系统的规范和验证逻辑。 KeYmaera支持差分动态逻辑,它是用于混合程序的实值一阶动态逻辑,是混合自动机的程

ziigea的博客 1077

实战演练 | ABAQUS显式动力学分析在金属切削仿真中的应用

本文详细介绍了如何利用ABAQUS显式动力学分析进行金属切削过程的二维仿真。通过从零开始的完整流程,包括几何建模、材料本构与失效定义、网格划分、接触设置、边界条件施加,到结果后处理与切削力提取,为工程师和研究人员提供了实用的仿真方法,以优化刀具设计和加工工艺。

purple的博客 931

Java内部类详解(含:成员内部类、局部内部类、匿名内部类、静态内部类)

Java内部类详解(含:成员内部类、局部内部类、匿名内部类、静态内部类)

leaf__yang的博客 2万+

医学图像分割实战:基于TransUNet训练自己的眼底硬渗出物数据集(附完整代码)

本文详细介绍了基于TransUNet的眼底硬渗出物分割实战指南,涵盖数据预处理、模型调优、训练策略及性能优化等关键环节。通过代码复现和实验对比,展示了TransUNet在医学图像分割中的优势,为糖尿病视网膜病变的早期诊断提供技术支持。

weixin_42524708的博客 363

JavaSE-----内部类详解(实例内部类,局部内部类,静态内部类,匿名内部类)

目录认识内部类:一.实例内部类:二.局部内部类:三 匿名内部类: 四、静态内部类小结: 🐻🐻🐻什么是内部类?官方解释:Java内部类是指在一个类的内部定义的类。它可以访问外部类的成员变量和方法,并且可以被外部类实例化。🦉🦉🦉通俗的来讲就是:字面意思,在类的内部编写的类就叫内部类!即一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。😺😺😺内部类是类的第五大成员→【提示:类的五大成员是哪些?--

2302_79862386的博客 7095

基于图神经网络的社交网络虚假账号检测系统 (Graph-based Fake Account Detection System, GFADS)

FOLLOWSRETWEETSSHAREDCOMMENTSLIKESMENTIONSUseruser_idusernamejoin_datebioavatar_urllocationverifiedis_fakeLOAD CSV这是决定模型性能的关键环节,需结合和。XXedge_indexy新账号缺乏历史数据和丰富关系。全网图可能包含数亿节点和数十亿边,难以直接训练。社交网络是动态变化的,虚假账号策略也在不断进化。获取大规模、高质量的真实/虚假账号标注数据非常困难。

Deng945201314的博客 1481

泛微OA自定义post接口和路径(无侵入)

泛微OA自定义post接口和路径(无侵入)

技术分享 3872

Java内部类(静态内部类、匿名内部类等)详解

总结了常见的四大内部类(成员内部类、静态内部类、局部内部类、匿名内部类)相关知识,通过写代码详细讲解了静态内部类和匿名内部类,成员内部类和局部内部类使用较少就没有写代码举例。

???? 6120

【八股】JUC并发编程篇

👉抽象队列同步器,就是一种锁,内部维护的是一个先进先出的双向队列,队列中存储的是排队的线程,用state来标识是否有线程获得锁【0是无锁状态】👉流程:当一个线程拿到锁后会修改state = 1,这时如果有其他线程访问则会进入队列进行排序,直到state变成0后,队头线程才会拿到锁。在对state进行修改时,用的是CAS操作,所以可以保证原子性。👉它可以实现公平锁或非公平锁【默认】,上述是一个公平锁。如果新线程和队头线程抢锁资源就是非公平锁。

qq_44768318的博客 553

【Java探索之旅】内部类 静态、实例、局部、匿名内部类全面解析

在Java编程中,内部类是一种强大的特性,允许在一个类的内部定义另一个类,从而实现更好的封装和组织代码结构。内部类可以分为静态内部类、实例内部类、局部内部类和匿名内部类,每种内部类都有其独特的用途和特点。通过内部类,我们可以更灵活地实现代码逻辑和功能,提高代码的可读性和可维护性。本文将深入探讨各种类型的内部类,包括静态内部类、实例内部类、局部内部类和匿名内部类的定义、特点和用法。通过实例代码和详细解释,帮助读者全面了解内部类的应用场景和技巧,提升Java编程的能力和效率。

屿小夏.的知识博客 2万+

【异常】Warp终端AI功能403封禁报错I‘m sorry, I couldn‘t complete that request.Request failed with error: ErrorSta

本文针对Warp终端出现的AI功能定向封禁报错,完整还原脱敏后的报错信息、深度解读报错本质,并提供分优先级的全流程可落地解决方案,可直接用于技术排查、内部知识库归档。

奶爸的编程之路,也就一周冷个三天 267

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【Java基础】内部类 (成员内部类、局部内部类、静态内部类、匿名内部类)

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

good good study day day up 3398

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java 内部类完全指南:成员内部类、静态内部类、局部内部类、匿名内部类

*内部类(Inner Class)**是定义在另一个类内部的类,它依赖于外部类的存在。

qq_56323274的博客 2361

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java 四大内部类总结——局部内部类,匿名内部类,成员内部类,静态内部类

Java 四大内部类总结——局部内部类,匿名内部类,成员内部类,静态内部类

prince0520的博客 3118

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

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

weixin_44216665的博客 5906

Java内部类这一篇就够啦,超详细,新人友好(成员内部类、静态内部类、局部内部类和匿名内部类)

详细的介绍成员内部类、静态内部类、局部内部类和匿名内部类,超详细,值得收藏!

shiyuechunfeng的博客 2764

Java 局部内部类、匿名内部类详解

外部类与内部类 众所周知,每个java文件必须有一个与这个java文件同名的外部类,这个外部类可以是public或default的。而除了这个同名外部类,还可以有与这个同名外部类平级的其他外部类,但它们必须是default的。 而内部类是指在外部类的内部再定义一个类,类名不需要和文件名相同。 内部类的分类 我们所说的内部类,官方的叫法是嵌套类(Nested Classes)。嵌套类包括静态内部类(...

anlian523的博客 2820

面试 | 什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?

1 内部类的概念 内部类是定义在另一个类中的类;下面类B是类A的内部类。即内部类对象引用了实例化该内部对象的外围类对象。 public class A{ class B {} } 2 为什么需要内部类?(来自JAVA核心技术) 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。 内部类可以对同一个包中的其他类隐藏起来。 当想要定义一个回调函数且不想编写大量代码时,使用匿名内...

星空下的程序猿 3254

【JAVA基础之内部类】成员内部类、匿名内部类、静态内部类、局部内部类

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类,其他称为外部其他类。可以把内部类理解成寄生,外部类理解成宿主。

2301_77358195的博客 1290

JAVA成员内部类,静态内部类,局部内部类,匿名内部类

定义在外部类的方法内,所以定义局部内部类的前提是定义一个方法,和局部变量同等级;静态内部类中只能访问外部类中的静态变量和静态方法,如果要访问非静态的需要先创建外部类对象。因为静态内部类是 static 修饰的,所以 new 的是 Car 里面的 Engine。在成员内部类前加 static 的类叫静态内部类,它是成员内部类中的一种。格式:外部类名 . 内部类名 对象名=外部类对象 . 内部类对象;所以代码整体其实是一个父类的子类,或则说是一个接口的实现类的对象。在外部类中编写方法,对外提供内部类的对象。

2301_79947226的博客 1221

Java(十一)——内部类、成员内部类、静态内部类、局部内部类、匿名内部类

本篇文章我们学习内部类、成员内部类、静态内部类、局部内部类和匿名内部类...

HuoZhiyan 的博客 1260

成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用

放在一个类的内部的类我们就叫内部类。 一、成员内部类 定义在类内部的非静态类,就是成员内部类。 public class Out { private static int a; private int b; public class Inner { public void print() { System.out...

suncat的博客 3203
上一篇: StarUML安装破解及使用简明教程
下一篇: redis命令小记
heary29
博客等级 码龄12年 37粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值