前言
好像要变强了诶!!
目录
内部类的划分:内部类是在一个类的内部定义的类。它们可以分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。
内部类的实例化:内部类的实例化方式取决于内部类的类型和访问权限。以下是几种常见的内部类实例化方式:
访问修饰限定符
什么是封装
答:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
访问修饰限定符的作用是什么?
答: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() {
// 实现接口方法
}
};
这些是内部类的几种常见实例化方式,具体的选择取决于内部类的类型和使用场景。
我是专注学习的章鱼哥~