java内部类分为: 静态嵌套类、成员内部类、方法内部类、匿名内部类。
内部类的共性
(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量。
静态嵌套类
package com.test.innerclass; class StaticInner { private static String info = "HelloWorld"; /** * 静态内部类 * 只能访问外部类的静态成员变量及方法 */ static class Inner { public String getInfo() { return info; } } } public class StaticInnerClassTest { public static void main(String[] args) { //获取静态内部类实例 StaticInner.Inner inner = new StaticInner.Inner(); //输出静态内部类类名 System.out.println(inner.getClass().getName());//com.test.innerclass.StaticInner$Inner //调用静态内部类方法 String info = inner.getInfo(); System.out.println(info);//HelloWorld } }
成员内部类
package com.test.innerclass; class MemberInner { private String name = "hello"; //成员内部类 class Inner { private String name = "world"; //成员内部类访问外部类的成员变量 public String getOutMemberName() { String outMemberName = MemberInner.this.name; return outMemberName; } //成员内部类访问外部类的方法 public String getOutMethod() { return MemberInner.this.getName(); } public String getInnerName() { return this.name; } } public String getName () { return name; } public Inner getInner() { return new Inner(); } } public class MemberInnerClassTest { public static void main(String[] args) { MemberInner.Inner inner = new MemberInner().new Inner(); System.out.println(inner.getOutMemberName());//hello System.out.println(inner.getOutMethod());//hello System.out.println(inner.getInnerName());//world System.out.println(new MemberInner().getInner().getClass().getName());//com.test.innerclass.MemberInner$Inner } }
方法内部类
package com.test.innerclass; class LocalInner { private String name = "cxl"; public String getName() { final String innerName = "world"; /** * 方法内部类(使用比较少) * 1.只能在方法内实例化 * 2.不能访问非final的局部变量 */ class Inner { public String getName() { return name; } public void say() { System.out.println("hello " + innerName); } } Inner inner = new Inner(); inner.say(); return inner.getName(); } } public class LocalInnerCalssTest { public static void main(String[] args) { LocalInner localInner = new LocalInner(); System.out.println(localInner.getName()); //hello world //cxl } }
匿名内部类
1.继承式的匿名内部类
父类Car
package com.test.innerclass; public class Car { public void drive() { System.out.println("Driving a car"); } }
Demo类
package com.test.innerclass; /** * 匿名内部类(没有名字的内部类) * 使用场景:只使用一次,通常用来简化代码编写(继承父类或实现接口并从重写父类或者接口中的方法) * 一个匿名内部类一定是在new的后面,用其隐含继承一个类或实现一个接口 */ public class CarDemo { public static void main(String[] args) { //最简单的一个匿名类的实例,其继承了父类Car Car carInner = new Car() { }; //输出匿名类类名 System.out.println(carInner.getClass().getName());//com.test.innerclass.CarDemo$1 //输出匿名类父类 System.out.println(carInner.getClass().getSuperclass().getName());//com.test.innerclass.Car //调用父类方法 carInner.drive();//输出结果:Driving a car //相当于下面写法 new Car() { }.drive();//输出结果:Driving a car //获取一个匿名类实例,并重写父类中的drive()方法 Car car = new Car(){ public void drive() { System.out.println("Driving In My Car"); } }; //调用自己重写的方法 car.drive();//Driving In My Car } }
2.接口式的匿名内部类
接口
package com.test.innerclass; public interface Vehicle { public void drive(); public Bus carry(Passenger passenger); }
Passenger类
package com.test.innerclass; public class Passenger { private String name; private int age; public Passenger(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Bus类
package com.test.innerclass; public class Bus { private int cost; public int getCost() { return cost; } public void setCost(int cost) { this.cost = cost; } }
Demo类
package com.test.innerclass; public class VehicleDemo { /** * @param args */ public static void main(String[] args) { //vehicle是一个父类的对象引用,其指向匿名子类的对象 Vehicle vehicle = new Vehicle() { @Override public void drive() { System.out.println("Driving In My Car"); } @Override public Bus carry(Passenger passenger) { Bus bus = new Bus(); if(passenger.getAge() < 18) { bus.setCost(1); } return bus; } }; vehicle.drive();//Driving In My Car Passenger passenger = new Passenger("小明",10); Bus bus = vehicle.carry(passenger); System.out.println(passenger.getName() + "乘公交车的费用 :" + bus.getCost() + "元");//小明乘公交车的费用 :1元 } }
3.参数式的匿名内部类
Speaker类
package com.test.innerclass; public class Speaker { public String speech(Content content,String name) { return content.sayHello(name); } }
Content接口
package com.test.innerclass; public interface Content { public String sayHello(String name); }
Demo类
package com.test.innerclass; class SpeakerDemo { public static void main(String[] args) { Speaker speaker = new Speaker(); String helloInfo = speaker.speech(new Content() { @Override public String sayHello(String name) { return "hello," + name; } }, "everyone"); System.out.println(helloInfo);//hello,everyone } }
匿名内部类应用
interface ICount { int count(); }
class Parent { int i = 0; int count() { return i++; } }
类Child,它既想继承Parent的count()方法,又想实现ICount接口中的count()方法,这个时候怎么办呢?内部类就可以大显身手了:
class Child extends Parent { ICount getCount() { return new ICount { int i = 0; int count() { return (i *= 2); } }; } }
为什么需要内部类
典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是:
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
相关推荐
Java 内部类详解 Java 内部类是一种高级特性,允许在一个类的定义内部创建另一个类。这种设计模式提供了更灵活的代码组织方式,同时还可以实现特定的封装和访问控制。内部类主要分为四种类型:静态内部类、成员内部...
### Java内部类总结 在Java编程语言中,内部类是一个重要的概念,它允许开发者在一个类的内部定义另一个类。这种特性极大地增强了代码的封装性和复用性,同时也为解决特定问题提供了灵活的方法。本文将围绕Java内部...
### Java内部类详解 #### 一、内部类的分类与概念 Java的内部类机制是其强大特性之一,它允许类作为另一个类的成员存在,从而增强了代码的封装性和复用性。根据定义和作用域的不同,Java内部类主要分为四类: 1. ...
Java 内部类是Java语言特性中的一个重要组成部分,它允许我们在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这使得内部类在实现复杂逻辑和封装上具有很大的灵活性。下面我们将详细...
### Java内部类的应用场景 #### 场景一:当某个类除了它的外部类,不再被其他的类使用时 内部类的使用场景之一是当某个类仅需被其外部类使用时。这种情况下,将此类定义为内部类可以提高代码的封装性和可维护性。 ...
Java内部类是Java语言提供的一种独特特性,它允许我们在一个类的定义内部定义另一个类。这种内部类可以是成员内部类、局部内部类、匿名内部类或静态内部类,每种都有其特定的用途和使用场景。在这个"java内部类使用...
12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类...
Java内部类是Java语言的一个特色特性,它允许我们在一个类的内部定义另一个类。这种设计模式在处理一些特定情况时非常有用,例如实现匿名回调、封装特定逻辑或创建与外部类有紧密关系的类。本篇文章将深入探讨Java...
Java内部类是Java语言的一个独特特性,它允许我们在一个类的内部定义另一个类。这种设计提供了更高级别的封装和组织代码的方式。以下是关于内部类及其相关知识点的详细说明: 1. **内部类基本语法** - **实例内部...
### JAVA内部类总结 在Java编程语言中,内部类(Inner Classes)是一种非常重要的特性,它允许我们在一个类的内部定义另一个类。这种结构不仅能够提高代码的组织性,还能帮助我们更好地处理类与类之间的关系。根据...
Java内部类是Java语言提供的一种独特机制,它允许在一个类的内部定义另一个类。这种设计模式使得代码结构更紧凑,可以更好地封装和隐藏实现细节,同时也增强了代码的复用性。内部类分为几种类型,包括成员内部类、...
Java 内部类总结 Java 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 protected 和 private 修饰(而外部类只能使用 public 和缺省的包...
Java内部类是Java语言特性中一个独特而强大的部分,它允许在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这使得内部类在实现某些特定设计模式时非常有用。本篇文章将深入探讨Java中的...
Java内部类详解 Java内部类是Java语言中的一种特殊类别,它是指定义在另外一个类内部的类。内部类可以访问外部类的所有成员变量和方法,包括私有的变量和方法。内部类可以分为四种:成员内部类、静态嵌套类、方法...
谈Java内部类的四个应用场景
Java内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类提供了增强封装的能力,使得内部类可以被隐藏在外部类中,仅对外部类可见,从而增加了代码的隐私性和安全性。同时,内部...
### Java内部类的作用 #### 一、定义及概念 内部类,顾名思义,指的是一个定义在另一个类内部的类。这样的结构让内部类能够访问外部类的成员(包括私有成员),并且允许内部类拥有不同的访问级别,如`private`、`...
Java内部类是Java语言的一个重要特性,它允许我们在一个类的内部定义另一个类。这种设计模式使得代码结构更加紧凑,同时也提供了更高级的封装和抽象。内部类主要有两种类型:成员内部类和局部内部类。 1. 成员内部...