一、类中的组成部分 - 代码块
基本概况
代码块是类的五大组成部分之一,其余部分包含成员变量、构造器、方法以及内部类。
代码块的种类
静态代码块
其格式为static {}
,特性是在类加载时自动执行,由于类仅加载一次,所以静态代码块也仅执行一次。它的作用是完成类的初始化,比如对静态变量进行初始化赋值。
示例代码:
public class CodeBlock {
// 静态资源
public static String name;
public static String[] pokeCards = new String[54];
// 静态代码块
// 主要功能:对类的静态资源进行初始化
static {
System.out.println("===静态代码块执行了===");
name = "可乐";
pokeCards[0] = "A";
pokeCards[1] = "2";
// 此处省略其他类似赋值语句
}
public static void main(String[] args) {
// 目的:认识代码块,理解代码块的执行顺序与基本作用
System.out.println("===main方法执行了===");
}
}
执行结果:
===静态代码块执行了===
===main方法执行了===
实例代码块
格式为{}
,特点是每次创建对象时都会执行实例代码块,且在构造器之前执行。作用与构造器相同,用于完成对象的初始化,例如对实例对象进行初始化。
示例代码:
public class CodeBlock {
// 实例变量
private String name;
private String[] direction = new String[4];
// 实例代码块,无static修饰,属于对象相关
// 基本功能:初始化对象的实例资源
{
System.out.println("===实例代码块执行了===");
name = "可乐";
direction[0] = "东";
direction[1] = "南";
direction[2] = "西";
direction[3] = "北";
}
public static void main(String[] args) {
// 目的:认识代码块,理解代码块的执行顺序与基本作用
System.out.println("===main方法执行了===");
new CodeBlock();
}
}
执行结果:
===main方法执行了===
===实例代码块执行了===
二、内部类
基本概述
若一个类定义在另一个类的内部,该类便称为内部类。使用场景为当一个类的内部包含完整事物且无单独设计必要时,可将该事物设计为内部类。
示例代码:
public class Car {
// 内部类
public class Engine {
}
}
成员内部类
是类中的普通成员,如同普通成员变量、成员方法。
示例代码:
// 外部类
public class OuterClass {
// 外部类静态变量
public static String name = "可乐";
// 外部类实例变量
private int age;
// 外部类静态方法
public static void test() {
}
// 成员内部类,无static修饰,属于外部类对象持有
public class InnerClass {
public void show() {
System.out.println("成员内部类的show方法");
// 成员内部类可直接访问外部类的静态变量
System.out.println(name);
// 成员内部类可直接访问外部类的静态方法
test();
// 成员内部类可直接访问外部类的实例成员
System.out.println(age);
}
}
}
public class InnerClassDemo {
public static void main(String[] args) {
// 目标:理解成员内部类的语法
// 成员内部类创建对象的格式
// 外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
OuterClass.InnerClass oi = new OuterClass().new InnerClass();
oi.show();
// 成员内部类访问外部类成员的特点:
// 1、成员内部类可直接访问外部类的静态成员,也可直接访问外部类的实例成员
}
}
静态内部类
带有static
修饰的内部类,属于外部类自身持有。
示例代码:
// 外部类
public class OuterClass {
// 静态内部类
public static class InnerClass {
}
}
// 语法
// 外部类名.内部类名 对象名 = new 外部类.内部类();
OuterClass.InnerClass oi = new OuterClass.InnerClass();
// 外部类
public class OuterClass {
// 外部类静态变量
public static String name = "可乐";
// 外部类实例变量
private int age;
// 外部类静态方法
public static void test() {
}
// 静态内部类,有static修饰,属于外部类持有
public static class InnerClass {
public void show() {
System.out.println("静态内部类的show方法");
// 静态内部类可直接访问外部类的静态变量
System.out.println(name);
// 静态内部类可直接访问外部类的静态方法
test();
// 静态内部类 不可 直接访问外部类的实例成员
System.out.println(age); // 会报错
}
}
}
public class InnerClassDemo {
public static void main(String[] args) {
// 目标:理解静态内部类的语法
// 静态内部类创建对象的格式
// 外部类名称.内部类名称 对象名 = new 外部类名称.内部类名称();
OuterClass.InnerClass oi = new OuterClass.InnerClass();
oi.show();
// 静态内部类访问外部类成员的特点:
// 1、静态内部类可直接访问外部类的静态成员,不可直接访问外部类的实例成员
}
}
局部内部类(了解)
局部内部类定义在方法、代码块、构造器等执行体中。
示例代码:
public class OuterClass {
public static void main(String[] args) {
}
public static void go() {
// 局部内部类
class A {
}
abstract class B {
}
interface C {
}
}
}
匿名内部类(重点)
是特殊的局部内部类,所谓匿名,指程序员无需为该类声明名字,默认有隐藏名字。
语法:
new 类 或 接口(参数值) {
类体(一般为方法重写);
};
示例:
new Animal() {
@Override
public void eat() {
}
};
特点:匿名内部类本质是子类,会立即创建子类对象。作用是更方便地创建子类对象。
示例代码:
// 父类
public abstract class Animal {
public abstract void cry();
}
// main
public class TestDemo {
public static void main(String[] args) {
// 匿名内部类 创建子类对象
// 匿名内部类实际有名字,外部类名$编号.class(TestDemo$1.class)
Animal a = new Animal() {
@Override
public void cry() {
System.out.println("cat~");
}
};
a.cry();
}
}
匿名内部类在开发中常作为对象参数传输给方法,例如学生、老师参加游泳比赛场景。
// main
public class TestDemo {
public static void main(String[] args) {
// 目标:理解匿名内部类在开发中的用途,常作为对象参数传输给方法
}
}
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12984.html