内部类详解
目录
一:基本概念及范例:
简单来说就是在一个类的内部可以定义其他的类,这样的类就称它为内部类。
1.基本定义:
如果说到内部类,肯定其本身是一个独立且完善的类结构,在一个类的内部除了属性和方法外可以继续使用class定义内部类。
2.内部类的优缺点:
缺点:从整体的代码结构上来讲内部类的结构并不合理,所以内部类最大的缺陷在于破坏了程序的结构,但是破坏需要有目的的破坏,而不是随意破坏。
优势:轻松的访问外部类私有属性(如果要想清楚内部类的优势,我们则需要将它拿到外部来)
示例一:
@author xiaomu
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(msg); // 效果与下面相同
System.out.println("---------------------------");
System.out.println(Outer.this.msg);
}
}
}
public class Demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Outer outer = new Outer(); // 实例化外部类
outer.fun(); // 调用外部类方法
}
}
如果外部想要访问msg的属性,则需要getter和setter方法,而getter、setter方法需要有实例化对象调用。
示例二:
@author xiaomu
class Outer{
private String msg = "www.baidu.com";
public void fun() {
Inner in = new Inner();
in.print();
}
public String getMsg() {
return this.msg;
}
}
class Inner{
// 3.Inner这个类对象实例化的时候需要Outer类的引用
private Outer outer;
// 4.x 应该通过Inner类的构造方法获取Outer类对象
public Inner (Outer outer) {
this.outer = outer;
}
public void print() {
// 2. 而getter和setter方法需要有实例化对象调用
//System.out.println(new Outer().getMsg());
System.out.println(this.outer.getMsg());
}
}
public class Demo2{
public static void main(String[] args) {
// TODO Auto-generated method stub
Outer outer = new Outer();
outer.fun();
}
}
二:内部类的相关说明
1.概述:
使用了内部类之后,内部类与外部类之间的私有操作的访问就不再需要通过setter和getter以及其它的间接方式完成了,可以直接进行处理操作。
使用了内部类之后,内部类与外部类之间的私有操作的访问就不再需要通过setter和getter以及其它的间接方式完成了,可以直接进行处理操作。
2.示例一:
@author xiaomu
class Outer{
private String msg = "www.baidu.com";
public void fun() {
Inner in = new Inner();
in.print();
System.out.println(in.icoString);
}
class Inner{
private String icoString = "hello words";
public void print() {
System.out.println(msg);
System.out.println("---------------------------");
System.out.println(Outer.this.msg);
}
}
}
public class Demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Outer outer = new Outer(); // 实例化外部类
outer.fun(); // 调用外部类方法
}
}
3.要点:
需要注意的是,内部类本身也属于一个类,虽然在大部分情况下内部类往往是被外部类包裹的,但是外部依然可以产生内部类的实例化对象,而此时内部类的实例化对象的格式如下: 外部类.内部类 内部类对象 = new 外部类().new 内部类() ;
三:static定义内部类
1.概述
如果说现在内部类上使用了static定义,那么这个内部类就变成了“外部类”,static定义的都是独立于类的结构,所以该类结构就相当于是一个独立的程序类了
2.注意
static定义的不管是类还是方法只能够访问static成员,所以说static定义的内部类只能够访问外部类中的static属性或方法。
3.实例化static内部类对象:
外部类.内部类 内部类对象 = new 外部类.内部类();
static定义内部类的方式不怎么常用,常用的是static定义接口。
示例一:
@author xiaomu
class Outer{
private static final String MSG = "www.baidu.com";
static class Inner{
public void print() {
System.out.println(Outer.MSG);
}
}
}
public class Demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Outer.Inner outer = new Outer.Inner(); // 实例化static内部类对象
outer.print();
}
}
四:定义内部类
1.概述:
内部类可以在任意的结构中进行定义,这就包括了:类中、方法中、代码块中,内部类可以直接访问外部类中的私有属性及方法中的参数,对于方法中的参数直接访问时从JDK1.8开始的,而在1.8之前,如果方法中定义的内部类要想访问方法中的参数则参数前必须追加final。
示例一:
@author xiaomu
class Outers{
private String MSD = "www.baidu.com";
public void fun(long time) {
class Ineer{
public void print() {
System.out.println(Outers.this.MSD);
System.out.println(time);
}
}
new Ineer().print(); // 在方法中直接实例化内部类对象
}
}
public class Demo1{
public static void main(String[] args) {
// TODO Auto-generated method stub
new Outers().fun(16565482L);
}
}
五:匿名内部类
一:概述:
有些类只使用一次,为了方便起见,所以选用匿名内部类。
二:普通使用访问示例:
@author xiaomu
interface IMessage{
public void send(String string);
}
class MessageImpl implements IMessage{
@Override
public void send(String string) {
// TODO Auto-generated method stub
System.out.println(string);
}
}
public class Demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
IMessage msg = new MessageImpl();
msg.send("www.baidu.coms");
}
}
三:匿名内部类访问示例:
@author xiaomu
interface IMessage{
public void send(String string);
}
public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
IMessage msg = new IMessage(){ // 匿名内部类
@Override
public void send(String string) {
// TODO Auto-generated method stub
System.out.println(string);
}
};
msg.send("www.baidu.coms");
}
}
有时候为了更加方便的体现出匿名内部类的使用,往往可以利用静态方法做一个内部类的实现。
四:在接口中定义匿名内部类的实现示例:
@author xiaomu
interface IMessage{
public void send(String string);
public static IMessage getIntestance() {
return new IMessage() {
@Override
public void send(String string) {
// TODO Auto-generated method stub
System.out.println(string);
}
};
}
}
public class Demo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
IMessage.getIntestance().send("www.baidu.com");
}
}