Day02_Java面向对象基础

实例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. 不同对象有不同的属性(成员变量),和不同的作用(成员方法)
  3. 对象本质上是一种特殊的数据结构,类似于数据表
  4. 创建一个对象,就相当于用打印机打印一张数据表,由于是打印机打印出来的,所以每张表格从内容上看是一样的,但是实际上是两张表
  5. 表格字段名称一样,例如都有姓名、年龄…但是不同的人填写,会有不同的值,即便两个人填写的各项内容一致,但是仍然是两张不同的表,一张属于张三1,一张属于张三2

对象执行原理

  1. 创建对象时,会在堆内存中创建出一张对象表,并将这张表的内存地址返回给相应的变量
  2. 操作对象时,是通过变量存储的值,在堆内存中找到相应的对象,然后修改对象的某些属性或执行对象的某些方法
  3. 变量 ≠ 对象,变量存储的只是对象在堆内存中的地址

类于对象的注意事项

  1. 类名建议使用英文单次,首字母大写,满足驼峰方式,且要有意义
  2. 类中的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为)
  3. 成员变量本身存在默认值,一般不需要赋予初始值(意义不大)
  4. 一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类型必须成为代码文件名
  5. 对象与对象之间的数据不会互相影响,但是多个变量指向同一个对象时,就会有影响
  6. 如果某个对象没有一个变量引用它,则该对象就无法被操作了,该对象会成为所谓的垃圾对象(会被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);
    }
}

构造器的注意事项

  1. 类在设计时,如果没有编写构造器,Java会为类自动生成一个无参数构造器
  2. 一旦定义了有参数构造器,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();
    }
}
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值