1.关于对象实例化时在内存中的存储
关于字符串
String s1="abc";
String s2="abc";
String s3=new String("abc");
String s4=new String("abc");
System.out.println(s1);
System.out.println(s2);
//==在基本数据类型比较的是值,在引用数据类型比较的是地址
//其原因是因为栈存储的不同
System.out.println(s1==s2);//true
System.out.println(s2==s3);//false
System.out.println(s3==s4);//false
2.关于方法传参
public static void main(String[] args){
int i=1;
String s="1";
Dog dog=new Dog();
dog.name="1";
System.out.println(i);
System.out.println(s);
System.out.println(dog.name);
m1(i);
m2(s);
m3(dog);
System.out.println(i);
System.out.println(s);
System.out.println(dog.name);
}
public static void m1(int i){
i=i+1;
System.out.println(i);
}
public static void m2(String s){
s=s+"1";
}
public static void m3(Dog g){
d=new Dog();
d.name="2";
}
关于所有的传递都是副本的传递
对于基本数据类型:由于基本数据类型在堆内存中本来就是值,所以传递后仅仅修改是不会影响到调用方
引用数据类型:由于存储的是地址,所以传递后修改时会影响到调用方
字符串比较特殊,他不会因为你修改了就直接对你的字符串常量池做修改,字符串的修改是将你的引用改成新的引用
3.构造方法
//无参数的调用方法
public Dog(){
System.out.println("这是无参数的构造方法");
System.out.println("这是构造方法,每当我们new一个Dog的时候就会执行");
System.out.println();
}
//有参的构造方法
//这个既含有有参构造器,又含有无参构造器的方法
//我们乐意称之为构造器的重载-reload
public Dog(String string1,int int1){
System.out.println("这是有参数的构造方法。他有两个参数,第一个参数是String1");
System.out.println("第二个参数是int1");
name=string1;
age=int1;
}
4.关于this关键字
//构造方法,如果你一个都不写
//那么javac编译时会自动生成一个无参共有的构造方法
//如果你写了某一个构造方法,那么你这个自动生成的无参共有的构造方法会不再生成
public cat(string name){
//this();将会调用当前类的构造方法
//如果你括号中存在参数,则会调用对应的含参构造器
//this();这段代码只可以写在构造器中,并且只可以出现在构造器的第一行代码。
//注意,你this();调用的构造器之后不可以再直接或间接调用回当前的构造器
//否则会发生死循环
this();
//this关键字代表的“这个当前对象”
//我们可以使用this(),this.等等
//this()就相当于当前对象的无参构造方法
//this.就相当于使用当前对象调用某个属性/方法
this.name=name;
this.play();
//打印当前的对象
system.out.println(this);
}
5.关于方法的重载
同一个类中:方法名相同,参数项不同,与返回值、访问修饰符无关
//以下三个方法均为System.out这个Printstream类的方法
//由于他们三个参数不同
//第一个是string
//第二个是int
//第三个是Dog (object)
//也就是说,他们满足了方法名相同,参数项不同
//所以,我们称之为这是println();方法的重载
system.out.print1n("He11o wor1d ! ");
system.out.print1n(1);
system. out.print1n(new Dog();
方法重载,我们需要让JVM java虚拟机在执行代码的时候可以准确地定位出我们需要调用的方法。由于方法名是一样的,对于不同的返回值而言,存在返回值可以不去接受这种情况
public class A{
public void method1()i
System.out.print1n( "method1");
}
pub lic string method1({
System.out. print1n("123"');
return "";
}
}
public static void main(string[] args){
A a = new A();
a.method1();
a.method1();
}
如同上述案例,我们都无法区别13行和14行到底应该执行的是3还是6行代码。所以java不允许写重名、同参的方法,除非你这几个同名方法是参数不同,我们称之为方法的重载。
6.成员变量与局部变量
1.作用域不同
局部变量的作用域仅限于定义他的方法
成员变量的作用域在整个类内部都是可见的
2.初始值不同
Java会给成员变量一个初始值
Java不会给局部变量赋予初始值
在同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级