声明位置不同:类中 方法中
不同的方法中即使有同名的局部变量,没有关系,互补影响,建议相同
内存存放的位置:栈内存 堆内存
成员变量有默认值,局部变量没有默认值
Java中的对象和数组是通过引用对其操作的
引用可以理解为一种受限的指针
指针是可以进行与整数做加减运算,两个指针之间也可以进行大小比较
引用不行,引用智能进行赋值运算
引用就是一个变量或对象的别名(引用的本质是一个对象);指针是一个段内存空间的地址
(指向存储一个变量值的空间或者一个对象的空间)
栈:STACK--->属于一种数据结构
1.存放:局部变量
2. 先进后出,自上而下存储
3. 方法执行完毕,自动释放空间
堆:HEAP
1.存放new出来的对象
2.需要垃圾回收器来回收:System.gc()
方法区:METHOD
存放:类的信息(代码),static变量,字符串常量等
构造方法:模具
public class Teacher{
String name;
int age;
public Teacher(String name,int age){
System.out.println("new....");
name = name;//都被当成局部变量,以后通过this指针来解决问题
age = age;
}
public void teach(){
System.out.println("上课");
}
}
?
?
public static void main(String[] args) {
?
Teaher teach = new Teacher();
teach.name = "连";
teach.age = 18;
/**
* 为什么要有构造方法?
* 构造方法相当于模具,汽车造出来需要轮子,座椅等等
*
* 我写一个name和age就要写一遍?有100个对象,就要赋值100遍?
* 构造方法:
* 创建对象的时候,默认会调用构造方法来创建对象(在堆中开辟空间,来完成对象初始化操作)
*
* 1.创建完类之后,如果没有手动调用构造方法,会有一个默认的无参构造方法供调用
*/
在一个类中可以包含多个重名的方法,但是注意方法的参数列表不能相同
三个方面同:
1.参数个数不同
2.参数类型不同
3.参数顺序不同
1.this的作用
this表示的是当前对象本身
更准确说,this代表当前对象的一个引用(放在堆空间中,指向当前对象本身/可以理解为首地址)
2.构造方法:
当构造方法中的参数名称跟类的成员变量名称一样的时候,可以使用this代表当前对象,注意:有了this之后,可以将构造方法的参数跟成员变量保持一致
当构造方法中需要调用其他的构造方法时,可以使用this()
必须位于第一行
3.普通方法:
当多个普通方法之间需要调用的时候,可以使用this来进行相互调用,指的是当前对象的其他方法
4.成员变量的使用:
当方法中的参数名称和成员变量保持一致的时候,使用this.表示的是对象的值,而使用变量名表示的是形参
public void test2(String name){
System.out.println("test2");
test1();
System.out.println(name);--->参数里的name值,传入进来的
System.out.println(this.name);---->成员变量的属性
}
?
this.name = name -->将形参name赋值给了当前对象里面
?
?
this不能使用与static方法
1.在类中,用static声明的成员变量为静态成员变量或叫类属性、类变量,它为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化,对于该类的所有对象来说,static成员变量只有一份,被该类的所有对象共享
可以使用 “对象.类属性" 来调用 ,不过,一般都是用 ” 类名.类属性“
static 变量置于方法区中
2.用static声明的方法为静态方法
不需要对象,就可以调用(类名.方法名)
在调用该方法时,不会讲对象的引用传递给它,所以在static方法中不可访问非static的陈冠
静态方法不能以任何方式引用this和super关键字
/**
* static:
* 修饰成员变量的时候,表示静态成员变量或者类变量
* 普通变量在使用的时候,必须要通过对象名进行调用
* 类变量或者静态变量可以使用对象名调用,也可以使用类名进行调用
* 注意:
* 静态变量:在创建对象之前被初始化,或者在类被载入之前进行初始化
* 静态变量被所有的对象共享,属于公共变量,对象和类都可以直接调用,但是推荐使用类来调用
* 成员变量放在堆中,而静态变量放在方法中的静态区
*
*
* 1.修饰方法的时候,表示静态方法或者类方法
* 2.普通方法在使用的时候,必须要通过对象名进行调用
* 3.类方法或者静态方法可以使用类名,也可以使用对象名
* 4.静态变量不能定义在静态方法中
* 5.静态方法可以在非静态方法中进行调用(非静态方法创建时,静态方法已存在)
* 6.静态方法中不能直接调用非静态方法()
*/
public class staticDemo2 {
String name;//非静态变量
static int age= 20;//静态变量
?
//在非静态方法中/普通成员方法中,调用非静态变量和静态变量
public void print(){
System.out.println(name);
System.out.println(age);
}
?
//在静态方法中,调用非静态变量和静态变量
?
public static void print2(){
//System.out.println(name);
// Error:(13, 28) java: 无法从静态上下文中引用非静态 变量 name
?
//如果希望在静态方法中调用非静态变量,可以通过创建类的对象
//然后通过对象来访问非静态变量
System.out.println(new staticDemo2().name);
System.out.println(age);
}
?
//非静态方法中调用静态方法是可以的
public void show(){
show2();
System.out.println("show not static");
}
//静态方法中调用非静态方法,是不可以的
public static void show2(){
//show();
//Error:(29, 9) java: 无法从静态上下文中引用非静态 方法 show()
System.out.println("show static");
}
public static void main(String[] args) {
//直接使用类名调用静态方法
staticDemo2.print2();
?
//通过引用调用
staticDemo2 st = new staticDemo2();
st.print2();
}
}
?
原文:https://www.cnblogs.com/hyz051202020/p/14810600.html