内部类
1.什么是内部类?
概念:定义在类中的类
2.怎么用的?
就像在类中定义属性一样
修饰符 class 类名{}
第一:内部类相当于是外部类中的一个属性
第二:内部类本身也就是一个类,跟正常的类一样
3.为什么要用它?
类的生命周期程序运行时开始到程序结束时销毁,但是呢,某些情况下,在整个应用程序中对该类的使用频率较低,那此时就需要将其定义为内部类,以缩短其生命周期;
简单点来说:缩短类的生命周期
划分:内部类、局部内部类、匿名内部类
使用场景:当类或该类的对象并不是很常用的时候,就可以定义为内部类
4.内部类具体例子
package cn.yunhe.Test;
public class Inner {
public static void main(String[] args) {
Outer outer=new Outer();
outer.count=5;
outer.show();
//非静态内部类使用方式
Outer.Inner inner=new Outer(). new Inner();
inner.run();
inner.method();
//静态内部类使用方式
// Outer.Inner inner = new Outer.Inner();
// inner.run();
//
// Outer.Inner.change();
}
}
package cn.yunhe.Test;
/**
* Outer是外部的意思
* 只有static修饰的属性和方法才能使用类名
*
* 当需要使用内部类中的属性或方法时,要将内部类当成一个类来思考
* 当需要通过外部类来使用该内部类时,首先需要先将其当成是一个外部类中的非静态属性来理解
*
* public private default protected static final
*
* 内部类可以使用外部类中的成员变量和方法
* 外部类中不可以直接使用内部类中的成员变量及方法,需要内部类对象
*/
public class Outer {
static int count=1;
public void show() {
System.out.println("count="+count);
}
class Inner{
public void run() {
System.out.println("Inner run "+count);
}
public void change() {
System.out.println("Inner change");
}
/**
* 用于调用Inner类中的run方法的
*/
public void method() {
Inner inner=new Inner();
inner.run();
}
}
}
5.扩展
同一个类中方法及属性之所以可以互相调用是因为都默认持有一个this对象
在继承中,子类中之所以可以直接调用父类中的方法是因为调用的父类方法或属性默认持有一个super对象
package cn.yunhe.practice;
/**
* 同一个类中方法及属性之所以可以互相调用是因为都默认持有一个this对象
* 在继承中,子类中之所以可以直接调用父类中的方法是因为调用的父类方法或属性默认持有一个super对象
*/
public class Practice {
private int age;
public void setAge(int age) {
this.age=age;
}
private int count=5;
class Inner{
int count=6;
public void show() {
int count = 7;
System.out.println("count="+count);//7
System.out.println("count="+this.count);//6
System.out.println("count="+Practice.this.count);//5
}
}
6. 匿名内部类
package cn.yunhe.practice;
/**
* 匿名内部类:本身是没有名字的类
* 前提:必须要有继承或实现关系
* 语法:父类类型 变量名 = new 父类类型(){}; 是一种多态的形式,默认的向上转型,限制了对子类特有方法的调用
* 只有当所使用的方法都是来自父类中的方法时才考虑使用匿名内部类,只要其中有一个特有的方法就需要考虑创建一个具体的类使用
*/
public class Niming {
public static void main(String[] args) {
Animal animal = new Animal() {
@Override
public void eat() {
System.out.println("没有名字的类");
}
@Override
public void sleep() {
System.out.println("第二个方法");
}
public void show() {
System.out.println("hehe");
}
};
animal.eat();
animal.sleep();
//animal.show();
}
}
interface Animal{
void eat();
void sleep();
}
class Cat implements Animal{
@Override
public void eat() {
}
@Override
public void sleep() {
}
}
7.局部内部类
package cn.yunhe.practice;
import cn.yunhe.Test.Inner;
public class AreaInnerDemo {
public static void main(String[] args) {
Outer outer = new Outer();
outer.method();
}
}
class Outer{
/**
* 局部变量只能在方法中使用
* 局部内部类本身也相当于是一个局部变量,而其本身也是一个类
* 从方法的角度来使用时,它要作为一个局部变量来用,从类的角度(需要使用类中的属性及方法时)作为一个类来使用
*/
public void method() {
int count = 4;
class Inner{
public void show() {
System.out.println("--show--");
}
}
Inner inner=new Inner();
inner.show();
}
}