Java--面向对象之封装

       前言

        好像要变强了诶!!


目录

       访问修饰限定符

       static成员

       代码块

       内部类

        内部类的划分:内部类是在一个类的内部定义的类。它们可以分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。

        内部类的实例化:内部类的实例化方式取决于内部类的类型和访问权限。以下是几种常见的内部类实例化方式:


       访问修饰限定符

        什么是封装

        答:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

        访问修饰限定符的作用是什么?

        答:Java中主要通过类和访问权限来实现封装,类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:

访问范围

private

default

protected

public

1

同一包中的同一类

可以

可以

可以

可以

2

同一包中的不同类

 

可以

可以

可以

3

不同包中的子类

 

 

可以

可以

4

不同包中的非子类

 

 

 

可以

     注意:

        1,protected主要用在继承关系中;   

        2,default权限:在权限位置什么都不写,就是default权限;


       static成员

        在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。

        静态成员变量 与 静态成员方法都是属于类的,无法通过对象去调用,可以通过类名来调用。同样的,不能在静态方法中访问任何非静态成员变量。所以,被static修饰的成员变量和成员方法也不存储在某个对象的空间中,而是存储在方法区。                

        被static修饰的成员变量如何初始化?

        答:静态成员变量的初始化一般分为两种,就地初始化 和 静态代码块初始化。


       代码块

        实例代码块:(实例代码块也称为  构造代码块)是在创建对象时执行的一段代码块,它的作用是在实例化对象之前,进行一些初始化操作,常用于设置实例变量的初始值或执行其他必要的操作。

        实例代码块与构造方法类似,但不同于构造方法地方在于,实例代码块在每次创建对象时都会执行,无论调用那个构造方法。

        需要注意的是,在创建对象时,实例代码块的初始化操作会先于构造方法执行。

        示例:

        

public class MyClass {
   int x;
   
   // 实例代码块
   {
      x = 10;
      System.out.println("实例代码块被执行");
   }

   public MyClass() {
      System.out.println("无参构造函数被调用");
   }

   public MyClass(int value) {
      System.out.println("带参构造函数被调用");
      x = value;
   }
}

          

        静态代码块:使用static定义的代码块成为静态代码块,一般用于初始化静态成员变量。

        需要注意:

                1,静态代码块不管生成多少个对象,其只会执行一次,在编译时执行。

                2,静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的。

                3,如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)。


       内部类

        当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类,内部类也是封装的一种体现。内部类和外部类共用一个java源文件,但是经过编译后,内部类会形成单独的字节码文件。           

        什么是字节码文件?

        答:字节码文件是一种中间形式的文件,在Java等编程语言中使用。当源代码被编译成字节码时,它不是直接转换成机器码,而是转换成一种特定的格式,也就是字节码文件。字节码文件在虚拟机中执行,可以实现跨平台的特性,Java的跨平台特性由此而来。

        字节码文件包含了一系列的指令,这些指令被虚拟机解释和执行。字节码文件相对于源代码来说更加紧凑,并且由于虚拟机对字节码的解释执行,可以实现跨平台的特性。不同的编程语言可能有不同的字节码格式,比如Java使用的是.class文件,而Python使用的是.pyc文件。

        字节码文件可以通过编译器将源代码转换成中间形式,然后再由虚拟机进行解释执行。这种方式可以提高程序的运行效率,并且可以实现一些高级特性,例如动态类型检查和垃圾回收等。

       

        内部类的划分:内部类是在一个类的内部定义的类。它们可以分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。

        1. 成员内部类:也称实例内部类,成员内部类是在一个类的内部定义的普通类。它具有访问外部类的所有成员变量和方法的权限。成员内部类的创建需要依赖外部类对象。

        需要注意:        

                1,在实例内部类中可以直接访问外部类中的任何成员;

                2,实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束。

                3,在实例内部类方法中访问同名的成员时,优先访问自己的。如果要访问外部类的同名成员,必须:外部类名称.this.同名成员  来访问。

                4,实例内部类对象必须在先有外部类对象前提下才能创建。

                5,实例内部类的非静态方法中包含了一个指向外部类对象的引用。

                6,在外部类中,不能直接访问实例内部类中的成员,如果要访问,必须先要创建内部类的对象。                       

        2. 局部内部类:局部内部类是在一个方法或代码块中定义的类。它的作用范围被限定在该方法或代码块中,只能在其所在的方法或代码块中创建实例。

        需要注意:

                1,局部内部类只能在所定义的方法内部使用;

                2,不能被public,static等修饰符修饰;

                3,几乎不会使用;              

        3. 匿名内部类:匿名内部类是没有名字的内部类,它通常用于创建实现某个接口或继承某个类的对象。它的定义和创建同时进行,一般在方法参数传递或赋值语句中使用。

        4. 静态内部类:静态内部类是在一个类的内部定义的静态类。它与外部类没有直接的关联,可以独立创建实例。静态内部类不能访问外部类的非静态成员,但可以访问外部类的静态成员。

        需要注意:外部类可以通过静态内部类类名来直接访问其内成员,静态内部类是一个与外部类无关的独立实体,它可以访问外部类的静态成员和方法,包括私有的静态成员和方法。但是,静态内部类不能直接访问外部类的非静态成员和方法,需要通过创建外部类的对象来访问。

        这些不同类型的内部类在不同场景下有着各自的应用,可以根据需要选择合适的类型来定义内部类。

        内部类的实例化:内部类的实例化方式取决于内部类的类型和访问权限。以下是几种常见的内部类实例化方式:

        1. 非静态内部类(成员内部类): 非静态内部类依赖于外部类的实例,因此在实例化非静态内部类之前,需要先实例化外部类。

public class OuterClass {
    class InnerClass {
        // 内部类的成员和方法
    }
}

// 实例化内部类
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();

        2. 静态内部类:静态内部类不依赖于外部类的实例,可以直接实例化。

public class OuterClass {
    static class InnerClass {
        // 内部类的成员和方法
    }
}

// 实例化内部类
OuterClass.InnerClass inner = new OuterClass.InnerClass();

        3. 方法内部类:方法内部类定义在方法内部,只有在方法被调用时才能进行实例化。

public class OuterClass {
    public void outerMethod() {
        class InnerClass {
            // 内部类的成员和方法
        }

        // 实例化内部类
        InnerClass inner = new InnerClass();
    }
}

        4. 匿名内部类:匿名内部类没有显式的定义,通常用于实现接口或继承抽象类。

public interface MyInterface {
    void doSomething();
}

// 实例化匿名内部类
MyInterface obj = new MyInterface() {
    @Override
    public void doSomething() {
        // 实现接口方法
    }
};

        这些是内部类的几种常见实例化方式,具体的选择取决于内部类的类型和使用场景。

        


        我是专注学习的章鱼哥~                             

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值