java学习笔记(三)内部类及静态内部类

内部类的创建
   内部类 对象名 = 外部类对象.new 内部类();
   外部类是不能使用内部类的成员和 方法
   如果外部类和内部类具有相同的成员变量或方法,内部类默认
   访问自己的成员变量 或方法,如果要访问外部类的成员变量,
   可以使用this关键字。


//外部类HelloWorld
public class HelloWorld{
    
    //外部类的私有属性name
    private String name = "imooc";
    
    //外部类的成员属性
    int age = 20;
    
	//成员内部类Inner
	public class Inner {
		String name = "爱慕课";
        //内部类中的方法
		public void show() { 
			System.out.println("外部类中的name:" +    this.name              );
			System.out.println("内部类中的name:" +      name            );
			System.out.println("外部类中的age:" + age);
		}
	}
    
	//测试成员内部类
	public static void main(String[] args) {
        
        //创建外部类的对象
		HelloWorld o = new HelloWorld (); 
        
        //创建内部类的对象
		Inner inn =  o.new Inner();            ;
        
        //调用内部类对象的show方法
		inn.show();
	}
}

静态内部类:

  静态内部类是 static 修饰的内部类,这种内部类的特点是:

1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问 

2、 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员

3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();

public class HelloWorld {
    
    // 外部类中的静态变量score
    private static int score = 84;
    
    // 创建静态内部类
	public static class SInner {
        // 内部类中的变量score
        int score = 91;
        
		public void show() {
			System.out.println("访问外部类中的score:" +   HelloWorld.score);
			System.out.println("访问内部类中的score:" + score);
		}
	}

	// 测试静态内部类
	public static void main(String[] args) {
		// 直接创建内部类的对象
        SInner si = new SInner();
        // 调用show方法
		si.show();
	}
}

静态变量(类)与非静态变量(类)的区别以及为什么要使用静态变量(来源:imooc问答区):

一般静态变量都是公用的、全局的,程序一启动就会在内存开辟一块空间,存放它们。静态的不必实例化就能直接使用,是说在没有生成任何对象时就能运用该方法,所以静态方法里不能对非静态的成员变量做操作。一般静态方法操作静态成员变量或全局变量。

要搞清楚这个问题,我们需要清楚他们之间有什么区别,有什么优势和劣势。

首先看看静态与非静态方法的区别:

静态方法                    |  实例方法

1、静态方法可以通过“类.方法()”调用        | 要在对象实例化后使用对象调用

2、只能使用静态变量和局部变量        | 所有变量都可以使用

3、静态方法不能被子类重写          | 实例方法可以

4、接口不能定义静态方法             | 实例方法可以

从上面区别来看,静态方法只有一个优势,就是调用的时候不用实例化,其他情况下跟实例方法相比都是处于劣势。那么我们在什么情况下会使用到静态方法?相信大家第一时间会想到一样的东西,工具类Util。工具类给我们开发带来了大大的方便,归根到底是“不用实例化就能用”的功劳。这是静态方法的一个优势。

而静态方法的劣势也很明显,局限性很大,不能重写,不能引用普通变量,接口不能定义等等。。。可能还有很多我没列举出来。

那究竟什么时候该用静态方法?我们就要最大化利用其优势而避其缺点:

1、一个方法完成一个独立的功能,而且不会干扰到其他方法或变量,则即使删掉这个方法,对其他东西都没有任何影响。

2、不依赖构造方法,不依赖接口,不依赖继承。(这也是为什么越学面向对象,越会纠结这个问题)

举个例子:String类即使删掉 static valueOf(Object obj)方法,也不会影响实例方法chatAt(int index)的使用。当然它可能会影响其他重载的valueOf方法。

至于现在网上很多资料都有一个误区,就是说静态方法一开始加载,会占用内存,而实例方法不会。这个说话其实是错误的,它们都是一样一开始就会加载,而且只会占用一份内存。因为方法不是变量,它只需要有一份内存就够了。而变量则不一样

-----------------------------------------------------------------------------------------------------------------------------------------------------------

下面来看看静态变量与非静态变量

静态变量                    |  非静态变量

1、可以通过“类.变量”来引用。          | 只能通过实例对象来引用。

2、程序运行时分配内存            |  类实例化时分配内存。

3、只有一份内存被分配            |  有多少个类被实例化,就有多少个该类的变量那么多份内存被分配。

4、静态变量定义后必须声明初始化         | 非静态变量可以延迟初始化。

其他.....

很明显,静态变量拥有的优势不少,第一点不用说。第2、3点可以利用它来做一个整个程序的全局变量,因为任何修改都只会指向同一份内存。

而第3点优势恰好就是我们的“饿汉式单例模式”的一个最简单的实现。

  

猜你喜欢

转载自blog.csdn.net/weixin_42173193/article/details/82106799