Java面向对象入门:从零搞懂类与对象、封装、this、构造方法,一文掌握Javabean标准写法

Java面向对象入门:从零搞懂类与对象、封装、this、构造方法,一文掌握Javabean标准写法 如果你问Java程序员Java最重要的语法是什么十个人里有九个会告诉你面向对象。没错面向对象是Java语法的基石。如果这个章节不会可以说整个Java就炸了——后面的集合、IO、多线程、框架全都学不下去。很多初学者觉得面向对象很难因为它太抽象了。但当你真正理解它的本质会发现它其实很简单就是把零散的数据组织成一个整体就像把一堆散件装进一个盒子里。今天这篇文章我们就从零开始彻底搞懂面向对象的核心概念类与对象、数据安全、this关键字、构造方法以及标准Javabean类的写法。一、为什么需要面向对象想象一下你要记录一只小狗的信息名字、身高、体重、颜色、性别。如果用最原始的方式你需要定义5个变量String name 小白; int height 30; int weight 10; String color 白色; String gender 公;如果只有一只狗还好。但如果有三只狗呢String name1 小白, name2 小黑, name3 小黄; int height1 30, height2 35, height3 28; int weight1 10, weight2 12, weight3 9; // ... 变量越来越多越来越乱问题出在哪里数据是零散的变量之间没有关联。解决问题的思路很简单把零散的数据封装成一个整体。就像生活中把散落的物品放进一个包里以后只需要面对这个包。在Java中这个“包”就是对象。而面向对象编程就是面向一个个完整的对象编程不再处理零散的数据。二、类与对象先有类后有对象类的定义类是对一类事物的统一描述。它规定了这类事物必须包含哪些属性。public class Dog { String name; // 名字 int age; // 年龄 int weight; // 体重 String color; // 颜色 }重要类中只定义属性变量不赋值。因为类只是描述不代表具体的某一只狗。如果提前赋值所有狗都会有这个默认值不符合现实逻辑。创建对象有了类的描述就可以创建具体的对象了// 创建对象语法 Dog d new Dog(); // 给属性赋值 d.name 小白; d.age 2; d.weight 10; d.color 白色;newJava关键字开辟一块新内存创建一个符合类定义的对象d对象的名字引用变量.调用对象内部的属性或方法如果有多只狗重复这个过程即可。Javabean类和测试类在Java中有两种特殊的类Javabean类描述一类事物不需要main方法。比如Dog、Student、Phone等。测试类带有main方法是程序入口用于创建Javabean对象并测试功能。类的行为类不仅能定义属性还能定义行为方法public class Teacher { String name; int age; // 行为授课 public void teach() { System.out.println(老师在授课); } // 行为吃饭 public void eat() { System.out.println(老师在吃饭); } }注意Javabean类中的方法不加static关键字。三、数据安全问题private关键字上面的代码有个严重问题属性是公开的外部可以直接修改。Dog d new Dog(); d.age -200; // 语法正确但逻辑错误年龄不能为负解决这个问题需要把属性“藏起来”只暴露受控的访问方式。这就是封装。private关键字private是权限修饰符被它修饰的成员只能在本类内部访问外部无法直接访问。public class Dog { private int age; // 私有化外部不能直接访问 }get/set方法私有化后外部怎么访问提供公共的get和set方法public class Dog { private int age; // set方法赋值可以做数据校验 public void setAge(int age) { if (age 0 age 30) { this.age age; } else { System.out.println(年龄非法); } } // get方法获取值 public int getAge() { return age; } }测试类中使用Dog d new Dog(); d.setAge(2); // 合法 d.setAge(-200); // 非法被拦截数据安全的标准步骤所有成员变量都用private修饰为每个私有属性提供对应的publicget和set方法在set方法中做数据校验四、this关键字区分同名变量在set方法中我们希望参数名和属性名一致这样更直观。但问题来了参数和属性重名了怎么办public void setAge(int age) { age age; // 这是把参数自己赋值给自己没给属性赋值 }就近原则Java在方法中使用变量时遵循就近原则优先找方法内的局部变量找不到才找成员变量。上面的代码中两个age都是局部参数所以age age毫无意义。this的作用this代表当前对象的成员变量。加上this.前缀就明确指定要访问的是成员变量。public void setAge(int age) { this.age age; // 把参数赋值给当前对象的成员变量 }练习看代码说结果public class Student { private int age; public void setAge() { int age 10; System.out.println(age); // 10局部变量 System.out.println(this.age); // 0成员变量没赋值默认0 } }五、构造方法创建对象时直接赋值用set方法赋值需要多行代码如果属性很多就很麻烦Student s new Student(); s.setName(张三); s.setAge(23); s.setHeight(175); s.setWeight(65);有没有办法在创建对象的同时就把值赋好构造方法的定义构造方法是一种特殊的方法在创建对象时自动调用用于给属性初始化。格式public 类名(参数列表) { // 赋值逻辑 }三大特点方法名必须和类名完全相同大小写也要一致没有返回值类型连void都不能写不能使用return返回数据示例完整的学生类public class Student { private String name; private int age; // 无参构造 public Student() { } // 带全部参数的构造 public Student(String name, int age) { this.name name; this.age age; } // get/set方法省略 }使用// 调用无参构造 Student s1 new Student(); // 调用带参构造创建对象的同时完成赋值 Student s2 new Student(张三, 23);构造方法注意事项如果没有手动定义任何构造方法Java虚拟机会自动提供一个默认的无参构造如果手动定义了任意构造方法虚拟机就不再提供默认的无参构造多个构造方法可以构成方法重载方法名相同参数列表不同开发规范无论是否用到都要手动写出无参构造和带全部参数的构造。六、标准Javabean书写规范一个完整的标准Javabean必须包含以下5个部分类名见名知意所有成员变量都用private修饰为每个成员变量提供对应的get和set方法手动编写无参构造和带全部参数的构造根据需求添加成员方法不加static完整示例public class Student { // 1. 属性私有化 private String name; private int age; // 2. 构造方法无参 全参 public Student() { } public Student(String name, int age) { this.name name; this.age age; } // 3. get/set方法 public void setName(String name) { this.name name; } public String getName() { return name; } public void setAge(int age) { if (age 0 age 150) { this.age age; } } public int getAge() { return age; } // 4. 行为方法不加static public void study() { System.out.println(name 正在学习); } }七、总结面向对象核心要点概念作用关键点类描述一类事物只定义属性不赋值对象具体的事物实例用new创建通过.属性访问private数据安全成员变量私有化外部不能直接访问get/set安全访问set中做数据校验this区分同名变量代表当前对象的成员变量构造方法创建对象时赋值方法名同类名无返回值Javabean规范标准写法私有属性 get/set 无参/全参构造写在最后面向对象是Java的灵魂。掌握了今天的内容你就拿到了面向对象的第一把钥匙。记住类是对事物的描述对象是具体的实例。就像“狗”是一个概念“小白”才是一只真实的狗。现在打开IDEA按照标准Javabean规范自己动手写一个学生类吧。