Java基础知识九(成员变量与局部变量及几个关键字)

成员变量和局部变量的区别:

1、在类中的位置不同
成员变量:类中方法外。
局部变量:方法内或者语句里面。
2、在内存中的位置不同
成员变量:存储才堆内存的对象中。
局部变量:存储在栈内存的方法中。
3、生命周期不同
成员变量:随着对象的出现而出现在堆中,随着对象的消失而从堆中消失。
局部变量:随着方法的调用而存在与栈中,随着方法的弹栈而消失。
4、初始化值不同
成员变量:因为在堆内存中,所以有默认的初始化值。
局部变量:没有默认的初始化值,必须手动定义,赋值,然后才能使用。

当函数中出现局部变量和成员变量同名,需要在成员变量名前面加上this.来进行二者 的区别。
匿名对象:
匿名对象:就是没有名字的对象。是对象的一种简化表示形式。
匿名对象的使用场景:当对象对方法进行调用时,而且只调用一次时,可以简化成匿名对象来书写。
匿名对象的创建:`System.out.println("Area is " + new Circle(5).getArea());`

this关键字:

针对构造函数,无法通过构造函数名来相互调用。但是构造函数之间可以通过this关键字完成。
构造函数调用格式:

	this(参数列表);
class Person
{
    // Person的成员属性
    private int age;
    private String name;
    //无参数的构造函数
    Person()
    {
    }
    //给姓名初始化的构造函数
    Person(String nm)
    {
        name = nm;
    }
    //给姓名和年龄初始化的构造函数
    Person(String nm , int a)
    {
        //由于已经存在给姓名进行初始化的构造函数 name = nm;因此只需要调用即可
        //调用其他构造函数,需要通过this关键字来调用
        this(nm);
        //给年龄初始化
        age =}
}

this的原理图解:

class Person
{
    private int age;
    private String name;
    Person()
    {
    }
    Person(String nm)
    {
        name = nm;
    }
    Person(String nm , int a)
    {
        this(nm);
        age =}
}
class PersonDemo
{
    public static void main(String[] args)
    {
        Person p = new Person("李四",23);
    }
}

在这里插入图片描述
图列说明:

  1. 先执行main方法,main方法进栈,执行其中的new Person(“李四”,23);
  2. 堆内存中开辟空间,并为其分配内存地址0x33,,紧接着成员变量默认初始化(name=null age = 0);
  3. 拥有两个参数的构造函数(Person(String nm , int a))压栈,在这个构造函数中有一个隐式的this,因为构造函 数是给对象初始化的,那个对象调用到这个构造函数,this就指向堆中的那个构造函数。
  4. 由于Person(String nm , int a)构造函数中使用了this(nm);构造函数Person(String nm)就会压栈,并将“李四”传递给nm。在Person(String nm )构造函数中同样也有隐式的this,this的值同样也为0x33,这时会执行其中name = nm,即把“李四”赋值给成员的name。当赋值结束后Person(String nm )构造函数弹栈。
  5. 程序继续执行构造函数(Person(String nm , int a)中的age = a;这时会将23赋值给成员属性age。赋值结束构造函数(Person(String nm , int a)弹栈。
  6. 当构造函数Person(String nm , int a)弹栈结束后,Person对象在内存中创建完成,并将0x33赋值给main方法中的p引用变量。

private关键字:

(1)私有的意义,可以修饰成员变量和成员方法
(2)特点:
	被private修饰的后的成员只能在本类中被访问
(3)private的应用:
	以后再写一个类的时候:
		把所有的成员变量给private了
		提供对应的getXxx()/setXxx()方法

static关键字:

(1)静态的意思。可以修饰成员变量和成员方法。
(2)静态的特点:
	A:随着类的加载而加载
	B:优先与对象存在
	C:被类的所有对象共享
		这其实也是我们判断该不该使用静态的依据。
		举例:饮水机和水杯的问题思考
	D:可以通过类名调用
		既可以通过对象名调用,也可以通过类名调用,建议通过类名调用。
(3)静态的内存图
	静态的内容在方法区的静态区
(4)静态的注意事项;
	A:在静态方法中没有this对象
	B:静态只能访问静态(代码测试过)
(5)静态变量和成员变量的区别
	A:所属不同
		静态变量:属于类,类变量
		成员变量:属于对象,对象变量,实例变量
	B:内存位置不同
		静态变量:方法区的静态区
		成员变量:堆内存
	C:生命周期不同
		静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
		成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
	D:调用不同
		静态变量:可以通过对象名调用,也可以通过类名调用
		成员变量:只能通过对象名调用
(6)main方法是静态的
	public:权限最大
	static:不用创建对象调用
	void:返回值给jvm没有意义
	main:就是一个常见的名称。
	String[] args:可以接收数据,提供程序的灵活性
		格式:java MainDemo hello world java
			  java MainDemo 10 20 30

代码块
静态代码块
构造代码块
局部代码块就是在函数当中的一对{}
for{}
while{}
if{}
switch{}

final关键字:
有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,子类不能重写。故我们需要用到final关键字,final的意思为最终,不可变。final是个修饰符,它可以修饰类,类的成员,以及局部变量。
final可以修饰变量 表示该变量所存储的数据的地址不可更改。

1、final修饰类不可以被继承,但是可以继承其他类
2、final修饰的方法不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加final
3、final修饰的变量称为常量,这些变量只能赋值一次,定义的时候必须有初始值
4、final修饰的引用类型变量,表示该引用变量的引用不能变,而不是引用所指的对象中的数据还是可以变化的

什么时候会在程序中定义final常量呢?
当程序中一个数据是固定不变的,这时为了增加阅读性,可以给该数据起个名字。为了保证这个变量的值不被修改,加上final修饰,变量就为阅读性很强的常量。书写规范,被final修饰的常量名所有的字母都是大写的。如果由多个单词组成单词间通过 _ 连接。
通常规范中:常量名称所有字母大写,若有多个单词组成,单词间使用下划线连接。

public static final修饰的常量称为全局常量;
public static final double PI = 3.14159265358979323846;
public static final String APP_SEPARATOR = "/";
发布了48 篇原创文章 · 获赞 47 · 访问量 5247

猜你喜欢

转载自blog.csdn.net/weixin_45160969/article/details/103282604