Java 类和对象
对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
类:类是一个模板,它描述一类对象的行为和状态。
下图中男孩女孩为类,而具体的每个人为该类的对象:
Java中的对象现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。对比现实对象和软件对象,它们之间十分相似。软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。
类和对象的关系
类:对一类事物行为和状态的抽象描述(图纸、模板)
对象:用类实例出来的具体事物(房子)
定义一个类,使用 class 修饰
注意:一个文件中,只运行一个 public 修饰的类
类中包含:
对类的描述:(属性和行为)
属性:一般都使用名词来修饰
行为:一般都使用动词来修饰
类中写
成员变量(实例方法)写在类中方法外
成员方法(实力方法)写在类中
创建对象:
类名 对象名 = 初值;
类名 对象名 = new 类名();
例如:
// 创建一个对象
Animal dog = new Animal();
// 访问成员变量:对象.成员变量
// 如果成员变量在等号前面叫赋值,等号后面叫获取
// 给成员变量赋值
dog.name = "来福";
// 获取成员变量
String stringName = dog.name;
System.out.println(stringName);
// 调用成员方法:对象.方法
dog.sayHi();
dog.eat();
dog.sleep();
// 创建一个动物类 (姓名,年龄,雌雄,会介绍自己,睡觉,觅食)
// 思考:如果在类中声明成员变量没有给初值,那么这个变量有初值吗?
// 有,因为对象创建在堆内存(堆内存中有默认的初始值)
class Animal {
// 成员变量的作用域是整个类中都可以访问到
String name = "旺财"; // 姓名
int age = 2; // 年龄
String gender = "公"; // 性别
// 成员方法
public void sayHi() {
System.out.println("名字:" + name);
System.out.println("年龄:" + age);
System.out.println("性别:" + gender);
}
// 睡觉
public void sleep() {
System.out.println(name + "zzz~");
}
// 觅食
public void eat() {
System.out.println(name + "进食");
}
}
匿名对象
1.如果只调用方法,这时可以使用匿名对象(测试时会调用)
2.匿名对象可以当做参数进行传递
好处:当参数时,代码简便
弊端:无法直接修改里面的值
new Person().introduce();
new Person().username ="007";
new Person().introduce();
思考:
// 方法需要什么参数,就创建什么参数传进去
// 当参数为引用数据类型时,需要创建出这个对象,然后将地址穿进去
// 你需要创建出这个对象,然后将地址穿进去
// 有几个对象 几个引用? 这块内存空间,有多少人使用它
Person p = new Person();
Person person10 = create("王10", p);
person10.introduce();
p.introduce();
Person p2 = person10;
p2.introduce();
p2.username = "王 p2";
p2.introduce();
// 创建一个人
Person person = new Person();
person.username = "刘一";
person.password = "1";
person.randomNum = (int)(Math.random() * (9999 - 1000 + 1) + 1000);
person.introduce();
// 创建一群人
create("陈二", "2", (int)(Math.random() * (9999 - 1000 + 1) + 1000));
create("张三", "3", (int)(Math.random() * (9999 - 1000 + 1) + 1000));
create("李四", "4", (int)(Math.random() * (9999 - 1000 + 1) + 1000));
create("王五", "5", (int)(Math.random() * (9999 - 1000 + 1) + 1000));
create("赵六", "6", (int)(Math.random() * (9999 - 1000 + 1) + 1000));
create("孙七", "7", (int)(Math.random() * (9999 - 1000 + 1) + 1000));
create("周八", "8", (int)(Math.random() * (9999 - 1000 + 1) + 1000));
create("吴九", "9", (int)(Math.random() * (9999 - 1000 + 1) + 1000));
create("郑十", "0", (int)(Math.random() * (9999 - 1000 + 1) + 1000));
// 创建对象
public static Person create(String username, String password, int randomNum) {
Person person = new Person();
person.username = username;
person.password = password;
person.randomNum = randomNum;
person.introduce();
return person;
}public static Person create(String username, Person p) {
Person person = new Person();
person.username = username;
person.introduce();
return person;
}
class Person{
String username;
String password;
int randomNum;
// 介绍自己
public void introduce() {
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
System.out.println("卡号:" + randomNum);
}
}
思考:类能不能重名?
可以,在不同 Package 下可以重名使用
例如:
com.lanou3g.bean.Cat cat = new com.lanou3g.bean.Cat();
cat.setName("大花");
cat.setColor("黄色");
cat.setBreed("波斯猫");
cat.sayHi();
cat.eatFish();
cat.actingCute();
cat.getCaught();
// 创建 bean1包下得到 Cat 对象
// 如果类名相同的话,创建对象的时候
// 要使用全限定类名(包名 + 类名)
// com.lanou3g.bean1.Cat cat1 = new com.lanou3g.bean1.Cat();
// cat1.sayHi();
public class Cat {
private String name;
private String color;
private String breed;
// 无参构造方法
public Cat() {
name = "阿花";
color = "七彩";
breed = "biubiu 喵";
System.out.println("构造方法");
}
// 有参构造方法
public Cat(String name, String color, String breed) {
this.name = name;
this.color = color;
this.breed = breed;
System.out.println("构造方法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getBreed() {
return breed;
}
public void setBreed(String breed) {
this.breed = breed;
}
public void eatFish() {
System.out.println("吃鱼");
}
public void actingCute() {
System.out.println("卖萌,喵~");
}
public void getCaught() {
System.out.println("被老鼠抓,难受");
}
public void sayHi() {
System.out.println(getName());
System.out.println(getBreed());
System.out.println(getColor());
}
}
get/set 方法
成员变量私有化时,需要使用 get/set 方法来获取/修改成员变量
例如:
Student student = new Student();
// 使用 get/set 方法
student.setName("student_1");
student.setAge(21);
student.sayHi();
class Student {
// 成员变量私有化(只能本类进行访问,本类以为无法访问)
// 不能通过对象.属性来直接访问
// 但是可以通过方法来间接访问
private String name;
private int age;
// get/set 方法
// 命名规范:以 get/set 开头,使用小驼峰写法
// 获取
public String getName() {
return name;
}
// 修改
public void setName(String name) {
// 提供关键字 this 代表本类的对象
// 哪个对象调用这个方法,这个对象就是 this
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 就近原则(这里会打印局部变量
public void sayHi() {
String name = "爱上了登记卡死";
System.out.println(name);
System.out.println(getName());
System.out.println(getAge());
}
}
成员变量和局部变量的区别
1.书写位置
成员变量:类中方法外
局部变量:方法中或方法声明上
2.内存中的位置
成员变量:存在于堆内存中
局部变量:加载到栈内存中
3.初值
成员变量:有默认初始值(堆给的)
局部变量:无默认值,如果要调用,必须要赋予初值
4.生命周期
成员变量:随着对象的创建/销毁而创建/销毁
局部变量:随着方法存在
例如:
// 创建对象
Car car = new Car();
// 赋值
car.brand = "玛莎拉蒂";
car.color = "红色";
car.tire = "4";
// 调用对象中的方法
car.introduce();
car.move();
car.thrustInto();
class Car {
String brand; // 牌子
String color; // 颜色
String tire; // 轮胎个数(数据类型只要符合逻辑,即可定义,例如 tire 不能用 double 来定义)
// 会动
public void move() {
// 局部变量
// 声明位置: 方法中或者方法声明上(参数位置)
int num = 0;
System.out.println(num);
System.out.println(brand + "飘逸");
}
// 会撞人
public void thrustInto() {
System.out.println(brand + "飘逸速度太快了,撞人了");
}
// 介绍自己
public void introduce() {
System.out.println("品牌:" + brand);
System.out.println("颜色:" + color);
System.out.println("轮胎:" + tire);
}
}