(5)this和static关键字及对象初始化过程

本文详细讲解了Java中的this关键字、static修饰符以及对象初始化过程。介绍了成员变量与局部变量的区别,匿名对象的使用场景,构造函数的特点,this的作用,static变量的内存与生命周期特性,何时使用静态成员,以及构造代码块和静态代码块的执行顺序。此外,还探讨了类的加载时机,对象创建的过程以及Java内存划分。
摘要由CSDN通过智能技术生成
1.成员变量与局部变量(方法中或for语句中)区别:
作用域:成员变量在类中有效,局部变量只在方法中有效。
内存特点:成员变量存在于堆内存中,局部变量存在于栈内存中。
2.匿名对象操作属性没有意义,匿名对象调用方法只能使用一次,用后就成垃圾对象.当对象要操作多个属性或方法时就要给他起名。
匿名对象用在:只调用一次方法;作为实际参数传入方法,简化代码。
3.构造函数特点:
(1)函数名与类名相同
(2)不能定义返回值类型
(3)不能写return语句,系统也不会自动加上return语句。
4.this关键字
this代表它所在方法所属对象的引用,当类中的方法调用本类的对象的成员时就用this
在一个类中,this一般出现在类成员之间的调用。包括方法中对成员变量的调用,或方法中对另一个方法的调用,因为成员变量和方法是封装在对象中的,所以成员之间的调用隐含的是调用某一个对象的那个成员,对象没有实例化之前,用this表示当前对象,即哪个对象调用这个方法,里面的this就表示这个对象,同一个类中,this可以常常省略。
(1)方法中形式参数接收的是基本类型的变量
对于方法中的局部变量与成员变量同名的情况下,成员变量被隐藏,如果要调用成员变量,就要用this.变量名显示表示。
(2)方法中形式参数接收的是本类的对象
方法中对两个或多个对象的成员进行操作的时候,这时就要用this显示表示调用该方法的对象来加以区分。
(3)构造函数中
构造函数间的调用用this(参数列表),注意没有"." ,并且构造this(参数列表)要放在第一行。
5.static的理解
(1)内存:静态成员存在于内存的方法区(也叫共享区、数据区),
                   实例变量存在于堆内存中,实例方法在方法区。
(2)生命周期:静态成员随类的加载而加载,随类的消亡而消亡。
                          实例成员随对象的创建而产生,随对象的消失而消失。
(3)静态方法中不能出现this,super关键字,这时对象还没有产生。
(4)静态是对象的共性,可以实现数据共享,从而节约内存。
(5)局限性:静态方法只能访问静态成员,不能访问非静态成员。
(6)弊端:生命周期过长。
(7)static修饰的成员可以被类直接调用:类名.静态成员;
class Person{
String name;                     //成员变量  , 实例变量
static String country="CN";   //静态变量  , 类变量
}
6什么时候用静态?
当类的成员被该类的对象共享时,可以考虑用static修饰成员为静态的。
7.当多个对象都要使用一些共同的功能时,就可以考虑对这些功能进行抽取,封装在一个工具类中,并且其他对象并没有访问这个工具类中的特有数据,换句话说其他对象都是共享工具类中的功能。,这时可以将工具类中的方法设为静态的,方便其他对象调用,也节约空间。
8.特殊情况:
(1)private修饰构造函数
构造函数可以私有化,这样该类就不能实例化,可以用于工具类中全是静态方法的情况,当其他类调用工具类中的方法时直接用类名调用,如果通过实例化对象访问工具类中的方法就多次一举,浪费内存空间,可以将工具类的构造函数私有化,更加严谨,防止其他人通过实例化对象访问工具类中的方法。
(2)private一般情况下修饰成员,可以修饰类吗?
特殊情况,内部类作为外部类的成员,可以被私有化,这时内部类只能在外部类中被访问,在其他类中是完全被隐藏的。
9.帮助文档的制作     javadoc -d 目录名  类名
10.
构造代码块
{
     System.out.println("cry");
}
构造代码块用于类的不同构造方法所构造对象的共同初始化值,并且 构造代码块的优先级高于构造方法 ,而构造方法只能用于一个构造方法的初始化。
例子:有的孩子出生没名字,有的孩子一出生就有名字了,他们的构造方法不同,但出生时都会哭  这时就可以用构造代码块初始化哭的行为
构造代码块(是对对象初始化的)
{
    System.out.ptrintln("hello,nihao");
}
静态代码块(是对类初始化的,没有名字,优先于main方法,随类的加载而执行,类加载完,他也执行完,且只执行一次,然后加载main方法)
static  {
    System.out.println("aaaaaa");
}

11.类什么时候加载?
在main方法中,只有使用到其他类的成员时才加载其他类。如创建对象,用到了构造方法;或类调用其静态成员。而下面情况并不会加载类:Person p=null; 
12.分析以下对象创建过程都做些什么?(对象初始化过程)
Person p=new Person("张三",20);
(1)在main方法中执行到了这里,发现了Person类并用到了person类中的构造方法,jvm会找到Person.class文件加载。
(2)加载Persion.class 时,如果person类中有静态代码块,会先执行静态代码块。
(3)new关键字会在堆内存中开辟空间,并分配内存地址。
(4)这时堆中的实体name,age就开始默认初始化。
(5)如果person类中属性name或age有显示初始化,这时就进行显示初始化。
(6)再看person类中是否有构造代码块,如果有进行构造代码块初始化。
(7)这时,进行new对应的构造函数初始化。
(8)把堆中实体的内存地址赋值给栈内存中的p变量。
13.javac.exe 程序启动编译器,进行语法检查,所以像下标越界的错误不会再编译时出现,因为这时对象还没有创建。
     java.exe 程序启动虚拟机,加载类,解释执行。static成员随类的加载而加载,所以执行java命令时 加载类,同时加载main方法。虽然main不是关键字,但可以作为程序的入口而被虚拟机识别。main方法既然是方法就可以重载,但虚拟机识别的入口main方法必须是固定的格式,参数列表是String类型的数组。
14.主函数传参:编译后在命令行输入:java 类名  参数1  参数2 ……

public class Test
{
public static void main(String []args)
{
System.out.println(args);
System.out.println(args.length);      
for(int x=0;x<args.length;x++)
{
System.out.println(args[x]);
}
}
}


 
15.java中的内存划分为5块:栈、堆、方法区、本地方法区、寄存区。
栈:存放局部变量或引用
堆:存放实体对象
方法区:存放方法的代码和静态变量,分为静态区(存放静态成员)和非静态区(存放非静态方法);
本地方法区:系统底层的内容
寄存器:cpu用的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值