您的位置:首页 > 其它

内部类 枚举(enum)基本属性和使用详解

2016-10-11 23:33 387 查看

☆☆☆内部类和枚举的使用解析 枚举创建于调用

一、内部类

概念:

一个类中又定义了一个完整的类结构。

被包含的类 称为 内部类
类体中包含其他类的类 称为 外部类

其他的类 称为 外部其他类


1、分类

(一)成员内部类

特点:
1.可以加访问修饰符

2.作用范围比较大,外部类和外部其他类都能访问到
分类
<1>普通成员内部类

1.外部类的成员和内部类的成员同名,默认遵循就近原则,
如果想访问外部类的成员,可以通过Outer.this.成员访问

2.不允许有静态成员的

3.互访原则:
外部类访问内部类,通过创建对象,使用对象名访问

外部其他类访问内部类,通过创建对象,使用对象名访问
<2>静态内部类

1.外部类的成员和内部类的成员同名,默认遵循就 近原则,
如果想访问外部类的成员,可以通过Outer.成员访问

2.里面不能直接访问外部类的非静态成员

3.互访原则:
外部类访问内部类,通过创建对象,使用对象名访问
外部其他类访问内部类,通过创建对象,使用对象名访问

(二)局部内部类
特点:
1.不可以加访问修饰符

2.作用范围比较小,外部类其他方法和外部其他类不能访问

3.不能访问 外部类的非 final的局部变量
分类
局部内部类
有名称,可以多次使用

匿名内部类
没有名称,只能使用一次

作为类的子类或 接口的实现类

应用场景
1.充当抽象类或接口 类型 的实参时
2.开启线程
3.设置监听器


2、格式如下:

class Outer{//外部类

class Inner{//内部类

}
}
class Other{//外部其他类

}


3、好处

内部类 可以直接访问外部类中的所有成员(包含私有的!!)

4按定义位置不同分为以下几类:

成员内部类:
普通成员内部类(没有static修饰)
静态内部类(有static修饰)

局部内部类:
局部内部类(有类名)
匿名内部类(没类名)


5代码实例如下:

(一)、成员内部类的特点

1.可以加 任意访问修饰符

2.外部类的成员和内部类成员重名时,默认遵循就近原则,

如果想访问外部类成员,需要使用 :外部类名.this.成员名 访问

<2>.互访原则

1》 内部类如何访问外部类的成员?

直接访问

2》外部类如何访问内部类的成员?

通过内部类的对象名访问

语法:Inner inner =new Inner();

访问 inner.成员

3》外部其他类如何访问内部类的成员?

语法: Outer.Inner inner = new Outer().new Inner();
inner.method();


exa:

public class TestInnerDemo1 {
public static void main(String[] args) {
OuterOther oo = new OuterOther();
oo.other1();
}
}


//外部其他类

class OuterOther{
public void other1(){
Outer.Inner inner = new Outer().new Inner();
inner.method();

//System.out.println(inner.height);

}
}
class Outer{

protected String name="john";
int age=10;

public void test1(){

Inner i =new Inner();

System.out.println(i.height);
}

public class Inner{

String name="helloworld";

double height=100;
public void method(){

//如何访问 外部类的成员?
System.out.println(name);//访问的是  helloworld

//如何外部类的成员和内部类的成员名称一样,如何访问外部类的成员
System.out.println(Outer.this.name);//访问的是 john

}
}
}


(二)是静态内部类的特点

1.可以加访问修饰符
2.只能访问 外部类的静态成员

3.外部类和内部类的成员名称一样, 默认访问的是内部类成员,遵循就近原则。
如果想访问外部类的成员,直接通过 :类名.成员


<2>.互访原则

1 内部类如何访问外部类成员?

只能直接访问外部类的静态成员


2》外部类如何访问内部类成员?

Inner inner  = new Inner();
System.out.println(inner.height);


3》外部其他类如何访问内部类成员?

Outer .Inner inner = new  Outer.Inner();

System.out.println(inner.height);


exa:

public class TestInnerDemo2 {
public static void main(String[] args) {
}
}
//外部其他类
class OuterOther{

public void other1(){

//创建对象 ,通过对象访问

Outer .Inner inner = new  Outer.Inner();

System.out.println(inner.height);
}
}
//外部类
class Outer{

protected String name="john";
static int age=10;

public static  void test1(){
Inner i = new Inner();
System.out.println(i.height);
}
//内部类
protected static class Inner{

int age=100;
String name="helloworld";

double height=100;
public void method(){

System.out.println(Outer.age);

test1();
}
}


}

(三)局部内部类

1.局部内部类不可以加修饰符

2.局部内部类可以直接访问外部类的成员,如果访问外部类的局部

变量,此局部变量必须是final修饰的


3.互访原则

1》内部类如何访问外部类

直接访问

2》

外部类如何访问内部类只能在定义此内部类的方法内访问,而且遵循前向引用

不能内置 其他外部类的地方访问


3》外部其他类如何访问内部类

无法访问

exa:

public class TestInnerDemo3 {

}

//外部类

class Outer{

String name=”john”;

public void method2(){
}
public void method(){

final int count=10;//局部变量

//局部内部类
class Inner{

public void test1(){
System.out.println(count);
}
}
Inner i = new Inner();
}


}

二、枚举

(1)如何自定义枚举类 √

实现步骤:

1、构造方法私有化 √

2、本类创建好固定的几个对象 √

修饰符 :public static final

class Season{

private String name;//季节名
private String desc;//季节描述

//构造方法私有化
private Season(String name,String desc){
this.name=name;
this.desc=desc;

}

public static final Season SPRING=new Season("春天","春暖花开的季节");
public static final Season SUMMER=new Season("夏天","生如夏花");
public static final Season AUTUMN=new Season("秋天","花儿都谢了");
public static final Season WINTER=new Season("冬天","花儿都冻坏了!!");
public String getName() {
return name;
}

public String getDesc() {
return desc;
}

@Override
public String toString() {
return name+"\t"+desc;
}
}


(2)如何使用enum定义枚举类 ★

enum Season2{
SPRING("春天","春暖花开的季节"),
SUMMER("夏天","生如夏花"),
AUTUMN("秋天","花儿都谢了"),
WINTER("冬天","花儿都冻坏了!!");
private Season2(String name,String desc){
this.name=name;
this.desc=desc;
}

private String name;
private String desc;
public String getName() {
return name;
}
public String getDesc() {
return desc;
}

public void show(){
System.out.println("这是一个季节");
}
@Override
public String toString() {
return name+"\t"+desc;
}

}


(3)枚举类的主要方法

//方法一:valueOf ,返回指定对象名  对应对象

Season3 s = Season3.valueOf("SPRING");

System.out.println(s);

//方法二: toString ,返回该枚举对象的字符串形式

Season3  s1 =Season3.SPRING;
System.out.println(s1);

//方法三:ordinal ,返回枚举对象在类中定义的索引

int ordinal = Season3.WINTER.ordinal();
System.out.println(ordinal);

//方法四:values ,返回该枚举类中所有的对象

Season3[] values = Season3.values();
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}


(4)实现接口的枚举类 √

enum A implements 接口{

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内部类 enum