一些混淆点
内部类
基础知识
在内部类中可以随意使用外部类的成员方法及成员变量。
成员内部类
package com.ptm.abstructdemo.Inner;
public class Test {
public static void main(String[] args) {
//内部类依附于外部类而存在
Outter outter = new Outter();
//第一种方式:直接new方式
Outter.Inner inner1 = outter.new Inner();
inner1.sysInner();
//第二种方式:获取类变量方式
Outter.Inner inner2 = outter.getInnerInstance();
inner2.sysInner();
//当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象
// 即默认情况下访问的是成员内部类的成员。
outter.sysInner();
}
}
class Outter {
private Inner inner;
private String str ="PTM";
public Inner getInnerInstance() {
if(inner == null)
inner = new Inner();
return inner;
}
public void sysInner() {
System.out.println("------------------------");
System.out.println("外部方法"+inner);
System.out.println("------------------------");
}
class Inner {
//构造器
public Inner() {
}
public void sysInner() {
System.out.println("------------------------");
System.out.println("内部方法"+this);
System.out.println("获取外部类私有属性"+str);
System.out.println("------------------------");
}
}
}
emmmmmm一切尽在注释中= =,执行结果如下图:
局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,局部内部类的访问仅限于方法内或者该作用域内。
class Outter {
//代码块中
{
class Inner {
//构造器
public Inner() {
}
public void sysInner() {
System.out.println("------------------------");
System.out.println("我是内部局部类1");
System.out.println("------------------------");
}
}
Inner inner = new Inner();
inner.sysInner();
}
//方法中
public void sysInner() {
class Inner {
//构造器
public Inner() {
}
public void sysInner() {
System.out.println("------------------------");
System.out.println("我是内部局部类2");
System.out.println("------------------------");
}
}
Inner inner = new Inner();
inner.sysInner();
}
public static void main(String[] args) {
Outter outter = new Outter();
outter.sysInner();
}
}
执行结果如下图
(PS:局部内部类不能有public、protected、private以及static修饰符的。)
匿名内部类
public class ThreadTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("最典型的当然是开线程啦"+Thread.currentThread().getName());
}
}).start();
new Thread(
() -> System.out.println("JDK8dark法好"+Thread.currentThread().getName())// 省略接口名和方法名
).start();
}
}
运行结果如下图
PS:匿名内部类也是不能有访问修饰符和static修饰符的。
静态内部类
Java中只有内部类才可以是静态的
public class Test {
public static void main(String[] args) {
Outter.Inner inner = new Outter.Inner();
}
}
class Outter {
public Outter() {
}
static class Inner {
public Inner() {
}
}
}
划重点了,面试题经常考这个点。