实例1:创建一个学生对象
package demo0312;
// 学生类
public class student {
String name;
double chinese;
double math;
public void printTotalScore(){
System.out.println(name + "的总成绩是:" + (chinese + math));
}
public void printAverageScore(){
System.out.println(name + "的平均成绩是:" + (chinese + math) / 2);
}
}
package demo0312;
// 测试类
public class Test {
public static void main(String[] args) {
student s1 = new student(); // 通过new方法创建新对象
s1.name = "Java"; // 成员变量
s1.chinese = 80;
s1.math = 60;
s1.printTotalScore(); // 调用成员方法
s1.printAverageScore();
}
}
认识面向对象编程
- 世间万物皆对象
- 不同对象有不同的属性(成员变量),和不同的作用(成员方法)
- 对象本质上是一种特殊的数据结构,类似于数据表
- 创建一个对象,就相当于用打印机打印一张数据表,由于是打印机打印出来的,所以每张表格从内容上看是一样的,但是实际上是两张表
- 表格字段名称一样,例如都有姓名、年龄…但是不同的人填写,会有不同的值,即便两个人填写的各项内容一致,但是仍然是两张不同的表,一张属于张三1,一张属于张三2
对象执行原理
- 创建对象时,会在堆内存中创建出一张对象表,并将这张表的内存地址返回给相应的变量
- 操作对象时,是通过变量存储的值,在堆内存中找到相应的对象,然后修改对象的某些属性或执行对象的某些方法
- 变量 ≠ 对象,变量存储的只是对象在堆内存中的地址
类于对象的注意事项
- 类名建议使用英文单次,首字母大写,满足驼峰方式,且要有意义
- 类中的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为)
- 成员变量本身存在默认值,一般不需要赋予初始值(意义不大)
- 一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类型必须成为代码文件名
- 对象与对象之间的数据不会互相影响,但是多个变量指向同一个对象时,就会有影响
- 如果某个对象没有一个变量引用它,则该对象就无法被操作了,该对象会成为所谓的垃圾对象(会被java自动回收)
this关键字
1.this就是一个变量,可以用来方法中,来拿到当前对象,因为this保存了对象在堆内存中的地址
package demo0312;
// 学生类
public class student {
public void printThis(){
System.out.println("调用printThis获取this:" + this);
}
}
package demo0312;
// 实例类
public class Test {
public static void main(String[] args) {
student s1 = new student();
System.out.println("打印对象的地址:"+ s1);
s1.printThis();
}
}
2.this的应用场景: 主要是用来解决变量名称冲突问题的
package demo0312;
// 创建一个学生类,掌握this的应用场景
// 需求: 判断学生成精是否大于学校要求的成绩来打印是否几个
public class student {
double score;
public void printPass(double score){
// 这里会出现异常,因为两个score都是形参,而不是对象的成员变量score
if(score > score){
System.out.println("你的成绩及格了~~");
}else{
System.out.println("你的成绩不及格~~");
}
}
public void printThisPass(double score){
// 通过使用this可以解决形参和成员变量一致的异常
if(this.score > score){
System.out.println("this你的成绩及格了~~");
}else{
System.out.println("this你的成绩不及格~~");
}
}
}
package demo0312;
public class Test {
public static void main(String[] args) {
student s1 = new student();
s1.score = 90;
s1.printPass(60); // 不论输入什么,永远打印不及格
s1.printThisPass(60);
}
}
构造器
package demo0312;
public class student {
double math;
double chinese;
String name;
// public 类名(...){} 这样形式的方法就被成为构造器,会在new的时候被执行
public student(){
System.out.println("无参数构造器被触发了~~");
}
// 带有参数的构造器成为有参构造器
public student(double math, double chinese, String name){
this.name = name;
this.math = math;
this.chinese = chinese;
System.out.println("有参构造器被触发了~~");
}
}
package demo0312;
public class Test {
public static void main(String[] args) {
student s1 = new student();
student s2 = new student(66, 72, "小白");
System.out.println(s2.name);
}
}
构造器的注意事项
- 类在设计时,如果没有编写构造器,Java会为类自动生成一个无参数构造器
- 一旦定义了有参数构造器,Java就不会在自动生成无参数构造器了,为了防止后面在使用时忽略这一点,建议在手写一个无参数构造器
面向对象特性:封装
定义: 把要处理的数据以及这些数据的处理方法,设计到一个对象中去
实际规范: 合理隐藏 合理暴露
package demo0313;
public class Student {
// 将变量的set get方法公开出去,让用户通过方法来对变量进行设置
// 这样做的好处是,可以在get、set方法中设计一些规范,保障变量的合理性
public double getScore() {
printPass();
return score;
}
public void setScore(double score) {
if(0 < score && score <= 100){
this.score = score;
}else {
System.out.println("数据非法~~");
}
}
// private 修饰的方法或变量,会让外部无法访问,也就是隐藏起来了
private double score;
private void printPass(){
System.out.println(score > 60 ? "成绩合格" : "成绩不及格");
}
}
package demo0313;
public class Test {
public static void main(String[] args) {
Student s1 = new Student();
// printPass方法被隐藏了,无法在外部访问
// s1.printPass()
s1.setScore(-102); // 数据非法,可以保障score不被恶意数据改变
System.out.println(s1.getScore());
s1.setScore(85);
System.out.println(s1.getScore());
}
}
实体JavaBean(实体类)
1.类中的成员变量都要私有,且提供对应的get、set方法
2.类中必须要有一个公共的无参构造器
package demo0313;
public class Student {
// 所有成员变量都私有化
private String name;
private double score;
// 公共的无参数构造器必须有
public Student() {
}
// 有参数构造器可有可无
public Student(String name, double score) {
this.name = name;
this.score = score;
}
// 提供每个变量的get、set方法
// 实体类中除了get、set方法,不能有其他方法
// 实体类只负责数据的存取
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
package demo0313;
public class StudentOperator {
// 辅助实体类,创造实体类的操作方法
private Student student;
public StudentOperator(Student student){
this.student = student;
}
public void printPass(){
System.out.println(student.getScore() > 60 ? "成绩合格" : "成绩不及格");
}
}
package demo0313;
public class Test {
public static void main(String[] args) {
Student s1 = new Student();
s1.setScore(85);
s1.setName("小白");
System.out.println(s1.getName());
System.out.println(s1.getScore());
StudentOperator operator = new StudentOperator(s1);
operator.printPass();
}
}