一 内部类
1. 成员内部类
在类中方法外,比如:一个事物包含另一个事物,汽车类包含发动机类
1.1 访问特点
内部类可访问外部类成员,包括私有
外部类访问内部类必须先建立内部类对象
1.2 创建格式及代码
格式
class 外部类 {
class 内部类{
}
}
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
定义类
public class Person {
private boolean live;
public void setLive(boolean live) {
this.live = live;
}
//内部类
class Heart{
public void jump(){
//内部类可以直接访问外部类的成员,包括私有
if (live){
System.out.println("在跳");
}else{
System.out.println("不在跳");
}
}
}
}
测试类
public class InnerDemo {
public static void main(String[] args) {
//创建外部类对象
Person p = new Person();
p.setLive(true);
//创建内部类对象
Person.Heart heart = p.new Heart();
//调用内部类方法
heart.jump();
}
}
内部类编译后有独立的class文件
2. 局部内部类(了解即可)
定义在方法内部,只能在方法内部使用
代码演示:
/**
* 局部内部类
*/
public class JuBuneibulei {
public void show(){
System.out.println("外部类方法");
class Inner{
public void showInner(){
System.out.println("我是局部内部类,只能在外部类方法内调用");
}
}
Inner inner = new Inner();
inner.showInner();
}
public static void main(String[] args) {
JuBuneibulei juBuneibulei = new JuBuneibulei();
juBuneibulei.show();
}
}
3.匿名内部类
常用于简化接口实现类重写接口中的方法,并创建实现类对象。
格式:
new 父类名或者接口名(){
// 方法重写
@Override
public void method() { // 执行语句
}
};
匿名内部类的三种使用:
//接口
public interface Ifly {
void fly();
}
//测试类
public class IflyTest {
public static void main(String[] args) {
//1.作为对象
new Ifly() {
@Override
public void fly() {
System.out.println("匿名内部类,重写方法并调用了,方法1");
}
}.fly();
//2. 和的一种差不多
Ifly ifly = new Ifly() {
@Override
public void fly() {
System.out.println("匿名内部类,重写方法并调用了,方法2");
}
};
ifly.fly();
//方法3:作为参数传递
showFly(new Ifly(){
@Override
public void fly() {
System.out.println("匿名内部类作为方法对象参数,方法3");
}
});
}
//方法3:作为参数传递
static void showFly(Ifly ifly) {
ifly.fly();
}
}
4. 静态内部类
定义在类中用static修饰。
4.1特点
只能访问外部类的静态属性和方法
代码,展示静态方法,静态属性可直接使用
public class OuterClass {
public static void staticMethod() {
System.out.println("外部类的静态方法");
}
public static class StaticInnerClass {
public void innerMethod() {
System.out.println("静态内部类的方法");
// 调用外部类的静态方法
OuterClass.staticMethod();
}
}
public static void main(String[] args) {
// 使用外部类的类名直接调用静态方法
OuterClass.staticMethod();
// 创建静态内部类的实例并调用其方法
StaticInnerClass inner = new StaticInnerClass();
inner.innerMethod();
}
}
二、权限修饰符
三、static关键字
3.1 修饰成员变量
静态变量属于类,与类一起加载,在内存中只有一份,被所有对象共享
静态变量调用方式:类名.类变量(推荐),对象名.成员变量(不推荐)
实例变量:类名.实例变量
应用场景:系统启动记录登录人数
3.2 修饰成员方法
属于类,同静态变量一样,推荐类名.类方法调用,
main就是静态方法
注意:类方法中不可出现实例关键字
3.3 代码块
static{}
类加载时自动最先执行,只会被调用一次,
3.4单例模式
1.饿汉式单例
拿对象时候,对象早就创建好了
2. 懒汉式单例,拿对象时候,才开始创建对象,