第三节:Java类和对象之代码块和内部类

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三节:Java类和对象之代码块和内部类相关的知识,希望对你有一定的参考价值。

文章目录

一:代码块

代码块:使用定义的一段代码,根据代码块定义的位置以及关键字,又分为以下四种

  • 普通代码块
  • 实例代码块
  • 静态代码块
  • 同步代码块(Java多线程再说)

①:普通代码块:定义在方法中的代码块

  • 此种用法很少见
public class TestDemo 
    public static void main(String[] args) 
        
            //普通代码块
            int a = 10;
            System.out.println("a = "+ a);
        
        int b = 20;
        System.out.println("b = "+ b);
    

②:实例代码块:定义在类中的代码块,一般用于初始化实例成员变量

  • 下面的运行结果可以看出:实例代码块优先级高于构造方法
  • 实例代码块只有在创建对象时才会执行
public class Student 
    public String name;
    public int age;

    public Student()
        System.out.println("构造方法运行");
    

    //实例代码块
    
        this.name = "张三";
        this.age = 18;
        System.out.println("实例代码块运行");
    
    public static void main(String[] args) 
        Student s = new Student();
    

public class Student 
    public String name;
    public int age;
    public static String classes;

    public Student()
        System.out.println("构造函数运行");
    

    //实例代码块
    
        this.name = "张三";
        this.age = 18;
        System.out.println("实例代码块运行");
    

    //静态代码块
    static
        classes = "三年二班";
        System.out.println("静态代码块运行");
    
    public static void main(String[] args) 

    

③:静态代码块:使用static所修饰的代码块,用于初始化静态成员变量

  • 下面的运行结果可以看出:静态代码块优先级高于实例代码块,实例代码块优先级高于构造方法
  • 静态代码块不管生成多少个对象,它只会执行一次
  • 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次合并
public class Student 
    public String name;
    public int age;
    public static String classes;

    public Student()
        System.out.println("构造函数运行");
    

    //实例代码块
    
        this.name = "张三";
        this.age = 18;
        System.out.println("实例代码块运行");
    

    //静态代码块
    static
        classes = "三年二班";
        System.out.println("静态代码块运行");
    
    public static void main(String[] args) 
        Student s = new Student();
    

二:内部类

(1)内部类的定义

内部类:在Java中,可以将一个类定义在另一个类或一个方法内部,前者称之为内部类,后者称之为外部类。内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件

//A是外部类
//B是内部类
public class A
	class B
	

(2)内部类分类

内部类分类:内部类是一个很宽泛的概念,有如下几种

  • 实例内部类
  • 静态内部类
  • 局部内部类(了解即可)
  • 匿名内部类(最常用)

A:实例内部类

实例内部类:如果没有static修饰它就是实例内部类,使用时注意以下几点

①:实例内部类当中,不能定义静态的成员变量或方法

  • 其实,成员变量是可以定义的,只需加final关键字即可;但是成员方法确实是不能定义的

②:要想实例化内部类对象必须得先有外部类对象存在。也即外部类类名.内部类 类名字 = 外部类引用.new 内部类

  • 同理:外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象
class OuterClass 
    public int outer_a = 1;
    public int outer_b = 2;

    class InnerClass
        public int inner_a = 3;
        public int inner_b = 4;
    


public class Test
    public static void main(String[] args) 
        //外部类对象必须先创建
        OuterClass out = new OuterClass();
        //利用外部对象实例化内部类
        OuterClass.InnerClass inner = out.new InnerClass();
        
        //注意:也可以合并写
        OuterClass.InnerClass inner1 = new OuterClass().new InnerClass();
    

③:外部类中任何成员都可以被实例内部类中的方法直接访问

class OuterClass 
    public int outer_a = 1;
    public int outer_b = 2;

    class InnerClass
        public int inner_a = 3;
        public int inner_b = 4;

        public InnerClass()
            System.out.println("实例内部类构造方法");
        
        public void InnerFunc()
            System.out.println("实例内部类普通方法:" + "outer_a=" + outer_a);
        
    


