类是封装对象的属性和行为的载体,在Java中对象的属性以成员变量的形式存在,对象的方法以成员方法的形式存在。
一,基础认识
1.成员变量
对象的属性就是成员变量,成员变量的作用域为整个类
例1:为Book类添加书名属性:
public class Book { //类
private String name; //String类型的成员变量
public String getName(){ //name的Getter方法
return name;
}
public void setName(String name){ //name的Setter()方法
this.name=name; //将参数值赋予类中的成员变量
}
}
在Java中需要使用class关键字来定义类,Book是类的名称。其中成员变量是String类型,成员变量可以设置初始值也可以不设置初始值,不设置的话会有默认值。成员变量前面有private的关键字,它用来定义一个私有成员。
2.成员方法对应于类对象的行为。以例1为例,它包含了setName()方法和getName()方法,这两个成员方法分别为设置图书名称和获取图书名称。
注意:要构造Java中的无返回值的成员方法,可以不使用void关键字表示。
说明:如果一个方法中含有与成员变量同名的局部变量,则方法中对这个变量的访问以局部变量进行。类的成员变量和成员方法也可以统称为类成员。
3.权限修饰符
主要有private,protect,public.且三个关键字的可访问的位置从左到右以此增大。
private:只能在本类中进行访问。
protect:同包的类可以访问(包括其他类和其子类),不同包的子类也可以访问。
public:可以在所有包的类中进行访问。
注意:如果一个类的成员变量没有权限修饰符进行修饰,那么这个成员变量或者方法的访问权限为同包的类才可以访问(包括其他类和子类)。
4.局部变量
如果在成员方法中定义一个变量,那么这个变量被称为局部变量,例如在例1中setName(String name)方法中,String name这个形参可以看作局部变量。
局部变量是在方法被执行时候进行创建,方法被执行结束的时候被销毁。局部变量被使用的时候必须进行赋值或者初始化,否则会出现编译错误。
例2:交换两个整数的值
public class ChangeDemo {
public static int[] exchange(int [] arr){
arr[0]=arr[0]^arr[1]; //数组第一个元素与第二个元素进行异或将结果传给第一个元素
arr[1]=arr[0]^arr[1]; //数组第一个元素与第二个元素进行异或将结果传给第二个元素
arr[0]=arr[0]^arr[1]; //数组第一个元素与第二个元素进行异或将结果传给第一个元素
return arr;
}
public static void main(String[] args) {
int arr[] ={25,45}; //创建一个数组用来接收两个需要交换的值
System.out.println("第一个值为:"+arr[0]+" 第二个值为:"+arr[1]);
arr=exchange(arr); //调用交换方法
System.out.println("第一个值为:"+arr[0]+" 第二个值为:"+arr[1]);
}
}
运行结果如下:
5.this关键字
this关键字用来表示本类当前的对象,当前对象不是某一个实体的类,而是当前正在编辑的类。this关键字只能在本类中进行使用。例如例1中setName()方法。
public class Book { //类
private String name; //String类型的成员变量
public void setName(String name){ //name的Setter()方法
this.name=name; //将参数值赋予类中的成员变量
}
}
以上例子中setName()方法中的形式参数与成员变量的名称相同,都为name,为了区分,所以Java就使用this关键字来代表本类对象的引用。
this关键字可以调用成员变量与成员方法,可以认为this就是本类的一个对象。在成员变量或方法的参数如果覆盖了成员变量的时候,就像以上的情况,就需要使用this关键字明确引用的是类成员的变量而不是局部变量。
二,类的构造方法
构造方法的特点:1.构造方法没有返回值 (构造方法在申明的时候不需要写void) 2.构造方法的名称要与本类的名称相同
注意:在定义类的时候如果没有定义构造方法,那么系统会自动定义一个不带参数的默认构造方法。如果在创建类的时候定义了一个有参数的构造方法,那么系统不会再创建默认的无参构造方法。
例3:构造一个练习生
public class Trainee {
int skill; //偶像练习生会的技能数量
public Trainee() { //无参构造函数
this(1); //使用this关键字在无参构造方法中调用有参构造方法
}
public Trainee(int skill) {//有参构造函数,将技能个数作为参数
this.skill = skill; //将参数技能的值赋值给属性
}
public void show(){
if(skill==1){
System.out.println("大家好,我会唱!");
}else if(skill==2){
System.out.println("大家好,我会唱,跳!");
}else{
System.out.println("大家好,我会唱,跳,rap!");
}
}
public static void main(String[] args) {
//创建练习生对象
Trainee trainee1 = new Trainee(); //无参创建练习生对象
Trainee trainee2 = new Trainee(3); //有参创建练习生对象
trainee1.show();
trainee2.show();
}
}
运行结果如下:
三.静态成员与静态方法
静态成员与静态方法都是用static关键字进行修饰,被修饰的变量和方法属于类所有,区别于个别对象,可以在本类或者其他类使用类名“.”运算符调用静态成员。
例三:统计动物园动物种类。
package com.itheima.edu.info.Demo;
public class Animal {
String name; //动物名称
static int count=0; //动物种类
public Animal() { //无参构造方法
count++; //每构造一次count+1;
}
public Animal(String name) { //有参构造方法
this.name = name;
count++; //每构造一次count+1;
}
public static void main(String[] args) {
Animal animal1 = new Animal("熊猫");
System.out.println("我是动物园第"+Animal.count+"种动物,我的名字叫:"+animal1.name);
Animal animal2 = new Animal("金丝猴");
System.out.println("我是动物园第"+Animal.count+"种动物,我的名字叫:"+animal2.name);
Animal animal3 = new Animal("丹顶鹤");
System.out.println("我是动物园第"+Animal.count+"种动物,我的名字叫:"+animal3.name);
Animal animal4 = new Animal("东北虎");
System.out.println("我是动物园第"+Animal.count+"种动物,我的名字叫:"+animal4.name);
Animal animal5 = new Animal("扬子鳄");
System.out.println("我是动物园第"+Animal.count+"种动物,我的名字叫:"+animal5.name);
}
}
运行结果如下: