java 面向对象内部类

时间:2023-02-25 14:50:57

1.内部类概念:将一个类定义在另一个类的内部,该类就称为内部类

类中定义的内部类特点
1) 内部类作为外部类的成员,可以直接访问外部类的成员
(包括 private 成员),反之则不行。
2) 内部类做为外部类成员,可声明为 private、默认、protected
或 public。
3) 内部类成员只有在内部类的范围之内是有效的。
4) 用内部类定义在外部类中不可访问的属性。这样就在外部
类中实现了比外部类的 private 还要小的访问权限

 1 public class Face { //
 2     private String shape="瓜子脸";//私有属性
 3     
 4     public class Nose{//鼻子
 5         private String shape="高鼻梁";
 6         public void breath(){
 7             //当内部类与外部类有相同的属性时,在访问外部类的属性时,需要加上外部类的  类名.this.属性
 8             System.out.println("鼻子长在了"+Face.this.shape+"形状的脸上");
 9             System.out.println(shape);
10             System.out.println("有使用鼻子呼吸!");
11         }
12     }
13 }

 

内部类的优缺点
优点:内部类可以直接访问外部类的私有属性
缺点:破坏了类的结构

 

2.内部类分类

1) 成员内部类
内部类相当于外部类的成员
2) 静态内部类

 1 public class Outer {
 2     private static String name="张三";
 3      /**静态内部类 ,(1)不允许访问外部类的非static属性 
 4       * (2)如果内部类中的方法为static方法,那么内部类也必须为静态的*/
 5     static class Inner{ 
 6         public void show(){
 7             System.out.println(name);
 8         }
 9     }
10     static class Inner2{
11         public static void show(){
12             
13         }
14     }
15 }
 1 public class TestStaticInner {
 2     public static void main(String[] args) {
 3         //创建内部类的对象   new 外部类类名.内部类类名();
 4         Outer.Inner i=new Outer.Inner();
 5         i.show();
 6     
 7         //访问的是静态内部类中的静态方法
 8         Outer.Inner2.show();
 9     }
10 }

 


3) 方法中的内部类
只能在方法中使用,相当于方法中的局部变量

 1 public class Outer {
 2     //Outer的成员方法
 3     public void show(){
 4         int a=10;//方法中的局部变量
 5         //内部类相当于show方法中的局部变量,使用范围只能在show方法中
 6         class Inner{
 7             public void fun(){
 8                 System.out.println("a="+a);
 9             }
10         }
11         //创建内部类的对象
12         new Inner().fun();
13     }
14 }

 

4) 匿名内部类 (存在继承或实现关系)
a) 可以实现一个接口,或者继承一个父类
b) 只能实现一个接口
c) 适合创建那种只需要一次使用的类,不能重复使用。
比较常见的是在图形界面编程 GUI 里用得到。

 1 public abstract class Father {//父类
 2     public abstract void dream();//伟 大的梦想
 3 }
 4 class Son extends Father{  //子类是有名称的,子类的名称叫son
 5 
 6     @Override
 7     public void dream() {
 8         
 9     }
10     
11 }
12 class Test{
13     public static void main(String[] args) {
14         //父类引用指向子类对象
15         Father f=new Son();  //在名字的子类
16         /**没有名字的子类*/
17         Father f2=new Father()
18                 {  //没有名称的类
19                     @Override
20                     public void dream() {
21                         System.out.println("努力实现父亲的伟 大梦想,当兵光荣");
22                     }
23                 };
24         f2.dream();
25     }
26 }