Java基础——面向对象进阶复习知识点3
一、static的注意事项
1.1 代码角度解释
在非静态方法中,虚拟机会自动赋值一个this,谁调用当前的方法,那么就是谁的地址值。
通过打印地址值来验证一下:
平时因为局部位置,方法里面没有跟成员位置重名,所以我们可以省略this.name的方式打印。
平常我们在方法里面调用其他的方法,比如图下的show2();其实也是隐含有this.
然而在静态中强行加入this. 那么编译器会报错。
静态中不能访问非静态的方法和变量。在静态方法中调用成员变量和成员方法都会报错。
而非静态的方法可以调用静态的根本原因就是它隐含有this关键字。非静态的方法和变量通常都会创建对象或者供对象使用方法。静态一般都是共享的,共享的方法就不需要this来特意指明是谁调用的它,或者它调用谁。
1.2 内存角度解释
静态和非静态的数据加载到内存的时机是不一样的。比如我们成员变量name,通常是创建对象的时候才会有值。
只要我不创建对象,那么非静态的方法和变量是不会加载到内存当中的。而静态的数据通常伴随着字节码文件.class()类文件率先加载到内存。从这个角度来说,也能说明静态是无法调用非静态的
调用method()方法之后,它去静态区找到了teacherName(),但是却找不到name!因为它不是静态的,根本就不在静态区。那么我们就能得出结论1:静态方法不能调用非静态成员变量。
我们假设静态方法中能调用非静态方法,方法通常加载到栈内存,一般都有调用者xxx.调用次方法,但是之前我们说过静态方法中不会有this,也就是说show()方法根本就不知道是谁调用了它。
所以得出结论2:静态方法不能调用非静态成员方法。
二、重新认识main()方法
如何让程序接受数据?(了解即可)
数据之间要用空格隔开!
声明:
以上均来源于B站@ITheima的教学内容!!!
本人跟着视频内容学习,整理知识引用