`

java内部类

    博客分类:
  • java
 
阅读更多

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内部类的讲解

    ### Java内部类详解 #### 一、内部类的分类与概念 Java的内部类机制是其强大特性之一,它允许类作为另一个类的成员存在,从而增强了代码的封装性和复用性。根据定义和作用域的不同,Java内部类主要分为四类: 1. ...

    Java 内部类

    Java 内部类是Java语言特性中的一个重要组成部分,它允许我们在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这使得内部类在实现复杂逻辑和封装上具有很大的灵活性。下面我们将详细...

    浅谈Java内部类的四个应用场景

    ### Java内部类的应用场景 #### 场景一:当某个类除了它的外部类,不再被其他的类使用时 内部类的使用场景之一是当某个类仅需被其外部类使用时。这种情况下,将此类定义为内部类可以提高代码的封装性和可维护性。 ...

    java内部类使用例子

    Java内部类是Java语言提供的一种独特特性,它允许我们在一个类的定义内部定义另一个类。这种内部类可以是成员内部类、局部内部类、匿名内部类或静态内部类,每种都有其特定的用途和使用场景。在这个"java内部类使用...

    12.java内部类.zip

    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 内部类 PPT

    Java内部类是Java语言的一个独特特性,它允许我们在一个类的内部定义另一个类。这种设计提供了更高级别的封装和组织代码的方式。以下是关于内部类及其相关知识点的详细说明: 1. **内部类基本语法** - **实例内部...

    JAVA内部类总结

    ### JAVA内部类总结 在Java编程语言中,内部类(Inner Classes)是一种非常重要的特性,它允许我们在一个类的内部定义另一个类。这种结构不仅能够提高代码的组织性,还能帮助我们更好地处理类与类之间的关系。根据...

    java 内部类使用(内部匿名类)

    Java内部类是Java语言提供的一种独特机制,它允许在一个类的内部定义另一个类。这种设计模式使得代码结构更紧凑,可以更好地封装和隐藏实现细节,同时也增强了代码的复用性。内部类分为几种类型,包括成员内部类、...

    java内部类总结(含概念和实例)

    Java 内部类总结 Java 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 protected 和 private 修饰(而外部类只能使用 public 和缺省的包...

    java 内部类 局部内部类 匿名类 实例代码

    Java内部类是Java语言特性中一个独特而强大的部分,它允许在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这使得内部类在实现某些特定设计模式时非常有用。本篇文章将深入探讨Java中的...

    Java语法总结 - 内部类

    Java内部类详解 Java内部类是Java语言中的一种特殊类别,它是指定义在另外一个类内部的类。内部类可以访问外部类的所有成员变量和方法,包括私有的变量和方法。内部类可以分为四种:成员内部类、静态嵌套类、方法...

    Java内部类的四个应用场景

    谈Java内部类的四个应用场景

    java内部类使用总结

    Java内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类提供了增强封装的能力,使得内部类可以被隐藏在外部类中,仅对外部类可见,从而增加了代码的隐私性和安全性。同时,内部...

    Java内部类的作用

    ### Java内部类的作用 #### 一、定义及概念 内部类,顾名思义,指的是一个定义在另一个类内部的类。这样的结构让内部类能够访问外部类的成员(包括私有成员),并且允许内部类拥有不同的访问级别,如`private`、`...

    Java内部类_动力节点Java学院整理

    Java内部类是Java语言的一个重要特性,它允许我们在一个类的内部定义另一个类。这种设计模式使得代码结构更加紧凑,同时也提供了更高级的封装和抽象。内部类主要有两种类型:成员内部类和局部内部类。 1. 成员内部...

Global site tag (gtag.js) - Google Analytics