杰神之Java类和对象的关系

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值