精华内容
下载资源
问答
  • 内部局部内部类与匿名内部类创建对象方法
    千次阅读
    2018-08-03 20:37:00

    内部类:

    定义在A类中的B类就是内部类,B类在A类中的地位和其他成员相同,意思就是说可以相互调用 

    优点:通过内部类可以让java间接的实现多继承

    创建内部类的对象

    方法一
    先获取内部类对象再调用方法
    Outer out = new Outer();
    外部类对象.new 内部类构造方法
    Outer.Inner in = out.new Inner();
    in.play();
    
    方法二
    借助于外部类方法实现内部类方法的调用
    Outer out = new Outer();
    out.show();
    class Outer{
    	int age = 10;
    	class Inner{//内部类
    		int height =  20;
    		public void play() {
    			age+=10;
      	 System.out.println("Inner - play"+ age);
    		}
    	}
    	
    	public void show() {
    		System.out.println("Outer - show");
    		//相当于再使用Inner
    		Inner in= new Inner();
    		in.play();
    	}
    }
    

    局部内部类:

    定义:在一个类中方法中的类


    作用范围:从定义它开始到所在方法的结束
    作用:既保证了代码的私有化,又对代码进行了整理,增加了代码的可读性,操作性

    •  形式:
    class 外部类名{
        外部方法(){
            内部类名{
                内部方法(){
                    
                }
            }
        }
    }
    

    匿名内部类

    匿名内部类(对象):定义在一个类方法中的匿名子类 对象,属于局部内部类
    匿名内部类的作用:用于类的私有化,只让外部类看

    研究匿名对象,匿名子类对象
    class Text1 {
    	public void text1Method() {
    		System.out.println("text1Method");
    	}
    }
    
    class SubText1 extends Text1 {
    	public void text1Method() {
    		System.out.println("SubText1-Method");
    	}
    }
    

    创建匿名对象,完成方法的调用

    new Text1().text1Method();
    

    创建匿名子类对象

    •  方法一 使用已有的子类声明子类对象,并调用方法
    •  应用场景:现成的子类可以用很多次,相同的功能需要多次使用的时候
    new SubText1().text1Method();
    
    •  方法二:直接创建没有名字的Text1类的匿名类对象
    构成:new 父类的名字/父类接口的名字+()+{
        匿名子类的执行体
    };
    
    •  场景:只能使用一次,使用完立即释放,每次都使用不同的功能
    Text1 t = new Text1() {
    			// 重写的Text1中的方法
    			public void text1Method() {
    				System.out.println("匿名");
    			}
    
    			// 子类特有的方法
    			public void bark() {
    				System.out.println("bark");
    			}
    		};
    

    研究匿名内部类作为参数与返回值

    作为参数

    // 普通的匿名对象作为参数
    	public void textCanshu1() {
    		System.out.println(new Text1());
    	}
    
    
    	// 测试匿名内部类对象作为参数
    	public void textCanshu2() {
    		
    		System.out.println(
    
    				new Text1() {
    					public String xiuxiuxiu() {
    						System.out.println("嘟嘟嘟");
    						// com.qinafeng.text.Out$3@4e25154f
    						return "dididi";
    					}
    				}.xiuxiuxiu());
    	}
    

    作为返回值

    //普通的匿名对象充当返回值
    	public Text1 textFanhuizhi1() {
    		return new Text1();
    	}
    
    //匿名内部类充当返回值
    	public Text1 textFnhuizhi2() {
    		return new Text1() {
    			public void xiuxiuxiu() {
    				System.out.println("嘟嘟嘟");
    			}
    		};
    	}
    

     

    更多相关内容
  • java内部之成员内部局部内部类和匿名内部

    千次阅读 多人点赞 2018-07-15 16:13:30
    2、局部内部类(包含匿名内部)。 成员内部 定义格式: 修饰符 class 名称 { 修饰符 class 名称 { //... } //... } 注意: 内部使用外部,可以随意访问,但是外部使用内部要借助内部对象...

    内部类概念

    一个类中包含另外一个类。

    分类

    1. 成员内部类。
    2. 局部内部类(包含匿名内部类)。

    成员内部类

    定义格式:

    修饰符 class 类名称 {
        修饰符 class 类名称 {
            //...
        }
        //...
    }

    注意:

    内部类使用外部,可以随意访问,但是外部类使用内部类要借助内部类的对象。

    使用成员内部类

    两种方法:
    1. 间接方式:在外部类的方法中,使用内部类,然后main只调用外部类的方法。
    2. 直接方式:公式:
    一般类:类名称 对象名 = new 类名称();
    成员内部类:外部内名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();

    Body.java含有一个内部类Heart

    public class Body {
    
        private String name;
    
        //外部类方法
        public void methodBody() {
            System.out.println("外部类的方法");
            new Heart().beat();//在外部类方法中使用内部类。 
        }
    
    
        public  class Heart { //成员内部类
            //内部类方法
            public void  beat() {
                System.out.println("心脏跳动");
                System.out.println("我叫:"+name);
            }
        }
    }

    下面分别介绍两种方式访问内部类:

    间接方式访问内部类

    Demo01InnerClass.java

    public class Demo01InnerClass {
        public static void main(String[] args) {
            Body body = new Body();//外部类对象
    
            //通过外部类的对象,调用外部类的方法,里面间接使用内部类Heart
            body.methodBody();

    直接方式访问内部类

    public class Demo01InnerClass {
        public static void main(String[] args) {
            Body body = new Body();//外部类对对象
    
            //外部内名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
            Body.Heart heart = new Body().new Heart();
            heart.beat();
        }
    }

    外部类和内部类变量重名问题

    当外部类的变量和内部类变量重名时,在内部类方法中访问外部类变量的格式是:外部类.this.外部类成员变量名

    public class Outer {
        int number = 10;
    
        public class Inner {
            int number = 20;
    
            public  void methodInner() {
                int number =30;//内部类方法的局部变量
                System.out.println(number);//就近原则
                System.out.println(this.number);
                System.out.println(Outer.this.number);//外部类的成员变量
            }
        }
    }

    30
    20
    10


    局部内部类

    如果类是定义在一个方法内部的,那么这就是一个局部内部类。
    “局部”:只有当前所属的方法才能使用它,出了这个方法外面就不能用了。

    定义格式

    修饰符 class 外部类名称 {
        修饰符 返回值类型  外部类方法名称(参数列表) {
            class 局部内部类名称 {
                //...
            }
        }
    }

    Outer.java含有局部内部类

    public class Outer {
        public void methodOuter() {
    
            class Inner {
                int num = 10;
                public void methodInner() {
                    System.out.println(num);//10
                }
            }
            //这个内部列只有当前所属方法能够访问这个类,出了这个方法就不能用了
            Inner inner = new Inner();
            inner.methodInner();
        }
    }

    DemoMain.java

    public class DemoMain {
    
        public static void main(String[] args) {
            Outer outer = new Outer();
            outer.methodOuter();
        }
    }

    结果:
    10

    注意:

    局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】
    备注:从java 8+开始,只要局部变量事实不变,那么final关键字可以省略。
    原因:
    1. new 出来的对象在堆内存当中。
    2. 局部变量是跟着方法走的,在栈内存当中。
    3. 方法运行结束后,立刻出栈,局部变量就会立刻消失。
    4. 但是new出来的对象在堆当中持续存在,直到垃圾回收消失。

    public class MyOuter {
        public void methodOuter() {
            final int num = 10;//所在方法的局部变量
    
            /*在栈中的局部变量可能随着方法结束出栈消失了,但是创建的内部类对象还存在。
            对象使用常量时能直接将常量copy进来,这时就要保证这个常量是不可更改的,也就是final。
            */
            //num = 20;
    
            class MyInner {
                public  void methodInner() {
                    System.out.println(num);
                }
            }
            Inner myinner = new MyInner();
            inner.methodInner();
        }
    }

    修饰内部类的权限

    public > protected > (default) > private
    定义一个类的时候,权限修饰符规则:

    1. 外部类:public / (default)
    2. 成员内部类:都可以写,public > protected > (default) > private
    3. 局部内部类:什么都不能写,但不是de

    匿名内部类

    如果接口的实现类(或者是父类的子类)只需要使用唯一的一次。
    那么这种情况下就可以省略调该类的定义,而改为使用【匿名内部类】。

    匿名内部类定义格式:

    接口名称 对象名 = new 类名或者接口名称() {
        //覆盖重写所有抽象方法
    };

    代表继承了或者实现了该接口的子类对象。

    ==接口MyInterface.java==

    public interface MyInterface {
        void method1();//抽象方法
        void method2();
    }

    ==接口实现类MyInterfaceImp.java==

    public class MyInterfaceImpl implements  MyInterface {
    
    
        @Override
        public void method1() {
            System.out.println("实现类覆盖重写了方法1");
        }
    
        @Override
        public void method2() {
            System.out.println("实现了覆盖重写方法2");
        }
    }

    测试类

    一、一般接口实现方法

    DemoMain.java

    public class DemoMain {
        public static void main(String[] args) {
    //        MyInterface impl = new MyInterfaceImpl();
    //        impl.method();
            }
    }

    匿名内部类实现接口

    DemoMain.java

    public class DemoMain {
        public static void main(String[] args) {
    
            //使用匿名内部类,但不匿名对象,对象名称就叫obj
            MyInterface objA = new MyInterface() {
                @Override
                public void method1() {
                    System.out.println("匿名内部类实现了方法1-A");
                }
                @Override
                public void method2() {
                    System.out.println("匿名内部类实现了方法2-A");
                }
            };
            objA.method1();
            objA.method2();
    
            System.out.println("----------我是分割线----------");
    
            //使用匿名内部类,而且省略了对象名称,也是匿名对象
            new MyInterface() {
                @Override
                public void method1() {
                    System.out.println("匿名内部类实现了方法1-B");
                }
                @Override
                public void method2() {
                    System.out.println("匿名内部类实现了方法2-B");
                }
            }.method1();
        }
    }

    结果:
    匿名内部类实现了方法1-A
    匿名内部类实现了方法2-A
    ----------我是分割线----------
    匿名内部类实现了方法1-B

    匿名内部内应用

    • 实现倒计时5秒。
    public class Demo02_Time {
        public static void main(String[] args) {
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    System.out.println("倒计时5秒");
                }
            },5000);//倒计时5秒
        }
    }

    注意事项:

    对格式进行解析:"new 接口名称 {...};"进行解析

    1. new代表创建对象的动作
    2. 接口名称就是匿名内部类需要实现那个接口
    3. {…}这才是匿名内部类的内容

    注意:

    1. 这个类只需要使用一次。匿名内部类在创建对象时,只能使用唯一一次。
      如果希望多次希望多次创建对象,而且内容一样的话,那么就必须使用单独定义的实现类。

    2. 匿名对象,在调用的时候,只能调用唯一一次。
      如果希望同一个对象,调用多次方法,那么必须给对象取一个名字。

    3. 匿名内部类是省略了【实现类/子类】,但是匿名对象是省略了【对象命名】。

    强调:匿名和匿名对象不是一回事。

    展开全文
  • JAVA常用内部类

    2020-12-22 12:16:34
    4、匿名内部:特殊的局部内部类,没有类名,只能作为子类出现且只能创建一个对象。 Object Object有什么特点? Object是所有的父类(超类,根,基类),Java中所有都是Object的子类 Object中所...
  • java调用局部内部类中的方法

    千次阅读 2019-08-09 12:21:26
    局部内部类中方法的调用

    使用Junit单元测试
    局部内部类封装在外部类的一个方法中,此方法一般会有一个返回值,返回该局部类类型

    package com.yzy.innerclass;
    
    import org.junit.Test;
    
    /**
     * @className LocalInnerClass.java
     * @author yangsir
     * @version V1.0
     * @date 2019年8月9日-上午12:03:03
     * @description 如何调用局部内部类
     */
    public class LocalInnerClass {
    	@Test
    	public void test1() {
    
    		// 1常规
    		Work w = new Student();// 父类引用指向子类对象
    		w.doWork();// 调用子类重写的接口中的方法
    		// 匿名类的对象
    		Work w1 = new Work() {
    			@Override
    			public void doWork() {
    				System.out.println("工作");
    			}
    		};
    		w1.doWork();// 调用匿名类的方法
    		System.out.println("===================================================");
    	}
    
    	@Test
    	public void test2() {
    
    		// 2匿名类的匿名对象
    		new Work() {
    			@Override
    			public void doWork() {
    				System.out.println("工作");
    
    			}
    		}.doWork();// 直接用new().work的形式,要重写doWork方法
    		System.out.println("===================================================");
    	}
    
    	@Test
    	public void test3() {
    
    		// 1.调用局部内部类
    //		Work work = new LocalInnerClass().getWork();  //new Teacher();  //创建一个局部内部类对象
    //		work.doWork();//调用getWork方法输出讲课(已注释)
    		// 2.调用
    		Work work = new LocalInnerClass().getWork();// 创建一个局部内部类对象
    		work.doWork();// 调用
    	}
    
    	// 局部内部类
    	public Work getWork() {
    		// 1局部内部类
    //		class Teacher implements Work{//局部内部类实现接口,重写doWork方法,返回值为Teacher
    //			@Override
    //			public void doWork() {
    //				System.out.println("讲课");
    //			}
    //		} 
    //		return new Teacher();//返回一个Teacher对象
    		// 2局部内部类 匿名类的匿名对象
    		return new Work() {// 直接return一个匿名对象,然后重写里面的方法即可,注意这里的括号
    			@Override
    			public void doWork() {
    				System.out.println("员工在工作");
    
    			}
    		};
    	}
    }
    
    interface Work { // 一个接口
    	void doWork();
    }
    
    class Student implements Work {// 实现接口的类,有自己的方法
    
    	@Override
    	public void doWork() {
    		System.out.println("学习");
    	}
    
    }
    
    

    下面放一位小姐姐的总结图
    内部类

    展开全文
  • 在外部的方法中创建内部类对象

    千次阅读 2018-03-19 12:03:43
  • 如何调用局部内部类中的方法

    千次阅读 2018-04-01 10:12:57
    内部:将写在其他的内部,可以写在其他的成员位置和局部位置局部内部类:将写在其他的局部方法中例如public class outer { public void out(){ int i=2; class Inner{ int a=1; public void ...
  • 局部内部类(包含匿名内部) 成员内部 定义格式: 修饰符 class 外部名称 { 修饰符 class 内部名称 { // .... } // .... } 内部的class文件命名为:外部$内部.class 使用成员内部 间接方式:...
  • 我们都知道方法中的匿名/局部内部类是能够访问同一个方法中的局部变量的,但是为什么局部变量要加上一个final呢? 首先我们来研究一下变量生命周期的问题,局部变量的生命周期是当该方法被调用时在栈中被创建,当...
  • * 标题:Java内部[成员内部局部内部类、匿名内部和静态内部] * * 作者:Nstar * * 时间:2020年3月13日 * * 内容: * * 问:什么是内部? * 答:在 Java 中,可以将一个定义在另一个里面或者一...
  • 除了静态内部了、普通内部外,还有一个局部内部类,匿名内部其实相当于它儿子,只是把类名这些都省略了。它在实际开发中用的很少,它是在方法中定义的,既然是方法里头的东西,那么它就不能定义静态,静态...
  • 目 录 1.内部与外部 2.内部的特点:内部可以直接访问外部的...局部内部类,在外界没有直接创建对象的语法 局部内部类访问外部的局部变量: 1.内部与外部 将一个A 定义到另一个B的内部,...
  • (2)外部要想访问内部类的成员,必须要创建内部类对象。 按照内部类中定义的位置不同,可以分为如下两种格式: (1)成员内部类(在成员位置): 1)定义在的成员位置上。 2)内部类可以访问外部的...
  • 前言  前面提到过,可以在代码块里创建内部,典型的方式是在一个方法体...下面的例子对局部内部类与匿名内部创建进行了比较。 示例源码 package com.mufeng.thetenthchapter; interface Coun
  • 创建各种内部类对象的方法

    千次阅读 2019-03-10 11:32:55
    package cn.qsy.op; /** 测试内部 @author qsy */ public class TestInner { public static void main(String[] args) { //成员内部 Outer.Inner inn=new ...//局部内部类 Outer inn2=new Outer...
  • 重点!重点!重!点 ...原因是编译程序实现上的困难:内部类对象的生命周期会超过局部变量的生命周期。局部变量的生命周期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束...
  • Java如何在main方法中实例化内部类对象

    千次阅读 多人点赞 2019-03-11 15:33:42
    今天我在实例化一个是编译器报以下错误: No enclosing instance of type Person is accessible. Must qualify the allocation with an enclosing instance of type Person (e.g. x.new A() where x is an ...
  • Java基础系列(三十):局部内部类

    千次阅读 2018-09-04 21:04:52
    局部内部类就是定义在某个方法内部的内部,它的作用域仅限于这个方法。 Why 当我们在外围中定义的内部仅仅在某个方法中使用了一次,这种情况下,我们就可以选择去使用局部内部类。 How 以上节课的例子...
  • 闭包和局部内部类的区别

    千次阅读 2019-07-03 20:43:34
    局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。 闭包(Closure)是一种能被调用的对象,它保存了创建它的作用域的信息。JAVA并不能显式地支持闭包,但是在...
  • 局部内部类是指定义在方法中的。 看下面的例子,哪些变量可以被局部内部类Inner访问并修改? public class Test{ private int a; static int b; public void func(){ int j=10; class Inner{ } } }...
  • 一 对于非静态内部类,不能有静态成员,例如变量,方法等。静态内部类的非静态成员可以...内部类的实例一定要绑定在外部类对象上。 一个内部类可以定义在一个中,一个方法中甚至一个表达式中。 分类: 内部类
  • 【内部局部内部类及应用

    千次阅读 2016-12-10 16:59:13
    定义在代码块,方法体内的局部内部类 局部内部类访问外部的成员使用:外部类名.this.成员名 对外部世界完全隐藏,只在其作用域内生成对象 局部不能加访问修饰符,因为它们不是成员 成员内部不能与外部...
  • B:在局部位置,可以创建内部类对象,通过对象调用内部方法,来使用局部内部类功能 面试题: 局部内部类访问局部变量的注意事项? A:局部内部类访问局部变量必须用final修饰 B:为什么呢? 局部变量是...
  • 原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法。今天我们就来一探究竟。下面是本文的目录大纲:  一.内部类基础  二.深入理解内部类  三...
  • 有些情况下,我们把一个放在另一个内部定义,称为内部类(innerclasses)。 内部类可以使用public、default、protected 、private以及static修饰。而外部顶级(我们以前接触的)只能使用public和default修饰...
  • Java的局部内部类

    千次阅读 2019-06-09 13:35:24
    一点睛 如果把一个内部放在方法中定义,那么这个内部就是一...如果需要用局部内部类定义变量、创建实例或派生子,那么都只能在局部内部类所在的方法中进行。 二代码 public class LocalInnerClass { publ...
  • java——局部内部类

    2017-07-26 22:18:41
    2-在局部位置,可以创建内部类对象,通过对象调用内部方法,来使用局部内部类功能。 面试题:  局部内部类访问局部变量的注意事项; **局部内部类访问局部变量必须用final修饰 因为:局部变量是随着方法的...
  • Java如何调用内部类的方法

    千次阅读 2021-02-12 13:58:42
    展开全部参阅下段: 《内部》内部是指32313133353236313431303231363533e4b893e5b19e31333262353462在一个外部的内部再定义一个。...内部主要有以下几:成员内部局部内部类、静...
  • 详解 Java 内部类

    千次阅读 2021-03-06 18:10:33
    从种类上说,内部可以分为四类:普通内部、静态内部、匿名内部局部内部类。我们来一个个看:普通内部这个是最常见的内部之一了,其定义也很简单,在一个里面作为的一个字段直接定义就可以了,例:...
  • Test.java(测试):package cn.xxx.demo; public class Test { public static void main(String[] args) { ... // 内部类对象创建格式。 in.inner(); // 调用内部类对象方法。 } } Outer.ja...
  • 详细介绍了Java中的内部的概念,及各种内部的访问案例演示。包括非静态内部、静态内部局部内部类、匿名内部

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 260,961
精华内容 104,384
关键字:

局部内部类创建对象