黑马JAVA入门学习笔记6

一、面向对象编程的理解

先写一个学生对象,也就是一个学生类,里面包括对象的属性以及一些功能。

public class student {
    String name;
    double chinese;
    double math;
    public void sum(){
        System.out.println(name+"的总成绩是:"+(chinese+math));
    }
    public void average(){
        System.out.println(name+"的平均成绩是:"+(chinese+math)/2.0);
    }
}

另外新建一个test类,开发一个一个对象,把数据交给对象,在调用对象的方法来完成对数据的处理。

public class test {
    public static void main(String[] args) {
        //面向对象编程快速入门
        //创建一个学生对象,封装波妞的数据
        student s1=new student();
        s1.name="波妞";
        s1.chinese=100;
        s1.math=100;
        s1.sum();
        s1.average();
        //创建第二个学生的对象
        student s2=new student();
        s2.name="波仔";
        s2.chinese=59;
        s2.math=100;
        s2.sum();
        s2.average();
    }
}

 程序中的对象是什么?

  • 对象本质上是一种特殊的数据结构
  • class也就是类,也称为对象的设计图(或者对象的模板)  

有了类就可以创建出对象: 类名 对象名=new 类名()  

二、对象在计算机中的执行原理

  •  每次new student(),就是在堆内存中开辟一块内存区域代表一个学生对象
  • s1变量记住的是学生对象的地址。因此,s1也称为引用类型的变量

三、类和对象的一些注意事项

  •  类名建议英文单词,首字母大写,满足驼峰式,有意义
  • 类中定义的变量也称为成员变量(对象属性),类中定义的方法也称为成员方法(对象行为)
  • 成员变量本身存在默认值,定义时不需要赋初始值。
  • 一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类名必须成为代码文件名
  • 对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响
  • 如果某个对象没有一个变量引用它,则该对象无法被操作,成为垃圾对象。

四、面向对象的语法知识

 1.this 

  • this就是一个变量,可以用在方法中,来拿到当前对象。

 这里输出的this就是堆内存中对象的地址。

  • this主要用来解决:变量名称冲突问题
public class student {
    double score;
    public void printPass(double score){
        if(this.score>score){
            System.out.println("恭喜");
        }else{
            System.out.println("落选了");
        }
    }
public class test {
    public static void main(String[] args) {
        student s1=new student();
        s1.score=350;
        s1.printPass(250);
    }
}

2.构造器

2.1创建对象时,对象会去调用构造器。

构造器的名字要与类名相同。

public class Student {
    //构造器,也可以重载 无参数构造器
    public Student(){
        System.out.println("无参数构造器");

    }
    //有参数构造器
    public Student(String name,double score){
        System.out.println("有参数构造器");

    }
}

输出:无参数构造器

创建对象的时候,new student后面的()来选择用哪个构造器。选择了无参数构造器

public class test {
    public static void main(String[] args) {
        //认识构造器,掌握构造器的特点,应用场景,注意事项
        Student s=new Student();
    }
}
public class test {
    public static void main(String[] args) {
        //认识构造器,掌握构造器的特点,应用场景,注意事项
        //Student s=new Student();
        Student s=new Student("波仔",99);
    }
}

输出:有参数构造器

2.2构造器的应用:创建对象时,完成对象成员变量的初始化赋值。

public class Student {
    String name;
    double score;
    //构造器,也可以重载 无参数构造器
    public Student(){
        System.out.println("无参数构造器");

    }
    //有参数构造器
    public Student(String name,double score){
        System.out.println("有参数构造器");
        this.name=name;
        this.score=score;

    }
}
public class test {
    public static void main(String[] args) {
        //认识构造器,掌握构造器的特点,应用场景,注意事项
        //Student s=new Student();
        Student s=new Student("波仔",99);
        System.out.println(s.name);
        System.out.println(s.score);
    }
}

2.3构造器的注意事项

  • 类在设计时,如果不写构造器,java是会为类自动生成一个无参构造器。
  • 一旦定义了有参数构造器,java就不会帮我们的类自动生成无参构造器了,此时建议自己手写一个无参构造器

3.封装 

3.1 什么是封装

  • 用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。

3.2 封装的设计规范 

合理隐藏,合理暴露

public class Student {
    private double score;
    public void setScore(double score){
        if(score>=0&&score<=100){
            this.score=score;
        }else{
            System.out.println("数据非法");
        }
    }
    public double getScore(){
        return score;
    }
    public void printPass(){
        System.out.println(score>60?"合格":"不及格");
    }
}

将score设置为private,外部就无法访问,只能通过方法getscore和setscore来设置score的值和获得score的值,这样可以更加安全可靠。


public class test {
    public static void main(String[] args) {
        //掌握封装对象设计规范,合理隐藏,合理暴露
        Student s=new Student();
        s.setScore(99);
        System.out.println(s.getScore());

    }
}

4.实体JavaBean

4.1 什么是实体类

  • 就是一种特殊形式的类:成员变量要私有,对外提供相应的getXX,setXX方法;类中必须有一个公共的无参的构造器。
  • 就是保存某个事物的数据
public class Student {
    //1.必须私有成员变量,提供每个成员变量get和set方法
    private String name;
    private double score;
    //自动生成get和set方法。右键generate

    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;
    }
    //2、必须为类提供一个公开的无参数构造器(默认就有)
    //右键generate生成一个有参构造器和无餐构造器
    public Student() {
    }

