类声明的变量被称为 对象
类包括两点 变量 (体现对象的属性) 和 方法(方法可以对类给出的变量进行操作,即算法)
变量
实例变量,类变量,局部变量
实例变量即定义在类中的8种基本类型变量 int x char y double z ( new对象之后 实例变量才会被分配内存存储 实例变量才会被默认初始值 0 null 0.0)
类变量 关键字 static int(char)(double) 变量名
( 这里引申一下 标识符 命名规则 标识符由 数字 字母 下划线 美元符组成 数字不能是第一位)
类变量 在类加载到内存中 便会存储 但实例变量是不会存储的直到有第一个对象的建立才会加载。
小结 1.不同对象的实例变量互不相同互不干涉(存储地址不同),
2. 所有对象共享类变量(加载类时 类变量便被安排空间存储,所以多个对象共用类变量,其中一个对象改变类变量的值,其他对象的类变量值也改变) // static x=0;
3. 通过类名直接访问 类变量 students.x; 无需new对象;
4. 该类没有创建对象,那么该类的实例变量不会被分配内存 也就是说我们只是写出逻辑结构 内存没用写入
局部变量 在方法内部定义的变量 作用域只能在方法内部 (局部变量没有默认值,如需运算 需给局部变量赋值)
构造方法
构造方法必须与它所在的类的类名相同 students(){}; // 构造方法没有类型 任何有类型的同名方法都不能称为构造方法
如果类中没有编写构造方法,那么程序会默认一个构造方法
可以自定义一个构造方法 但如果你定义了自己的构造方法 还想使用默认构造方法 那就需要声明出来
如果类中定义了一个或者多个构造方法 ,那么java不提供默认的构造方法,在该情况下 使用 class students = new students(); 默认构造方法是违法的
用类声明的变量称为对象 当程序创建对象的时候 需要使用类的构造方法 class students = new students();
创建对象
使用 new运算符 和构造方法为声明的对象分配变量,即创建对象 class students = new students();
new students() 两个作用
1.为各个成员变量分配内存 并且默认初始值
2.new计算出索引 进行赋值给对象 (new students();值是一个索引 也就是地址)
当只声明对象 而不定义 class students; 那students只是个空对象 (运行会报错)
重要结论 一个类声明的两个对象如果有相同的索引 那么二者就具有完全相同的变量
students A,B;
A B两者有不同的索引 所以二者各有各自的实例变量(尽管实例变量相同 但存放地址不同,所以互不干涉)
简而言之 不同对象的实例变量互不相同 —— 分配给 不同对象的实例变量占有不同的内存空间,改变其中一个对象的实例变量不会影响其他对象的实例变量。
但 当 进行赋值的时候如 A=B; A便得到B的索引 所以二者就具有完全相同的变量 改变A中变量的值,B对应的变量的值也改变。
也就是说 如果对象的类型相同 ,那么也可以进行赋值运算。
有实例变量和类变量之区分 那么也有实例方法和类方法的区分
1.
int a(){ }; // 实例方法
static int b(){}; // 类方法 static 写在返回类型前
2.
当类的字节码文件加载到内存中时,类的实例方法不会被分配入口地址,只有该类声明定义一个对象时,类中的实例方法才会被分配地址。 注意 当我们创建第一个对象时,类中的实例方法被分配地址,当再创建对象时,实例方法不再分配地址,也就是说 实例方法地址是被所有对象共享的(类变量是被对象共享的,这个实例方法的地址也是)(实例方法,也称函数,函数名就是地址。这样就好理解了)
3.
同理类变量 类方法当类被加载时就已经分配好入口地址了。 类方法不仅可以被定义的所有对象使用,也可以直接通过类名调用。
再次强调注意 实例方法不能通过类名调用,只能通过对象调用。
4.
和实例方法不同的是,类方法不可以操作实例变量,这是因为在类创建对象之前,实例变量还没有分配内存 这也是类方法中不能用this的原因。
原文:https://www.cnblogs.com/nieyejun/p/14782509.html