admin管理员组文章数量:1794759
【JAVA内部类】
内部类
内部类
:可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类
,后者称为外部类
。
package demo4_Inner_Class;
public class OutClass {
class InnerClass{
}
}
- ⚠️注意:定义在class类名{}花括号外部的,即使是在一个文件里,都不能称为内部类。
内部类的类型
⭐️⭐️⭐️⭐️⭐️静态内部类
代码语言:javascript代码运行次数:0运行复制package demo4_Inner_Class;
class Outer{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
//静态内部类
static class InnerClass{
public int data4 = 4;
private int data5 = 5;
public static int data6 = 6;
public void test(){
System.out.println("Innner::test()");
}
}
public void testFun(){
System.out.println("Outer::testFun");
}
}
public class Test {
public static void main(String[] args) {
//如何获取静态内部类对象
Outer.InnerClass inn = new Outer.InnerClass();
}
}
静态内部类对象的获取方法:
public class Test {
public static void main(String[] args) {
//如何获取静态内部类对象
Outer.InnerClass inn = new Outer.InnerClass();
}
}
- 在静态内部类中不可以直接访问外部类对象的非静态成员变量,因为外部类对象的成员依赖于外部类的对象。代码和运行结果如下所示:
package demo4_Inner_Class;
class Outer{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
//静态内部类
static class InnerClass{
public int data4 = 4;
public int data5 = 5;
public static int data6 = 6;
public void test(){
Outer outer = new Outer();
System.out.println(outer.data1);
System.out.println(outer.data2);
System.out.println(data3);
System.out.println(data4);
System.out.println(data5);
System.out.println(data6);
System.out.println("Innner::test()");
}
}
public void testFun(){
System.out.println("Outer::testFun");
}
}
public class Test {
public static void main(String[] args) {
//如何获取静态内部类对象
Outer.InnerClass inn = new Outer.InnerClass();
inn.test();
}
}
⭐️⭐️⭐️实力内部类
代码语言:javascript代码运行次数:0运行复制class Outer{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
//实例内部类
class InnerClass{
public int data4 = 4;
private int data5 = 5;
public static int data6 = 6;
public void test(){
}
}
public void testFun(){
System.out.println("Outer::testFun");
}
}
这段代码里面的 class InnerClass
就是实例内部类(非静态内部类)
但是我们可以看到实例内部类里面不能有静态的变量
,如果实在要加,需要加一个final
关键字
package demo4_Inner_Class;
class Outer{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
//实例内部类
class InnerClass{
public int data4 = 4;
private int data5 = 5;
// 常量在变异的时候确定
public static final int data6 = 6;
public void test(){
System.out.println("test()");
}
}
public void func(){
InnerClass innerClass = new InnerClass();
innerClass.test();
}
}
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
outer.func();
Outer.InnerClass innerClass = outer.new InnerClass();
innerClass.test();
}
}
- 实力内部类的获取方法
实例内部类的获取方法书写格式: Outer.InnerClass innerClass = outer.new InnerClass(); |
---|
class Outer{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
//实例内部类
class InnerClass{
public int data1 = 11111111;
public int data4 = 4;
private int data5 = 5;
// 常量在变异的时候确定
public static final int data6 = 6;
public void test(){
//访问类内成员变量
// 访问方法1
System.out.println(data1);
// 访问方法2
System.out.println(this.data1);
Outer outer = new Outer();
//访问类外成员变量
// 访问方法1
System.out.println(outer.data1);
// 访问方法2
System.out.println(Outer.this.data1);
System.out.println(data2);
System.out.println(data3);
System.out.println(data4);
System.out.println(data5);
System.out.println("test()");
}
}
public void func(){
InnerClass innerClass = new InnerClass();
innerClass.test();
}
}
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.InnerClass innerClass = outer.new InnerClass();
innerClass.test();
}
}
运行结果:
⭐️⭐️⭐️⭐️匿名内部类
代码语言:javascript代码运行次数:0运行复制public class Test {
public void func(){
System.out.println("func()");
}
public static void main(String[] args) {
Test test = new Test();
test.func();
test.func();
new Test().func();//匿名对象
new Test().func();//匿名对象
}
匿名对象
:就是有实例化的对象但没有指向任何引用。
如果以后的使用场景是使用一次对象,那么就使用匿名对象。
interface InterFaceA{
void func();
}
class TestA implements InterFaceA{
@Override
public void func() {
System.out.println("我是重写了funcA方法");
}
}
public class Test {
public static void main(String[] args) {
TestA testA = new TestA();
System.out.println("============");
//匿名内部类的写法:
InterFaceA a = new InterFaceA(){
@Override
public void func() {
System.out.println("");
}
};
}
public void func(){
System.out.println("func()");
}
public static void main1(String[] args) {
Test test = new Test();
test.func();
test.func();
new Test().func();//匿名对象
new Test().func();//匿名对象
}
}
匿名内部类
:是没有名字的类
,它通常用于简化代码结构,尤其是在需要创建某个接口或类的实例
时,这个实例只需要一次性使用
,且不需要复用的场景。匿名内部类的本质是一个局部类,它在声明和实例化的同时进行定义。
class MyInnerC{
public void myfunc(){
System.out.println("happy~");
}
}
interface InterFaceA{
void func();
}
class TestA implements InterFaceA{
@Override
public void func() {
System.out.println("我是重写了funcA方法");
}
}
public class Test {
public static void main(String[] args) {
TestA testA = new TestA();
System.out.println("============");
//匿名内部类的写法:
// 写法一:
InterFaceA a = new InterFaceA(){
@Override
public void func() {
System.out.println("匿名内部类执行1");
}
};
a.func();
System.out.println("============");
// 写法二:
new InterFaceA(){
@Override
public void func() {
System.out.println("匿名内部类执行2");
}
}.func();
System.out.println("============");
// 写法三:普通类的匿名内部类
new MyInnerC(){
@Override
public void myfunc() {
System.out.println("匿名内部类执行3:You will be happiness");
}
}.myfunc();
}
}
运行结果:
根据上面的代码我们可以总结出匿名内部类的书写格式和使用规则:
写法一:直接赋值给接口类型的变量
代码语言:javascript代码运行次数:0运行复制InterFaceA a = new InterFaceA() {
@Override
public void func() {
System.out.println("匿名内部类执行1");
}
};
a.func();
写法二:直接调用匿名内部类的方法
代码语言:javascript代码运行次数:0运行复制new InterFaceA() {
@Override
public void func() {
System.out.println("匿名内部类执行2");
}
}.func();
继承普通类的匿名内部类
代码语言:javascript代码运行次数:0运行复制new MyInnerC() {
@Override
public void myfunc() {
System.out.println("匿名内部类执行3: You will be happiness");
}
}.myfunc();
匿名内部类的优点
- 接口的匿名内部类: 实现接口时,直接实现并使用,适合短小的代码块和事件处理器。
- 继承普通类的匿名内部类: 覆写父类的方法,适合需要修改父类方法但不需要创建一个新类的情况。
本文标签: Java内部类
版权声明:本文标题:【JAVA内部类】 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1753891005a1695965.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论