面向对象基础(二刷黑马)

1.快速入门:

创建两个对象打印小明小红的总成绩与平均成绩

package com.itheima.object;

public class Text {
    public static void main(String[] args) {
        //创建一个学生对象,封装小红的数据
        Student s1=new Student();
        s1.name="小红";
        s1.math=100;
        s1.chinese=96;
        s1.printTotalScore();
        s1.printAverageScore();
        //再创建一个学生对象,封装小明的数据
        Student s2=new Student();
        s2.name="小明";
        s2.chinese=59;
        s2.math=90;
        s2.printTotalScore();
        s2.printAverageScore();
    }
}
package com.itheima.object;

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.0);
    }
}

 

2.深刻认识

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

Student s1=new Student();

每次new Student(),就是在堆内存中开辟一块内存区域代表一个学生

s1变量里面记住的是学生对象的地址

1.如何识别引用类型的变量?

Student s1=new Student();

s1变量中存储的是对象的地址,因此变量s1也称为引用类型的变量

注意:

1.类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如Student、Car

2.类中定义的变量也称为成员变量,类中定义的方法也称为成员方法

3.成员变量本身存在默认值,定义成员变量的时候一般来说不需要赋初始值

4.一个代码文件中,可以写多个class类,但只能用一个public修饰,且public修饰的类名必须成为代码文件名

5.对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响了

多个变量指向同一个对象:

 

package com.itheima.object;

public class Text2 {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "xiaoming";
        Student s2 = s1;
        s2.name="xiaohong";
        System.out.println(s1.name);
    }
}

 

将s1赋值给了s2,此时s1与s2是同一个地址,在给s2赋值“xiaohong”时,该地址为被赋值为“xiaohong”,所以在输出s1的name时输出为xiaohong

6.如果某个对象没有一个变量引用它,则该对象无法被操作了,该对象会成为所谓的垃圾对象,但是Java存在自动垃圾回收机制,会自动清除掉垃圾对象,不怕占用内存

this关键字

this就是一个变量,可以用在方法中,来拿到当前对象;哪个对象调用方法,this就指向哪个对象,也就是拿到哪个对象

package com.itheima.thisdemo;

public class Student {
    public void printThis(){
        System.out.println(this);
    }

}
package com.itheima.thisdemo;

public class Test {
    public static void main(String[] args) {
        Student s1=new Student();
        System.out.println(s1);
        s1.printThis();
        System.out.println("------------------");
        Student s2=new Student();
        System.out.println(s2);
        s2.printThis();

    }
}

 

 this应用场景:当对象的成员变量与方法内部变量的名称一样时,解决变量名字冲突问题

package com.itheima.thisdemo;

public class Student {
    double score;
    public void printThis(){
        System.out.println(this);
    }
    public void printPass(double score){
        if (this.score>score){
            System.out.println("恭喜您被录取");
        }else {
            System.out.println("落选了");
        }
    }

}

 

package com.itheima.thisdemo;

public class Test {
    public static void main(String[] args) {
        Student s1=new Student();
        System.out.println(s1);
        s1.printThis();
        System.out.println("------------------");
        Student s2=new Student();
        System.out.println(s2);
        s2.printThis();
        Student s3=new Student();
        s3.score=325;
        s3.printPass(250);

    }
}

 

 

 

构造器

构造器特点:创建对象时,对象会去调用构造器

Student s=new Student();

 

package com.itheima.constructor;

public class Test {
    public static void main(String[] args) {
        Student s1=new Student();
        System.out.println("-----------------");
        Student s2=new Student("xiaoming",99);

    }
}

 

package com.itheima.constructor;

public class Student {
    //无参构造器
    public Student(){
        System.out.println("无参构造器被触发执行了");

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

    }


}

 

 

 

构造器的常见应用场景

1.创建对象时,完成对对象成员变量的初始化赋值

 

package com.itheima.constructor;

