首页 > 其他分享 >内部类

内部类

时间:2023-02-15 15:56:25浏览次数:22  
标签:内部 void System println public out

内部类就是在一个类的内部定义一个类。

内部类自动具有外部类的所有成员的访问权,使用范围从内到外,不能从外到内。

选择:

对外不想要这个类被访问,根据作用范围来选择内部类,类的内部--静态内部类,某个方法---匿名内部类

对内,想要访问某些内部数据,比如私有属性

成员内部类

可以访问外部成员的属性,方法,构造器

public  class Animal{
    private int age;
    public String name;
    public int x = 9;
    
    public void test(){
       // System.out.println(sex); 外部类不能调用内部类属性,方法
       //// 外部类调用内部类
        new Animal().new Cat().getAge();
    }
    
    // 成员内部类
    class Cat{
         // 内部成员属性,外部不能调用
        public String sex;
        int x = 8;
        
        public void getAge(){
            int x = 7;
            //可以调用外部类的私有属性,和成员属性
            System.out.println(age);
            String catName  = name;
             System.out.println(x);
             System.out.println(this.x);
             System.out.println(Animal.this.x);
             test(); //调用外部类的成员方法
        }
    }
​
    public static void main(String[] args) {
        // 通过外部类调用内部类
        Cat cat = new Animal().new Cat();
        cat.getAge();  // 7,8,9
    }
}

静态内部类

只能调用外部类中的静态内容

public  class  Animal{
    private  static int age;
    public  String name;
    public void test(){
       // System.out.println(sex); 外部类不能调用内部类属性,方法
        // 外部类调用内部类
        new Animal.Cat().getAge();
    }
    
    // 静态 成员内部类
    static  class Cat{
        public void getAge(){
​
            // 不能添加修饰符
            String sex;
​
            // test();    不能调用外部类的非静态方法和属性
            //String catName  = name;
​
            //只能调用外部类的静态的 私有属性,和成员属性
            System.out.println(age);
​
        }
    }
​
    public static void main(String[] args) {
        // 通过外部类调用静态内部类
        new Animal.Cat().getAge();
    }
}

 

局部内部类

局部内部类放在方法、代码块、构造器等执行体中,

局部内部类只在当前方法中有效

不能定义static成员。

局部内部类只能访问当前方法中的final类型的参数和变量

外部类不能访问局部内部类,只能在方法体中访问局部内部类,且访问必须在内部类定义之后。

public  class  Student{
    private int age;
    public  String name = "aa";
​
    public void test(){
​
         final int a =10;
         String b = null;  b ="hahha";
         String c = null;
         //System.out.println(sex); //外部类不能调用内部类属性,方法
     
        // 局部内部类 不能有修饰符
        class Cat{
            public  String sex;
​
            public void getCat(final int d){
                // 访问外部类中的成员
                System.out.println(name);
                 // 匿名内部类调用的方法必须是fianl修饰的
                System.out.println(a);
                //System.out.println(b); b修改引用地址,不是final类型
                System.out.println(c);// c 没有进行修改
                System.out.println(d);// c 没有进行修改
            }
        }
        //外部类不能访问局部内部类,只能在方法体中访问局部内部类,且访问必须在内部类定义之后。
        Cat cat = new Cat();
        cat.getCat();
    }
​
    public static void main(String[] args) {
        //外部不能直接调用内部类,只能在方法中调用,通过方法间接调用
        Student s = new Student();
        s.test();
    }
}

匿名内部类

1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

2、匿名内部类中是不能定义构造函数的。

3、匿名内部类中不能存在任何的静态成员变量和静态方法。

4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

public  class Animal{
    
    public void eat(){}
}
​
public  class Dog extends Animal{
    @Override
    public void eat(){}
}
​
public class Test {
    public static void main(String[] args) {
        
//        Dog test2 = new Dog(); 一般我们这么定义但是如果这个方法我们只使用一次,就没必要创建对象了
//        test2.eat();
        //匿名内部类
       Animal a =  new Animal(){
             @Override
             public void eat(){
                 System.out.println("11111");
             }
             public void drink(){
                 System.out.println("222");
             }
         };
        a.drink();
        a.eat();
    }
}

补充

为什么匿名/局部内部类中不能有静态的方法、属性?

因为静态的方法属性会在外部类加载时就加载。这样直接”外部类名.“就访问了,但是这些静态方法是属于内部类的,这个时候有可能内部类还没有创建,所以在语法上不符合基本逻辑。

标签:内部,void,System,println,public,out
From: https://www.cnblogs.com/zhuyilong/p/17123308.html

相关文章

  • 10.8 函数内部的处理
    通过执行AddNum函数的源代码部分,来看一下参数的接收、返回值的返回等机制(代码清单10-5)。 ebp寄存器的值在(1)中入栈,在(5)中出栈。这主要是为了把函数中用到的ebp寄存......
  • 10.8函数内部的处理
         ebp寄存器的值在(1)中人栈,在(5)中出栈。这主要是为了把函数中用到的ebp寄存器的内容,恢复到函数调用前的状态。在进入函数处理之前,无法确定ebp寄存器用......
  • Java内部类
    Java内部类内部类介绍在java中,可以将一个类定义到另一个类的内部或者方法内部,这样的类叫做内部类,内部类可以分为:成员内部类、局部内部类、匿名内部类、静态内部类。1.......
  • java中的HashSet内部是如何工作的
    HashSet的内部采用HashMap来实现。由于Map需要key和value,所以HashSet中所有key的都有一个默认value。类似于HashMap,HashSet不允许重复的key,只允许有一个nullke......
  • shell内部命令-echo|
    1.echoLinux中echo命令主要用于打印字符或者回显,一般起到一个提示的作用。1.1语法echo[选项][输出内容]1.2参数-n不在最后自动换行。-e使用-e扩展参数......
  • Java的四种内部类
    Java四种内部类,静态内部类、成员内部类、局部内部类、匿名内部类的简要介绍Ahthor:MsuenbDate:2023-02-11在Java中,允许一个类的定义位于类一个类的内部,前者称为......
  • 17 内部类
    内部类packagecom.zhan.base05Oop.demo08;publicclassTest17{//四种内部类publicstaticvoidmain(String[]args){Outerouter=newOute......
  • 第 16 章 使用内部类和闭包
    16.1内部类....................................................27716.2闭包........................................................28416.3总结..................
  • 干货总结|快速构造String对象及访问其内部成员的技巧
    一、相关知识JDKString的实现字符串在JDK8及JDK9之后的实现有很大不同的。JDK8中,String的结构是这样的:1.1StringJDK8的实现classString{......
  • 干货总结|快速构造String对象及访问其内部成员的技巧
    一、相关知识JDKString的实现字符串在JDK8及JDK9之后的实现有很大不同的。JDK8中,String的结构是这样的:1.1StringJDK8的实现classString{......