什么是类
“类” 就是 “同一类事物”,从许多相似的个体抽象出他们共同的特征并为这群个体命名,称之为类。
类拥有属性(成员变量)、行为(成员方法)
什么是对象
类中的每一个个体都是对象,类的某个具体化的实例是对象。
还是参考百度百科吧:https://baike.baidu.com/item/%E7%B1%BB%E5%92%8C%E5%AF%B9%E8%B1%A1/1394902?fr=aladdin
如何创建一个对象
- 先创建再声明
public class Cat{ int age; String name; public static void main(String[] args){ Cat cat; cat = new Cat(); } }
- 直接创建
public class Cat{ int age; String name; public static void main(String[] args){ Cat cat = new Cat(); } }
创建对象的过程
-
先加载Person类的信息(属性和方法信息,只加载一次)
-
在堆中分配内存,进行默认初始化
-
把地址赋值给p,p就指向对象
-
进行指定初始化
public class Cat{ int age; String name; public static void main(String[] args){ Cat cat = new Cat(); cat.name = "Jack"; } }
成员方法
方法传参机制
基本数据类型:值拷贝,形参的变化不会影响实参
引用数据类型:地址拷贝,可以通过改变形参的值来改变实参
方法的递归
方法的重载(OverLoad)
-
重载
构成重载的要素:方法名相同;参数类型,顺序中至少有一个不同public class OvarLoadClass{ public static void main(String[] args){ OvarLoadClass ovarLoadClass = new OvarLoadClass(); ovarLoadClass.cal(1,2); ovarLoadClass.cal(1,2.0); ovarLoadClass.cal(1.0,2); } void cal(int n1,int n2){ System.out.println(a1+a2); } void cal(double n1,int n2){ System.out.println(n1+n2); } void cal(int n1,double n2){ System.out.println(n1+n2); } } //3 //3.0 //3.0
-
重复定义
//不构成重载,方法的重复定义 public class OvarLoadClass{ public static void main(String[] args){ OvarLoadClass ovarLoadClass = new OvarLoadClass(); ovarLoadClass.cal(1,2); } void cal(int a1,int a2){ System.out.println(a1+a2); } void cal(int n1,int n2){ System.out.println(n1+n2); } } // 抛出重复定义的异常
返回类型不同不是构成重载的条件。
// 同样不构成重载,也是方法的重复定义。 public class OvarLoadClass{ public static void main(String[] args){ OvarLoadClass ovarLoadClass = new OvarLoadClass(); ovarLoadClass.cal(1,2); } void cal(int a1,int a2){ System.out.println(a1+a2); } int cal(int a1,int a2){ return a1+a2; } } // 抛出重复定义的异常
-
未发生自动转换的优先级更高
// 在调用ovarLoadClass.cal(1,2);时优先调用void cal(int a1,int a2) public class OvarLoadClass{ public static void main(String[] args){ OvarLoadClass ovarLoadClass = new OvarLoadClass(); ovarLoadClass.cal(1,2); } void cal(int a1,int a2){ System.out.println("int + int"); System.out.println(a1+a2); } int cal(int a1,double a2){ System.out.println("int + double"); System.out.println(a1+a2); } } //int + int //3
可变参数
-
可变参数可以接收0~多个同类型数据作为参数
// 可以接收0~多个int型参数 // 使用可变参数时可以当作数组来使用。 public class VarParameters{ public static void main(String[] args){ VarParameters varParameters = new VarParameters(); varParameters .cal(); varParameters .cal(1,2,3); varParameters .cal(1,2,3,4,5); } public int cal(int... parameters){ System.out.println("number of parameters:"+ parameters.length); int sum=0; for(int i=0;i<parameters.length;++i){ sum += parameters[i]; } return sum; } }
-
可变参数的实参可以为数组
public class VarParameters{ public static void main(String[] args){ int arr[]={1,2,3,4,5}; VarParameters varParameters = new VarParameters(); // 以int型数组作为参数 varParameters .cal(arr); } public int cal(int... parameters){ System.out.println("number of parameters:"+ parameters.length); int sum=0; for(int i=0;i<parameters.length;++i){ sum += parameters[i]; } return sum; } }
-
可变参数可以和其他参数放在一起,但是可变参数必须放在最后
public class VarParameters{ public static void main(String[] args){ VarParameters varParameters = new VarParameters(); varParameters .cal("OK",1,2,3,4,5); varParameters .cal(1,2,3,4,5,"Wrong"); } // 正确的 public int cal(String s,int... parameters){ System.out.println("number of parameters:"+ parameters.length); int sum=0; for(int i=0;i<parameters.length;++i){ sum += parameters[i]; } return sum; } // 错误的 public int cal(int... parameters, String s){ System.out.println("number of parameters:"+ parameters.length); int sum=0; for(int i=0;i<parameters.length;++i){ sum += parameters[i]; } return sum; } }
-
一个形参列表最多只能出现一个可变参数
public class VarParameters{ public static void main(String[] args){ VarParameters varParameters = new VarParameters(); varParameters .cal(1,2,3,"Wrong","错误的"); } // 错误的,最多只能有一个可变参数 public int cal(int... parameters, String... s){ System.out.println("number of parameters:"+ parameters.length); int sum=0; for(int i=0;i<parameters.length;++i){ sum += parameters[i]; } return sum; } }
-
感觉不如直接声明数组作为参数代替可变参数。
public class VarParameters{ public static void main(String[] args){ VarParameters varParameters = new VarParameters(); int arr[]={1,2,3}; String arrs[]={"Wrong","错误的"}; varParameters .cal(arr,arrs); } // 错误的,最多只能有一个可变参数 public int cal(int[] parameters, String[] s){ System.out.println("number of parameters:"+ parameters.length); int sum=0; for(int i=0;i<parameters.length;++i){ System.out.println(parameters[i]); } for(int i=0;i<s.length;++i){ System.out.println(s[i]); } return sum; } }
作用域
- 局部变量的作用域在它的直属{}之内。
public class Cat{ // 全局变量 int age; String name; public static void main(String[] args){ Cat cat; cat = new Cat(); // 局部变量 int h=5; } public void miaomiao(){ // 局部变量 String s = "喵呜~"; System.out.println(s); } }
2.全局变量可以不初始化,有默认值; 局部变量必须初始化,没有默认值
public class Cat{
// 全局变量,默认分别是0和null
int age;
String name;
public static void main(String[] args){
Cat cat;
cat = new Cat();
// 正确的,局部变量,必须初始化
int h=5;
// 错误的, 没有初始化会报错"可能尚未初始化变量n"
int n;
}
public void miaomiao(){
// 局部变量
String s = "喵呜~";
System.out.println(s);
}
}
- 同名局部变量遵循就近原则
public class Cat{ // 全局变量 int age; String name; String s="喵喵~"; public static void main(String[] args){ Cat cat; cat = new Cat(); cat.miaomiao(); } public void miaomiao(){ // 局部变量 System.out.println(s); String s = "喵呜~"; System.out.println(s); } } // 喵喵~ // 喵呜~
- 同一个方法中不能声明两个同名变量
public class Cat{ // 全局变量 int age; String name; public static void main(String[] args){ Cat cat; cat = new Cat(); cat.miaomiao(); } public void miaomiao(){ // 局部变量 String s = "喵呜~"; // 错误的,不可以在同一方法中重复声明同名变量 String s= "喵喵~"; System.out.println(s); } }
- 全局变量可以被本类和其他类使用
本类不用多说
被其他类使用public class Cat{ // 全局变量 int age; String name; public static void main(String[] args){ Cat cat; cat = new Cat(); Dog dog = new Dog(); // 方法1,声明其他类的对象来获取它的全局变量 System.out.println(dog.name); // 方法2,通过传其他类的对象为参数获取它的全部变量 cat.getDogName(dog); } public void getDogName(Dog dog){ System.out.println(dog.name); } } class Dog{ String name="软软"; public static void main(String[] args){ Dog dog = new Dog(); System.out.println(dog.name); } }
- 局部变量不可以加修饰符
public class Cat{ // 全局变量 int age; String name; // 太对了,全局变量可以加修饰符 private String color; public static void main(String[] args){ Cat cat; cat = new Cat(); cat.miaomiao(); } public void miaomiao(){ // 正确的,局部变量就是这样声明,不加修饰符 String s = "喵呜~"; // 错误的,局部变量不能这样声明,加了修饰符会报错 private String s2 ="s2"; System.out.println(s); } }