public class Test
    public static void main(String[] args) 
        //外部类对象必须先创建
        OuterClass out = new OuterClass();
        //利用外部对象实例化内部类
        OuterClass.InnerClass inner = out.new InnerClass();

        inner.InnerFunc();
    

④:如果实例内部类和外部类的成员同名,那么优先访问实例内部类中的成员;如果要访问外部类的同名成员,格式为外部类名称.this.同名成员

  • 要访问外部类静态成员变量,则格式为:外部类名称.成员名
class OuterClass 
    public int outer_a = 1;
    public int outer_b = 2;

    class InnerClass
        public int outer_a = 11;
        public int inner_a = 3;
        public int inner_b = 4;

        public InnerClass()
            System.out.println("实力内部类构造方法");
        
        public void InnerFunc()
            System.out.println("实例内部类普通方法:" + "outer_a=" + outer_a);
        
    


public class Test
    public static void main(String[] args) 
        //外部类对象必须先创建
        OuterClass out = new OuterClass();
        //利用外部对象实例化内部类
        OuterClass.InnerClass inner = out.new InnerClass();
        inner.InnerFunc();
    

class OuterClass 
    public int outer_a = 1;
    public int outer_b = 2;

    class InnerClass
        public int outer_a = 11;
        public int inner_a = 3;
        public int inner_b = 4;

        public InnerClass()
            System.out.println("实力内部类构造方法");
        
        public void InnerFunc()
            System.out.println("实例内部类普通方法:" + "outer_a(外部)=" + OuterClass.this.outer_a);
        
    


public class Test
    public static void main(String[] args) 
        //外部类对象必须先创建
        OuterClass out = new OuterClass();
        //利用外部对象实例化内部类
        OuterClass.InnerClass inner = out.new InnerClass();
        inner.InnerFunc();
    

B:静态内部类

静态内部类:如果有static修饰它就是静态内部类,使用时注意以下几点

①:静态内部类中,自然可以定义静态的成员变量或方法

②:要实例化内部类对象,应该这样写

public class OuterClass 
    public int outer_a = 1;
    public int outer_b = 2;
    public static int outer_static = 3;

    static class InnerClass
        public int inner_a = 4;
        public int inner_b = 5;
        public static int inner_static;
        public InnerClass()
            System.out.println("内部类构造方法");
        
    

    public static void main(String[] args) 
        OuterClass.InnerClass inner = new OuterClass.InnerClass();
    


③:静态内部类中,不能直接访问外部类的非静态成员

如果需要访问,则要提供外部类对象

public class OuterClass 
    public int outer_a = 1;
    public int outer_b = 2;
    public static int outer_static = 3;

    static class InnerClass
        public int inner_a = 4;
        public int inner_b = 5;
        public static int inner_static;

        public void test()
            OuterClass out = new OuterClass();
            System.out.println(out.outer_a);
            System.out.println(out.outer_b);
        
    

    public static void main(String[] args) 
        OuterClass.InnerClass inner = new OuterClass.InnerClass();
        inner.test();
    

C:局部内部类(了解即可)

局部内部类:定义在外部类的方法体或者中,局部内部类只能在其定义的位置使用,且不能被public等修饰,几乎不会使用

public class Test
    public static void func()
        class A
            
        
    

D:匿名内部类

  • 接口这一部分讲解

以上是关于第三节:Java类和对象之代码块和内部类的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 中外部类可以访问非静态内部类的私有属性???

Java内部类详解(三大内部类)

Java内部类详解(三大内部类)

大数据必学Java基础(四十六):内部类和面向对象项目实战

java 面向对象内部类和接口

Java语言中四种内部类(成员内部类,局部内部类,静态内部类,匿名内部类)在实际使用中有啥好处?