普通方法调用必须通过对象名调用,而t就是上面这个对象的对象名。直接输入方法名这种是被static修饰的方法在本类中调用才可以使用。
老师这里的逻辑不太懂
因为我们要在test1方法中调用线程的run方法,所以必须要传入一个对象,否则无法调用,不可以的,tac是对象,并不是方法,我们要调用方法。
这是这么一回事呢
public void show(){ class Inner3{ public void fun(){ System.out.println("hello"); } } new Inner3().fun(); }
正确写法如上。
老师我这里报错了
一个Java文件里面只能有一个公开的public类哦,而且还要保证公开类的类名和文件名一致的。
那应该怎么改呢?
那应该怎么改呢?
只留一个public,其他的都不写public使用默认的访问修饰符,class a{}这样的
我把public删了但是结果还是一样
老师没事了,我知道哪错了
文件名要和公开类的类名一致哦
//通过 new 外部类名。内部类名() 来创建内部类对象 Outer2.Inner2 inner = new Outer2.Inner2(); inner.test();
老师这两行代码能详细讲解一下思路不
有点没理清楚。。
这个是Inner2这个类,是创建在Outer2这个类中的一个内部类。
正常new对象的话直接new Outer这个类就可以了,但是要是new 内部类的话,就要先new他的外部类对象,然后在这个对象后面加上.Inner2()才能够得到这个类。
不能直接new Inner2这个类,因为这个类是在另一个类的内部。
老师,我的代码应该没写错,为什么运行匿名内部类的时候乱码了?
把匿名内部类中的重写方法中输出语句的中文,删掉重写就可以了。
试过了,还是一样的结果,我把匿名内部类又重写了一遍,也没有用。
修改idea的编码,改为utf-8,之后重写你的中文部分代码。
一直没太理解方法为什么可以这么写 这个test1(A a)中的A a指的是什么参数呢?
下面不是有一个接口A吗,这个就是test1方法里需要一个A接口类型的,形参是a。你把接口看成是一个特殊的类。
老师,这2个写法都可以嘛?我看视频是用的第一个写法,我用第二个写法也没报错也能运行
class Outer{ private int age = 10; public void show(){ System.out.println(age); } public class Inner1 { private int age = 20; public void show(){ System.out.println(age); System.out.println(Outer.this.age); } } public static void main(String[] args) { /* Outer outer = new Outer(); Inner1 i = outer.new Inner1(); outer.show(); i.show();*/ Outer.Inner1 i = new Outer().new Inner1(); i.show(); Inner1 inner1 =new Outer().new Inner1(); inner1.show(); } }
没有区别的,一样的~
老师,划线部分不明白,为啥可以这样写,能具体说一说吗
红框相当于是绿框的简写,这里就是把AA对象实例化出来,调用它里面的test方法。
这种方法就是不实例化对象了,定义了run方法以后直接调用了,一次性的。
package com.bjsxt.test3; public class TestAnonymousInnerClass { public void test(A1 a){ a.run(); } public static void main(String[] args){ TestAnonymousInnerClass t=new TestAnonymousInnerClass(); t.test(new AA()); t.test(new A1() { @Override public void run() { System.out.println("TestAnonymousInnerClass.run"); } }); } } class AA implements A1{ @Override public void run() { System.out.println("AA.run"); } } interface A1{ void run(); }
老师,为啥接口A成为了匿名类。实现类AA不是
你返回去看看前面的视频,接口就是这么定义的,和类没有关系,只是类实现这个接口。
而接口需要类来实现,得知道哪个类实现了这个接口,所以AA并不能是匿名的。
A01 { (){}(String str){ System..println(str)} (){ System..println()} } Test03 { (A01 a){ a.runA01()} (String[] args) { Test03 t = Test03()t.runT01(A01())} }
1. 请问下面这一句算不算匿名内部类的使用?为什么?
t.runT01(new A01());
2. 匿名内部类是否只能和接口或者抽象父类联合使用?是否有匿名内部类继承非抽象父类的案例?
代码乱码了
// 接口A interface A{ void run(); } // 有名字的类,可以反复使用 class AA implements A{ @Override public void run() { System.out.println("AA.run"); } } public class TestAnonymousInnerClass { public void test(A a){ a.run(); } public static void main(String[] args) { TestAnonymousInnerClass tai = new TestAnonymousInnerClass(); // 调用test方法 通过new AA() 创建实现类AA的对象并传入 这里调用的重写后的run()方法 tai.test(new AA()); }
1、老师,这里的tai,test(new AA())算是匿名内部类吗?
2、new TestAnonymousInnerClass(); 这样直接new,前面没起名字的就是匿名么?
1、老师,这里的tai,test(new AA())算是匿名内部类吗?
不算
new TestAnonymousInnerClass(); 这样直接new,前面没起名字的就是匿名么?
这个是匿名函数,这个对象只实例化一次就已经被回收了。
老师匿名内部类的时候为什么还可以new接口啊
这实质上是使用匿名接口来实现匿名内部类的, 匿名接口这样写是会自动生成一个 实现了该接口的匿名类
哦哦
好
在网上看到一个这个,和老师说的语法不太一样
没有问题,在语法中有个细节没有注意就是最后大括号后面要跟上分号
什么是匿名内部类,具体的定义是什么,可以在举一个例子吗
https://www.cnblogs.com/wuhenzhidu/p/anonymous.html
可以参考一下这个文章,里面有案例,讲述比较清楚