java面向对象_6 _内部类
内部类
- 内部类就是在一个类的内部定义一个类,比如,A类中定义了一个B类,那么B类相对与A类来说就称为内部类,而A类相对于B类来说就是外部类。
calss Outer{
class Inner{
}
}
- 特点:
- 编译之后生成独立的字节码文件
- 内部类可直接访问外部类的私有成员,而不破坏封装
- 可为外部类提供必要的内部功能组件
- 分类:
- 成员内部类:
- 在类的内部定义,与实例变量、实例方法同级别的类。
- 外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象。
- 当内部类、外部类存在重名属性时,会优先访问内部类属性,(此时要是访问外部类属性要加上前缀Outer.this.)。
- 成员内部类是不能定义静态成员,可以包含静态常量。
- 静态内部类(在成员内部类的前面加上static,相当于一个外部类,级别也和外部类一样):
- 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员。
- 要想访问外部类的属性,需要先实例化外部类,然后通过外部类的对象来访问
- 只能直接访问外部类的静态成员,(实例成员需要实例化外部类对象)
- 局部内部类(定义在一个方法中的类):
- 定义在外部类的方法中,作用范围和创建对象范围仅限于当前方法。
- 前面不能加任何访问修饰符。
- 局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的声明周期与自身相同,变量必须修饰为final。
- 局部内部类不能有静态变量,可以有静态常量。
- 限制类的使用范围。
- 使用时,要先在外部类的这个方法中先实例化内部类,之后实例化外部类,再调用这个方法。
- 匿名内部类:
- 没有类名的局部内部类(一切特征都与局部内部类相似)。
- 必须继承一个父类或者一个接口。
- 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
- 优点:减少代码量
- 缺点:可读性较差
内部类代码1:(成员内部类 、静态内部类)
package com.wlw.oop.demo11;
public class Outer {
//实例变量
private int id = 3;
ptivate String name = "张三";
public void out(){
System.out.println("这是外部类的方法");
}
public class inner{
ptivate String name = "李四";
ptivate String phone = "110";
//如果 变为 static(静态内部类),就不能直接获得外部类的非静态私有属性
//而要去创建外部类对象,才能获得外部类的属性
public void in(){
System.out.println("这是内部类的方法");
}
//获得外部类的私有属性
public void show(){
//打印外部类的属性
System.out.println(id);
//当内部类、外部类存在重名属性时,会优先访问内部类属性,(此时要是访问外部类属性要加上前缀Outer.this.)
System.out.println(Outer.this.name);
//打印内部类的属性
System.out.println(phone);
}
}
}
package com.wlw.oop;
import com.wlw.oop.demo11.Outer;
public class Application {
public static void main(String[] args) {
//实例化外部类
Outer outer = new Outer();
//实例化内部类
//通过这个外部类来实例化内部类
Outer.inner inner = outer.new inner();
inner.in(); //执行结果: 这是内部类的方法
inner.show(); //
}
}
内部类代码2:
package com.wlw.oop.demo11;
public class Outer {
}
//一个java文件(类)中,可以有多个class类,但是只能有一个public class类
class A{
}
内部类代码3:(局部内部类)
package com.wlw.oop.demo11;
public class Outer2 {
private String name = "张学友";
private int age = 35;
public void show(){
//定义局部变量
String adddress = "深圳";
//局部内部类:前面不能加任何访问修饰符
class Inner{
//局部内部类的属性
private String phone = "1324567813";
private String email = "zhangxueyou@qq.com";
public void show2(){
//访问外部类的属性 ,建议加上前缀
System.out.println(name);
System.out.println(Outer2.this.age);
//访问内部类的属性
System.out.println(phone);
System.out.println(email);
//访问方法内的局部变量 jdk1.7要求:变量必须是常量,jdk1.8:自动添加final
System.out.println(adddress);
}
}
//创建内部类对象
Inner inner = new Inner();
inner.show2();
}
}
package com.wlw.oop.demo11;
public class TestOuter2 {
public static void main(String[] args) {
Outer2 outer2 = new Outer2();
outer2.show();
}
}
/*
执行结果:
张学友
35
1324567813
zhangxueyou@qq.com
深圳
*/
内部类代码4:(匿名内部类)
package com.wlw.oop.demo11;
public class Test {
public static void main(String[] args) {
//匿名内部类
//没有名字初始化类,不用将实例保存到变量中
new Apple().eat();
new UserService(){
@Override
public void hello() {
}
};
}
}
class Apple{
public void eat(){
System.out.println("eat");
}
}
interface UserService{
void hello();
}
内部类代码5:(匿名内部类)
package com.wlw.oop.demo11;
public interface Usb {
void service();
}
package com.wlw.oop.demo11;
public class Mouse implements Usb {
@Override
public void service() {
System.out.println("连接电脑成功,鼠标开始工作!");
}
}
package com.wlw.oop.demo11;
public class TestUsb {
public static void main(String[] args) {
//创建接口类型的变量
/*Usb usb1 = new Mouse();
usb1.service();*/
//局部内部类
class fengshan implements Usb{
@Override
public void service() {
System.out.println("连接电脑成功,风扇开始工作!");
}
}
//使用局部内部类创建对象
/* Usb usb2 = new fengshan();
usb2.service();*/
//使用匿名内部类创建对象(相当于创建了一个局部内部类)
Usb usb3 = new Usb() {
@Override
public void service() {
System.out.println("连接电脑成功,(匿名)风扇开始工作!");
}
};
usb3.service(); //执行结果:连接电脑成功,(匿名)风扇开始工作!
}
}
学习面向对象编程思想!,学会操作(关键字),学无止境