内部内的创建与使用
內部內有幾種,為局部內部內,成員內部內,匿名內部內(局部內部類的一種),靜態內部內,非靜態內部內;
來說說這幾個內部內。
如何訪問內部內的成員:外部類名.內部類名 對象名 = 外部類對象.內部類對象;
成員內部內:在成員位置定義的類叫做成員內部類局部位置。
例如:
public class Body{//外部類 身體
?private boolean life = true;//生命狀態
? ? public class Heart{//內部類 心臟
? ? ? ? public void jump(){//跳動
? ? ? ? ? ? System.out.println("心臟在跳");
? ? ? ? ? ? System.out.println("聲明狀態:" + life);//內部類方位外部類中的成員變量
? ? ? ? }
? ? ? ? public void setLife(boolean li){
? ? ? ? ? ? life = li;//內部類能夠調用外部類中的元素
? ? ? ? }
? ? ? ? public class blood{
? ? ? ? ? ? public void print(){
? ? ? ? ? ? ? ? System.out.println("我是心臟里面的血管");
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
public class BodyTest {
? ? public static void main(String[] args) {
? ? ? ? //創建一個內部類對象
? ? ? ? Body.Heart bh = new Body().new Heart();
? ? ? ? //調用內部類中的方法
? ? ? ? bh.jump();
? ? ? ? bh.setLife(false);
? ? ? ? bh.jump();
? ? ? ? Body.Heart.blood bhb = new Body().new Heart().new blood();
? ? ? ? bhb.print();
? ? }
}
局部內部類:在局部位置定義的類,被稱為局部內部類。
例如:
public class Cat {//外部類
? ? private String name = "大橘為重";
? ? public void m(){
? ? ? ? //局部變量如果在內部類中使用必須使用final進行修飾
? ? ? ? final int age = 5;
? ? ? ? //局部內部類不允許使用訪問控制修飾符,只能使用final和abstract進行修飾
? ? ? ? ? class say{
? ? ? ? ? ? public ?void m2(){
? ? ? ? ? ? ? ? System.out.println("喵喵喵喵喵");
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //在定義局部內部類的方法中對局部內部類進行創建對象
? ? ? ? new say().m2();
? ? }
}
public class CatTest {
? ? public static void main(String[] args) {
? ? ? ? Cat c = new Cat();
? ? ? ? c.m();
? ? }
}
?
匿名內部類:匿名內部類的作用和格式
?? ?作用:匿名內部類是創建某個類型的子類對象的快捷方式
?? ?格式:
new 父類或接口(){
? ? //進行方法重寫
}
public class Demo {
? ? public static void main(String[] args) {
? ? ? ? //接口不能創建對象
? ? ? ? Person p = new Person() {//這一對花括號中的內容就是匿名內部類
? ? ? ? ? ? //實現接口中的所有的抽象方法就可以了
? ? ? ? ? ? @Override
? ? ? ? ? ? public void eat() {
? ? ? ? ? ? ? ? System.out.println("吃米飯");
? ? ? ? ? ? }
? ? ? ? };
? ? ? ? //如果對接口創建了對象,使用匿名內部類的方法是將接口中的方法實現了
? ? ? ? //那么我們可以通過調用接口創建的對象將這個方法調用出來
? ? ? ? p.eat();
? ? }
}
靜態內部內:是指在創建內部類的時候使用static修飾的內部類
在創建靜態內部類的時候,不需要創建外部類對象
外部類名.內部類名 對象名 = new 外部類名.內部類名();
public class Outer {
? ? private String name1 = "旺財";
? ? static class Inner {
? ? ? ? String name2 = "來福";
? ? ? ? public void m(){
? ? ? ? ? ? //1、靜態內部類不能直接訪問外部類中非靜態的成員變量
? ? ? ? ? ? //2、如果想要訪問這些變量需要創建對象
? ? ? ? ? ? System.out.println("外部類的成員變量:" + new Outer().name1);
? ? ? ? }
? ? }
? ? //在靜態內部類的外部成員的位置寫一個方法,創建內部類對象,調用靜態內部類的方法
? ? public void m2(){
? ? ? ? new Inner().m();
? ? }
}
非靜態內部類:
創建對象格式:外部類名.內部類名 對象名 = new 外部類名().new 內部類名();
?public static void main(String[] args) {
? ? ? ? Outer.Inner in = new Outer.Inner();
? ? }
}
靜態內部類中可以定義靜態成員和非靜態成員。其他類在調用外部類中的靜態內部類的時候,需要通過完整的類名訪問靜態內部類中的靜態的成員.如果要訪問靜態內部類中的其他非靜態成員,需要通過靜態內部類的對象進行調用
public class Outer_02 {
? ? static class Inner_02{
? ? ? ? int a = 10;//靜態內部類的非靜態成員變量
? ? ? ? static int b = 20;//靜態內部類的靜態的成員變量
? ? }
}
public class OuterTest {
? ? public static void main(String[] args) {
? ? ? ? Outer_02.Inner_02 oi = new Outer_02.Inner_02();
? ? ? ? System.out.println(oi.a);//訪問靜態內部類中非靜態的變量
? ? ? ? System.out.println(Outer_02.Inner_02.b);//訪問靜態內部類中靜態的變量
? ? }
}
總結
- 上一篇: 潮汐特征值计算及其预报
- 下一篇: 如何进行美国站税务审核