java第四天---类与对象2
1、方法的重载
2、类的构造方法
3、static
4、包
5、权限修饰符
一、方法的重载
方法的重载要解决的问题:当一个类中存在很多方法时,对开发很不友好,方法名太多太不好记忆。这时候如果能够让多个方法的方法名相同,让参数列表不同,就能实现不同的功能,让开发者使用时也比较轻松。解决这个问题就是方法的重载。
方法重载的特点:
①方法重载是在同一个类中发生的
②方法重载的方法名相同,参数列表不同(可以是参数个数不同,参数类型不同,参数顺寻不同)。
③返回值没有要求,可以相同,可以不同
示例:
二、构造函数
什么是构造函数?
一个特殊的方法,构造函数存在于类中,作用是创建对像时对其进行初始化,就是为对象中的属性进行赋值
构造函数的特点:
①函数名和类名相同
②没有返回值
③没有static修饰
④构造函数分为有参构造和无参构造,符合方法重载的要求,也就时说可以多个构造函数以满足不同的初始化要求。
⑤当类中没有写构造函数时,java会默认有个无参的构造方法。但是当你写了有参构造方法时,这个默认的无参构造方法就没有了。我们提议将无参构造方法手写出来。
示例:
创建一个类:
public class cao {
String color;
int height;
// 无参构造
public cao(){};
// 有参构造
public cao(String color,int height){
/*我们在参数列表中使用的参数名和类的属性名是相同的,所以我们需要在属性名前使用
this来对参数名和属性名进行区分,this指的是当前对象,this.属性名,就是对象的属性
*/
this.color=color;
this.height=height;
}
public void instrustor(){
System.out.println("这是"+color+"的草,高为"+height);
}
}
测试类:
public class CaoTest { public static void main(String[] args) { // 使用无参构造创建对象 cao cao = new cao(); cao.height=8; cao.color="黄色"; cao.instrustor(); // 使用有参构造创建对象 cao cao1 = new cao("绿色", 69); cao1.instrustor(); } }
三、static关键字
static可以做什么?
static可以修饰变量,方法,代码块。
静态变量、静态方法,静态代码块。
特点:
①静态方法只能调用静态变量和静态方法
②实例方法(除了静态方法和构造方法)可以调用普通成员变量,静态变量,实例方法,成员方法
③静态变量和静态方法通过类直接调用:类名.变量/方法名。也可以new对象调用,但是不推荐
④被static修饰的变量、方法、代码块都是类的组成,在程序加载时加载,只加载一次
为什么要使用static关键字?
举个实例大家理解一下,举一个砍树的例子,首先声明,我们要保护环境,保护我们的家园。
目前有50棵树,由三个伐木工一块砍伐:
代码实例一:第一个实例中,num属性没有使用static修饰
public class Rosser { // 树的数量 int num=50; // 普通类成员变量 int pNum; //人数 public Rosser(){} // 静态代码块 :此处只为展示静态代码块的写法,并无其他意义 // 静态修饰的各种东西都是在程序加载的时候就加载进内存,所以静态代码块执行的比对象实例化早 static { System.out.println("这是一片树林"); } // 静态方法:此处只为展示静态方法的写法,所以该方法并无任何实际意义 public static void zhongshu(){ System.out.println("zhognshu"); } public int kanshu(){ return --num; } }
运行结果:
public class ShuTest { public static void main(String[] args) { Rosser rosser1 = new Rosser(); int kanshu = rosser1.kanshu(); System.out.println("伐木工一:还剩"+kanshu+"棵树"); Rosser rosser2 = new Rosser(); int kanshu2 = rosser2.kanshu(); System.out.println("伐木工二:还剩"+kanshu2+"棵树"); Rosser rosser3 = new Rosser(); int kanshu3 = rosser3.kanshu(); System.out.println("伐木工一:还剩"+kanshu3+"棵树"); } } /*控制台中的运行结果: 这是一片树林 伐木工一:还剩49棵树 伐木工二:还剩49棵树 伐木工一:还剩49棵树 */
从结果看出,每个伐木工砍过树之后都是只剩49棵,这是不符合逻辑的
代码示例二:这次使用static修饰num属性
public class Rosser { // 树的数量 static int num=50; // 普通类成员变量 int pNum; //人数 public Rosser(){} // 静态代码块 :此处只为展示静态代码块的写法,并无其他意义 // 静态修饰的各种东西都是在程序加载的时候就加载进内存,所以静态代码块执行的比对象实例化早 static { System.out.println("这是一片树林"); } // 静态方法:此处只为展示静态方法的写法,所以该方法并无任何实际意义 public static void zhongshu(){ System.out.println("zhognshu"); } public int kanshu(){ return --num; } }
运行结果:
public class ShuTest { public static void main(String[] args) { Rosser rosser1 = new Rosser(); int kanshu = rosser1.kanshu(); System.out.println("伐木工一:还剩"+kanshu+"棵树"); Rosser rosser2 = new Rosser(); int kanshu2 = rosser2.kanshu(); System.out.println("伐木工二:还剩"+kanshu2+"棵树"); Rosser rosser3 = new Rosser(); int kanshu3 = rosser3.kanshu(); System.out.println("伐木工一:还剩"+kanshu3+"棵树"); } } /*控制台输出的结果: 这是一片树林 伐木工一:还剩49棵树 伐木工二:还剩48棵树 伐木工一:还剩47棵树 */
这次的输出是没有问题的,符合现实逻辑。
详解:没有被static修饰的num属性,会随着每次创建对象而初始化,也就导致了每个伐木工的对象的num数量都是50棵。被static修饰的属性,是类的属性,在程序加载时加载,早已经存在于内存中,不会再随对象的实例化而实例化,每个对象都是访问内存的同一个num.
四、权限修饰
什么是权限修饰符?
权限修饰符共四种:private(私有的)、protected(受保护的)、public(公共的)、default
权限修饰符做什么使用?
权限修饰符用来对类、方法、属性进行修饰,用来控制各个东西的访问权限。默认是default.
以下是每个修饰符修饰的东西的作用范围:
_____________同一类______同一包________同一包的子类________不同包子类_______其他__________
public 可以 可以 可以 可以 可以
protected 可以 可以 可以 不可以 不可以
default 可以 可以 不可以 不可以 不可以
private 可以 不可以 不可以 不可以 不可以