内部类
内部类本身是一个独立且完善的类结构,在一个类的内部除了属性和方法之外可以继续使用class定义内部类
class Outer { //外部类
private String msg = "www.baidu.com" ;//私有成员属性
public void fun() { // 普通方法
Inner in = new Inner() ; // 实例化内部类对象
in.print() ;//调用内 部类方法
}
class Inner { //在Outer类的内部定义了Inner类
public void print() {
System.out.println(Outer.this.msg) ;// Outer类中的属性
}
}
}
public class JavaDemo {
public static void main (String args [] ) {
Outer out = new Outer () ;//实例化外部类对象
out.fun() ; //调用外部类中的方法
}
}
内部类的优势在于轻松的访问外部类的私有属性
定义内部类
- 外部依旧可以产生内部类的实例化对象,此时的内部类实例化对象的格式如下(但如果在内部类前加private属性,那么外部类将无法产生内部类实例化对象):
外部类 . 内部类 内部类对象 = new 外部类() . new 内部类();
- 接口也可以使用内部结构:
interface IChannel { // 定义接口
public void send (IMessage msg) ;// 发送消息
interface IMessage {//内部接口
public String getContent() ; //获取消息内容
}
}
class Channel Imp1 implements IChannel {
public void send(IMessage msg) {
System.out.println("发送消息:"+ msg. getContent()) ;
}
class MessageImpl implements IMessage {//内部类实现内部接口
public String getContent() {
return "www.baidu.con" ;
}
}
}
public class JavaDemo {
public static void main (String args[] ) {
IChannel channel = new ChannelImpl() ;
channel.send(((ChannelImpl)channel).new MessageImpl()) ;
}
}
- 抽象类也可以使用内部结构
interface IChannel { // 定义接口
public void send() ;//发送消息
abstract class AbstractMessage {//内部抽象类
public abstract String getContent() ;
}
}
class ChannelImpl implements IChannel {
public void send() {
AbstractMessage msg = new MessageImpl() ;
System.out.println(msg.getContent()) ;
}
class MessageImpl extends Abs tractMessage {//继承内部抽象类
public String getContent() {
return "www .baidu. com" ;
}
}
}
public class JavaDemo {
public static void main (String args [ ] ) {
IChannel channel = new ChannelImpl() ;
channel . send()
}
}
- 接口内部也可以进行内部实现
interface IChannel {//定义接口
public void send() ;// 发送消 息
class ChannelImpl implements IChannel {//内部类实现外部接口
public void send () {
System.out.println("www.baidu.cn") ;
}
}
public static IChannel getInstance () {//利用static关键字实现
return new ChannelImpl () ;
}
}
public class JavaDemo {
public static void main (String args []) {
IChannel channel = IChannel . getInstance() ;
channel. send() ;
}
}
static定义内部类
如果说现在在内部类上使用了static 定义,那么这个内部类就变为了“外部类”,static定义的都是独立于类的结构,所以该类结构就相当于是一个独立的程序类了。需要注意的是,static 定义的不管是类还是方法只能够访问static成员,所以static定义的内部类只能够访问外部类中的static属性或方法;
使用static定义内部接口:
interface IMessageWarp { //消息包装
static interface IMessage {//获得消息(内部接口)
public String getContent() ;
}
static interface IChannel {//消息通道(内部接口)
public boolean connect() ;
}
public static void send(IMessage msg , IChannel channel) {
if (channel . connect() ) {
System. out . println(msg . getContent()) ;
} else {
System . out . println("消息通道无法建立,消息发送失败! ")
}
}
}
class Defaul tMessage implements IMessageWarp. IMessage {//实现内部接口格式(外部接口.内部接口)
public String getContent () {
return "wWW . baidu. com" ;
}
}
class NetChannel implements IMessageWarp . IChannel {//实现内部接口
public boolean connect () {
return true ;
}
}
public class JavaDemo {
public static void main (String args[]) {
IMessageWarp . send(new DefaultMessage(), new NetChannel ()) ;
}
}
使用static定义内部接口,主要是因为这些操作属于一组相关的定义(消息包裹)方便管理,有了外部接口之后可以更加明确的描述出这些接口的主要作用 。
方法中定义内部类
方法中提供有内部类的定义,内部类可以直接访问外部类中的私有属性也可以直接访问方法中的参数。
class Outer {
private String msg = "www . baidu.com" ;
public void fun (long time) {
class Inner { //内部类
public void print () {
System.out.println(Outer. this .msg) ;
System.out.println(time) ;
}
}
new Inner().print() ;//方法中直接实例化内部类对象
}
}
public class JavaDemo {
public static void main (String args[]) {
new Outer().fun(3115);
}
}
对于方法中的内部类直接访问方法中的参数功能是在JDK1.8之后的版本出现的。
匿名内部类
匿名内部类是一种简化的内部类的处理形式,其主要是在抽象类和接口的子类上使用的。
这里使用两个程序说明,程序一:接口(IMessage )的子类(MessageImpl)只使用一次的前提下,这个子类就没必要定义为一个单独的类;程序二:改进程序一,使用匿名内部类(只能够使用一次的、结构固定的)
- 程序一
interface IMessage {
public void send (String str);
}
class MessageImpl implements IMessage {
public void send(String str) {
System . out . println(str) ;
}
}
public class JavnDemo{
public static void main (String args [] ){
TMessage msg = new MessageImpl () ;
msg. send( "www.baidu.com") ;
}
}
- 程序二:
interface IMessage {
public void send (String str) ;
}
public class JavaDemo {
public static void main (String args []) {
IMessage msg = new IMessage() { //匿名内部类
public void send(String str) {
System.out.println(str) ;
}
};
msg.send( "www .baidu.com") ;
}
}
另外:在接口中直接定义匿名内部类
interface IMessage {
public void send (String str) ;
public static IMessage getInstance() {//匿名内部类
return new IMessage() {
public void send(String str) {
System.out.println(str) ;
}
}
}
}
public class JavaDemo {
public static void main(String args[]) {
IMessage.getInstance().send( "www.baidu.com") ;
}
}