今天我们继续复习Java相关的知识,和大家分享有关内部类等方面的知识,希望大家喜欢。
目录
内部类
成员内部类
编辑
静态内部类
局部内部类
匿名内部类
枚举类
定义方法
基本类型包装类
自动装箱和拆箱
内部类
成员内部类
成员内部类和成员变量和成员方法一样,都是属于对象的,也就是说我们必须存在外部对象,才能创建内部类的对象。
public class PleaSure {class pleasure{public void display() {System.out.println("这是内部类的输出函数display");}}
}
public class Main {public static void main(String[] args) {// 首先创建外部类的一个实例PleaSure outer = new PleaSure();// 然后使用外部类的实例来创建内部类的实例PleaSure.pleasure inner = outer.new pleasure();// 调用内部类的方法inner.display();}}
静态内部类
静态内部类其实就和类中的静态变量和静态方法一样,是属于类拥有的,我们可以直接通过`类名加上一个点去访问。
public class PleaSure {static class pleasure{public void display() {System.out.println("这是内部类的输出函数display");}}
}
public class Main {public static void main(String[] args) {PleaSure.pleasure inner = new PleaSure.pleasure();// 调用内部类的方法inner.display();}}
局部内部类
局部内部类是Java中内部类的一种,它定义在外部类的某个方法或代码块内部,并且其作用域被限定在定义它的方法或代码块中,可以类比局部变量来理解。
public class OuterClass { private int outerField = 100;public void outerMethod(){ final int localVar = 200; class LocalInnerClass { public void innerMethod() { System.out.println("Access outer field: " + outerField); System.out.println("Access local variable: " + localVar); } }LocalInnerClass localInner = new LocalInnerClass(); localInner.innerMethod(); } public static void main(String[] args) { OuterClass outer = new OuterClass(); outer.outerMethod(); }
}
匿名内部类
匿名内部类是Java中一种特殊的内部类形式,它允许你声明和实例化一个类,同时立即创建一个该类的实例,而无需显式地给该类命名。匿名内部类通常用于实现接口或继承一个类(特别是抽象类),并立即在其定义时创建该类的实例。
public interface newpleasure {void sayHello();
}
public class Main {public static void main(String[] args) {newpleasure greeting = new newpleasure() {@Overridepublic void sayHello() {System.out.println("Hello, World!");}};greeting.sayHello();}
}
枚举类
枚举类在Java中是一种特殊的数据类型,它提供了一种更强大、更安全和更易读的方式来定义一组固定的命名常量。枚举类是通过enum
关键字来定义的,它是一组固定的常量值的集合,每个常量值代表一个特定的数据类型,类中的实例数量是有限的,且每个实例在编译时就已被确定,不能动态创建新的实例。每个枚举常量在枚举类中都是唯一的,且可以使用==
操作符进行比较。此外,枚举类还提供了compareTo
方法用于比较两个枚举常量的顺序。
定义方法
enum Season { SPRING, SUMMER, AUTUMN, WINTER
} enum DayOfWeek { MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7); private int value; DayOfWeek(int value) { this.value = value; } public int getValue() { return value; }
}
同样,如果我们想要设置和得到其中的value等,我们直接new并用万能的“点”调用get和set即可。
基本类型包装类
基本类型包装类将Java的八种基本数据类型byte、short、int、long、float、double、char、boolean封装为对象,从而允许这些基本类型以对象的形式参与面向对象编程。
其中的对应关系如下:
Byte:对应基本类型byte。
Short:对应基本类型short。
Integer:对应基本类型int。
Long:对应基本类型long。
Float:对应基本类型float。
Double:对应基本类型double。
Character:对应基本类型char。
Boolean:对应基本类型boolean。
private final int value;
public Integer(int value) {this.value = value;
}
public static void main(String[] args) {Integer i = 1;System.out.println(i + i);
}
自动装箱和拆箱
接下来的知识点也是面试中可能常考的一个知识点:那么为什么包装类型能直接使用一个具体值来赋值呢?其实依靠的是自动装箱和拆箱机制。
Integer i = 1; //其实这里只是简写了而已
Integer i = Integer.valueOf(1); //编译后真正的样子
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high) //Java为了优化,有一个缓存机制,如果是在-128~127之间的数,会直接使用已经缓存好的对象,而不是再去创建新的(面试常考)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i); //返回一个新创建好的对象
}
如果使用包装类来进行运算,或是赋值给一个基本类型变量,会进行自动拆箱。