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=============="+i);
}
public static void m2(String s){
s=s+"1";
}
public static void m3(Dog d){
//d.name=d.name+"1";
d=new Dog();
d.name="2";
}
对于所有的传递都是通过副本传递
对于基本数据类型,由于基本数据类型在堆内存中本来就是值,所以你传递后,仅仅修改副本的值,是不会影响到原先调用的部分
对于引用数据类型,由于存储的是地址,所以你在传递后,修改是会影响到调用方的
字符串比较特殊,他不会因为你修改了就直接对你的字符串常量池作修改,字符串的修改是将你的引用改成新的引用。
3、构造方法
格式:
方法名与类名相同,大小写也要一致
没有返回值类型,连void都没有
没有具体的返回值(不能由return带回结果数据)
执行时机:
创建对象的时候调用,每创建一次对象,就会执行一次构造方法
不能手动调用构造方法(即不可以.Dog)
作用:
用于给对象的属性进行初始化
class student{
int age;
public student(){
age=18;
}
}
//上面这是不合理的,会使得所有的student对象的age都是18
//应该使用下面这个方式
class student{
int age;
public student(int age){
this.age=age;//也可以写为age=age,
//但是前一个为类中的成员变量age,后一个为int age的局部变量,
//此时为了区分,可以给成员变量加上this.
}
}
//调用时如下
student st1 = new student(23)
//无参数的构造方法
public DOg(){
System.out.println("这是无参数的构造方法");
System.out.println("构造方法,每当我们new一个Dog的时候就会执行");
}
//有参数的构造方法
public Dog(String s1,int i1){
System.out.println("这是有参数的构造方法,它有两个参数,第一个是string"+s1);
System.out.println("这是有参数的构造方法,它有两个参数,第二个是int"+i1);
name=s1;
age=i1;
}
//以上这种既含有参构造器,又含有无参构造器的方法,称之为构造器的重载-reload
4、关于this关键字
//构造方法,如果你一个都不写
//那么javac编译时会自动生成一个无参共有的构造方法
//如果你写了某一个构造方法,那么你这个自动生成的无参共有的构造方法将不在生成
public Cat(String name) {
//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.println("abc");
System.out.println(123);
System.out.println(new Dog());
}
方法重载,我们需要让JVM在执行代码的时候可以准确定位出,我们需要调用的方法由于方法名是一样的,对于不同的返回值而言,存在返回值可以不去接受这种情况
public class A {
public void method1() {
System.out.println("method1");
}
public String method1() {
System.out.println("123");
return "";
}
}
pulic static void main (String[]args){
A a = new A();
a.method1();
a.method1();
}
如同上述案例,我们都无法区分13和14行到底执行的是3还是6行代码,所以Java不允许写重名、同参的方法,除非你这几个同名方法的参数不同,此时称之为方法的重载。
6、成员变量
局部变量的作用域仅限于定义它的方法
成员变量的作用域在整个类内部都是可见的
初始值不同
Java会给成员变量一个初始值
Java不会给局部变量赋予初始值
在同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级(就近原则)
的是3还是6行代码,所以Java不允许写重名、同参的方法,除非你这几个同名方法的参数不同,此时称之为方法的重载。
6、成员变量
局部变量的作用域仅限于定义它的方法
成员变量的作用域在整个类内部都是可见的
初始值不同
Java会给成员变量一个初始值
Java不会给局部变量赋予初始值
在同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级(就近原则)