文章目录
一、Java内部类
1、创建内部类对象语法
外部类名.内部类名 对象名 = new 外部类名().内部类名()
2、访问规则
(1)内部类可以直接访问外部内的成员,包括私有。 之所以能够访问外部类中的成员,是因为内部类中持有了一个外部类的引用, 格式 外部类名.this
(2)外部内要访问内部类,必须建立内部类对象
3、访问格式
Demo
public class Outer{
private String name = "张三";
private int age = 10;
public void eat() {
}
//创建一个内部类
class Inner{
public void sleep() {
System.out.println(name + "在睡觉");
}
}
}
//main函数类
public class Demo {
public static void main(String[] args) {
Inner in = new Outer().new Inner();
in.sleep();
}
}
(1)当内部类定义在外部内的成员位置上,而且非私有,可以在外部其他类中直接建立内部类对象。 格式:
外部类名.内部类名 变量名 = 外部类对象.内部类对象;
Outer.Inter in = new Outer().new Inner();
(2)当内部类在成员位置上,就可以被成员修饰符所修饰。比如:
private:将内部类在外部类中进行封装。
static:内部类就具备静态的特性。
① 当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限
② 在外部其他类中,直接访问static内部类的非静态成员:
new Outer( ).Inner( ).function( );
③ 在外部其他类中,直接访问static内部类的静态成员:
Outer.Inner( ).function( );
二、Java匿名内部类
1、概念
匿名内部类是指没有名字的内部类。
2、格式:
new 接口名/父类/抽象类( ){
重写方法
};
(1)这个类如果是接口,会自动实现;
(2)如果是抽象类/普通类,会继承这个抽象类;
(3)不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现;
3、要调用对象,直接在后面用.类名
调用。
Demo1
public abstract class Smoking{
public abstract void smoke();
}
//main函数类
public class Demo1 {
public static void main(String[] args) {
new Smoking() {
@Override
public void smoke() {
System.out.println("请勿吸烟");
}
}.smoke();
}
}
Demo2
public interface Smoking{
void smoke();
}
public class Demo2 {
public static void main(String[] args) {
new Smoking() {
@Override
public void smoke() {
System.out.println("请勿吸烟");
}
}.smoke();
}
}
另外,调用的方式也可以是下面这种
public abstract class Smoking{
public abstract void smoke();
}
//main函数类
public class Demo2 {
public static void main(String[] args) {
Smoking smoking = new Smoking() {
@Override
public void smoke() {
System.out.println("请勿吸烟");
}
};
//用这个对象来调用方法
smoking.smoke();
}
}