public class Test {
    public static void main(String[] args) {
        Student s2=new Student("xiaoming",99);
        System.out.println(s2.name);
        System.out.println(s2.score);


    }
}

 

package com.itheima.constructor;

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;

    }


}

 

 

注意事项:

类在设计时,如果不写构造器,JAVA会为类自动生成一个无参构造器

一旦定义了有参构造器,Java就不会帮我们的类自动生成无参构造器了,此时建议自己手写一个无参构造器出来

如:

package com.itheima.constructor;

public class Test {
    public static void main(String[] args) {
        Student s2=new Student("xiaoming",99);
        System.out.println(s2.name);
        System.out.println(s2.score);
        Teacher t=new Teacher();


    }
}

 

package com.itheima.constructor;

public class Teacher {
    public Teacher(String name){

    }
}

 此时会报错,因为已经构造了有参构造器,不难通过new Teacher()调用无参构造器

封装

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

2.封装的设计规范:合理隐藏,合理暴露

3.代码层面如何控对象的成员公开或隐藏?

4.公开成员,可以使用public进行修饰

隐藏成员,使用private(私有)进行修饰

实体类

一种特殊形式的类,这个类中的成员变量都要私有,并且要对外提供相应的getxxx,setxxx方法,必须有无参数构造器

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

实体类:

package com.itheima.javabean;

public class Student {
    //私有化成员变量,并为每个成员变量都提供get set方法
    private String name;
    private double score;
    //必须为类提供一个公开的无参构造器


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

    public Student() {
    }//无参构造器

    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 com.itheima.javabean;

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()+"学生成绩不及格");
        }
    }
}

 

package com.itheima.javabean;

public class Test {
    public static void main(String[] args) {
        Student s1=new Student();
        s1.setName("xiaohong");
        s1.setScore(99);
        System.out.println(s1.getName());
        System.out.println(s1.getScore());
        StudentOperator operator=new StudentOperator(s1);
        operator.printPass();
    }
}

 

面向对象综合案例——模仿电影信息系统

需求:

1.展示系统中的全部电影(每部电影显示:名称,价格)。

2.允许用户根据电影编号(id)查询出某个电影的详细信息。

实体类:

package com.itheima.moviedemo;

public class Movie {//保存电影数据
    private int id;
    private String name;
    private double price;
    private double score;
    private String director;
    private String actor;
    private String info;

    public Movie() {
    }

    public double getScore() {
        return score;
    }

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

    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 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 Movie(int id, String name, double price, String director, String actor, String info,Double score) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.director = director;
        this.actor = actor;
        this.info = info;
        this.score=score;

    }
}

 操作类:

package com.itheima.moviedemo;

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];
            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("没有找到该电影");
    }


}

 主类:

package com.itheima.moviedemo;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Movie[] movies=new Movie[4];
        movies[0]=new Movie(1,"独门桥",38.9,"徐克","吴京","12万人想看",9.8);
        movies[1]=new Movie(2,"出拳吧",39,"唐晓白","田雨","3.5万人想看",7.8);
        movies[2]=new Movie(3,"月球陨落",42,"罗兰","贝瑞","17.9万人想看",7.9);
        movies[3]=new Movie(4,"一点就到家",35,"许宏宇","刘昊然","10.8万人想看",8.7);
        MovieOperator operator=new MovieOperator(movies);
        while (true) {
            System.out.println("==电影信息系统==");
            System.out.println("1.查询全部电影信息");
            System.out.println("2.根据id查询某个电影的详细信息展示");
            System.out.println("请您输入操作命令:");
            Scanner sc=new Scanner(System.in);
            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("您输入的命令有误");
            }
        }
    }
}

 

成员变量和局部变量的区别:

区别成员变量局部变量
类中位置不同类中,方法外常见于方法中
初始化值不同有默认值,不需要初始化赋值没有默认值,使用之前必须完成赋值
内存位置不同堆内存栈内存
作用域不同整个对象在所归属的大括号中
生命周期不同与对象共存亡随着方法的调用而生,随着方法的运行而结亡