一些混淆點
內部類
基礎知識
在內部類中可以隨意使用外部類的成員方法及成員變量。
成員內部類
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() {
}
}
}
劃重點了,面試題經常考這個點。