    public Student(String name, double score) {
        this.name = name;
        this.score = score;
    }
}
public class test {
    public static void main(String[] args) {
        //掌握实体类的书写要求,特点和应用场景
        Student s1=new Student();
        s1.setName("波妞");
        s1.setScore(99);
        System.out.println(s1.getName());
        System.out.println(s1.getScore());
    }



}

4.2 实体类应用场景 

  • 实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离

 学生对象模板:

public class Student {
    //1.必须私有成员变量,提供每个成员变量get和set方法
    private String name;
    private double score;
    //自动生成get和set方法。右键generate

    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;
    }
    //2、必须为类提供一个公开的无参数构造器(默认就有)
    //右键generate生成一个有参构造器和无餐构造器
    public Student() {
    }

    public Student(String name, double score) {
        this.name = name;
        this.score = score;
    }
}

 学生操作类,先将学生对象传过来,然后进行一个判断是否合格

public class StudentOperator {
    private Student student;
    public StudentOperator(Student student){
        this.student=student;
    }
    public void printPass(){
        if(student.getScore()>=60){
            System.out.println(student.getName()+"合格");
        }else{
            System.out.println(student.getName() +
                    "不合格");
        }
    }
}

public class test {
    public static void main(String[] args) {
        //掌握实体类的书写要求,特点和应用场景
        Student s1=new Student();
        s1.setName("波妞");
        s1.setScore(99);
        System.out.println(s1.getName());
        System.out.println(s1.getScore());

        StudentOperator operator=new StudentOperator(s1);
        operator.printPass();
    }



}

5.面向对象编程综合案例

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        //1.设计一个电影类Movie
        //2.设计一个电影操作类
        //3.准备全部电影信息
        Movie[] movies=new Movie[4];
        Movie m1=new Movie(1,"水门桥",38.9,9.8,"徐克","吴京","12万人数想看");//创建第一个电影对象
        Movie m2=new Movie(2,"出拳吧",39,7.8,"唐晓白","田雨","3.5万人数想看");
        Movie m3=new Movie(3,"月球陨落",42,7.9,"罗兰","贝瑞","17.9万人数想看");
        Movie m4=new Movie(4,"一点就到家",35,8.7,"徐宏宇","刘昊然","10.8万人数想看");
        movies[0]=m1;
        movies[1]=m2;
        movies[2]=m3;
        movies[3]=m4;
        //4.创建一个电影操作类的对象,接收电影数据,对其进行业务处理
        MovieOperator operator=new MovieOperator(movies);
//        operator.printAllMovies();
//        operator.searchMovieById(3);

        Scanner sc=new Scanner(System.in);
        while (true) {
            System.out.println("电影操作系统===");
            System.out.println("1.查询全部电影信息");
            System.out.println("2.根据id查询某个电影详细信息");
            System.out.println("请您输入操作命令:");

            int command=sc.nextInt();
            switch (command){
                case 1:
                    operator.printAllMovies();
                    break;
                case 2:
                    System.out.println("请您输入要查询的id");
                    int id=sc.nextInt();
                    operator.searchMovieById(id);
                    break;
                default:
                    System.out.println("您输入的命令有问题");
            }
        }
    }
}


public class Movie {
    private int id;
    private String name;
    private double price;
    private double score;
    private String director;
    private String actor;
    private String info;
    //右键,generete-get and set-全选 确定
    //右键 generate-constructor-全选 -确定
    //右键 generate-constuctor-select none


    public Movie() {
    }

    public Movie(int id, String name, double price, double score, String director, String actor, String info) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.score = score;
        this.director = director;
        this.actor = actor;
        this.info = info;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public String getDirector() {
        return director;
    }

    public void setDirector(String director) {
        this.director = director;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
}
public class MovieOperator {
    private Movie[] movies;//定义数组
    //定义有参构造器,把电影数组传递进来
    public MovieOperator(Movie[] movies){
        this.movies=movies;
    }
/*写一个方法,展示系统全部电影信息*/
    public  void printAllMovies(){
        System.out.println("系统全部电影信息如下------");
        for (int i = 0; i < movies.length; i++) {
            Movie m=movies[i];//定义电影类型的变量m来记电影对象的地址,
            System.out.println("编号:"+m.getId());
            System.out.println("名称:"+m.getName());
            System.out.println("价格:"+m.getPrice());
            System.out.println("------------------------");

        }
    }
    /*2.根据电影的编号查询电影详细信息展示*/
    public void searchMovieById(int id){
        for (int i = 0; i < movies.length ; i++) {
            Movie m=movies[i];
            if(m.getId()==id){
                System.out.println("电影详情:");
                System.out.println("编号:"+m.getId());
                System.out.println("名称:"+m.getName());
                System.out.println("价格:"+m.getPrice());
                System.out.println("得分:"+m.getScore());
                System.out.println("导演:"+m.getDirector());
                System.out.println("主演:"+m.getActor());
                System.out.println("其他信息:"+m.getInfo());
                return;//已经找到了电影信息
            }
        }
        System.out.println("没有该电影信息");
    }


}

6.成员变量、局部变量的区别

  • 类中位置不同,成员变量(类中,方法外),局部变量(常见于方法中)
  • 成员变量(有默认值,不需要初始化),局部变量(没有默认值,需要赋值)
  • 内存位置不同,成员变量(存在于堆内存),局部变量(栈内存)
  • 作用域不同,成员变量(整个对象),局部变量(所属大括号)
  • 生命周期不同,成员变量(与对象同生共死),局部变量(方法调用生,方法结束亡)

五、总结

 

 

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值