java面向对象(1)

面向对象快速入门

对象是一种特殊的数据结构,可以用来记住一个事物的数据,从而代表该事物。
我们知道我的数据可以通过变量或者数组存储,我们的对象也是存储数据的数据结构。
我们的变量存储数据

int max = 15;

数组存储数据

牛二, 西门, 全蛋
String[] names = {"牛二", "西门", "全蛋"} ;
// 或者
String[] names= new String[]{"牛二", "西门", "全蛋"};

对象存储 : 这个也是new 。但是我们下面的报错这是为什么。我们的对象格式不能凭空而来需要我们创建。

package com.hsh.object1;
public class main {
    public static void main(String[] args) {
        // 创建赵丽颖的Star对象并设置属性
        Star s1 = new Star();
        s1.name = "赵丽颖";
        s1.age = 36;
        s1.height = 165.0;
        s1.weight = 44.6;
        // 创建杨幂的Star对象并设置属性
        Star s2 = new Star();
        s2.name = "杨幂";
        s2.age = 37;
        s2.height = 166.5;
        s2.weight = 45.0;
    }
}

设计对象模版

  1. 先设计对象的模板,也就是对象的设计图:类。
    package com.hsh.object1;
    // 明星类 ,明星对象模版
    public class Star {
        String name;
        int age;
        double height;
        double weight;
    }
    
  2. 通过new关键字,每new一次类就得到一个新的对象
    package com.hsh.object1;
    public class main {
        public static void main(String[] args) {
            String[] names= new String[]{"牛二", "西门", "全蛋"};
            // 创建赵丽颖的Star对象并设置属性
            Star s1 = new Star();
            s1.name = "赵丽颖";
            s1.age = 36;
            s1.height = 165.0;
            s1.weight = 44.6;
            // 创建杨幂的Star对象并设置属性
            Star s2 = new Star();
            s2.name = "杨幂";
            s2.age = 37;
            s2.height = 166.5;
            s2.weight = 45.0;
            System.out.println(s1.name);
        }
    }
    

接下来我们使用一个案例来了解一下对象的使用
Student.java

package com.hsh.object2;
public class Student {
    public String name;
    // 语文成绩
    public double chinese;
    // 数学成绩
    public double math;
    public void printTotalScore(){
        System.out.println(name + "的总成绩:" + (chinese + math));
    }
    public void printAverageScore(){
        System.out.println(name + "的平均成绩:" + (chinese + math) / 2);
    }
}

Test.java

package com.hsh.object2;
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "张三";
        s1.chinese = 100;
        s1.math = 100;
        s1.printTotalScore(); // 张三的总成绩:200.0
        s1.printAverageScore(); // 张三的平均成绩:100.0
        System.out.println("======================");
        Student s2 = new Student();
        s2.name = "李四";
        s2.chinese = 59;
        s2.math = 100;
        s2.printTotalScore();// 李四的总成绩:159.0
        s2.printAverageScore();// 李四的平均成绩:79.5
    }
}

啥是对象?深入理解对象

对象本质上是一种特殊的数据结构(可以理解成一张表)。
class也就是类,也称为对象的设计图(或者对象的模板)。
我们的对象相当于我们的模版表
而我们的new new Student();相当于重新打印一张没有填过数据的空表。
在这里插入图片描述

对象在计算机中是啥?

我们知道我的java在JVM中运行,而jJVM在我们电脑的内存中跑。
所以就是我们的java在内存的JVM虚拟机中运行。
JVM会把我们的内存分为:

划分区域作用
方法区存放类文件,对象模版(也是类文件的一种)
用于存放方法,对象地址。先进后出,后进先出。
存放实例化对象

在这里插入图片描述
我们下面来分析一下对象在计算机内存如何运行的。

  1. 当我们加载test类的时候。会把test放入方法区。
    在这里插入图片描述
  2. 程序继续往下执行,把Test类中的main方法放入栈中
    在这里插入图片描述
  3. 程序继续往下执行 Student s1 = new Student(); 这个语句虽然短但是在内存中的存放很复杂。
    • 首先会将Student类文件放入方法区中。如下图的线1。
    • 然后把s1引用类型(也就是是s1的地址)放入栈内存。如下图的线2。
    • 最后new Student(也就是仿照对象模版创建的表,由于没有赋值,这个新表里的值都是默认值)会放入堆内存。如下图的线3。
    • s1的值=创建的新表的地址。而新表中除了存放对象属性,还开辟了一小块空间存放了Student类文件的地址。
      在这里插入图片描述
  4. 给新表赋值。
    在这里插入图片描述
  5. 调用对象中的方法。首先在栈中地址–>堆中地址–> 类文件的方法 。类文件中的方法放入占内存中的main中运行。打印总分数和平均分后。销毁方法1和方法2。即后进先出。
    在这里插入图片描述
  6. 剩下的就和之前一样了
    在这里插入图片描述

面向对象编程是啥?

万物皆对象,谁的数据谁存储。
比如说我市场上的手机。每个手机都有自己独有的属性。那么手机就是一个对象。手机可以有名称,价格。
在这里插入图片描述
再比如说,王者荣耀的人物,都有名字。我们的血条下降是数据表中的数值在下降。
在这里插入图片描述

注意:我们设计对象,就是设计类。我们在设计类的时候会有很多语法。这些语法支持我们设计出更好的对象模版。下面学的类的基本语法,封装,继承目的只是做一个更好的对象。(重点)

类的基本语法

我们设计对象就是设计类。下面都是为了支撑设计出更好的类的模版,即设计更好的类。

构造器

构造器是什么样子?
本质是一种特殊的方法。构造器 名称必须和类名一致,而且没有返回值。
有参构造器和无参构造器,构造器重载。

public class Student {
    /** 无参构造器 */
    public Student(){
        System.out.println("无参构造器执行了");
    }
    /** 有参构造器 */
    public Student(String n ){
        System.out.println("我是有参构造器,参数是:"+n);
    }
    public Student(String n ,int a){
        System.out.println("我是有参构造器,参数是:"+n+"和"+a);
    }
}

构造器有什么特点?
创建对象时,对象会去调用构造器。调用哪个构造器有传递的参数决定。

// Test.java
public static void main(String[] args) {
    Student s1 = new Student(); // 无参构造器执行了
    Student s2 = new Student("hah"); // 我是有参构造器,参数是:hah
    Student s3 = new Student("hsh",18); // 我是有参构造器,参数是:hsh和18
}
// Student.java
public class Student {
    /** 无参构造器 */
    public Student(){
        System.out.println("无参构造器执行了");
    }
    /** 有参构造器 */
    public Student(String n ){
        System.out.println("我是有参构造器,参数是:"+n);
    }
    public Student(String n ,int a){
        System.out.println("我是有参构造器,参数是:"+n+"和"+a);
    }
}

构造器的注意事项

  • 类默认就自带了一个无参构造器
  • 如果为类定义了有参数构造器,类默认的无参数构造器就没有了,此时如果还想用无参数构造器,就必须自己手写一个无参数构造器出来。比如上面把无参构造器删除。Test.java中的Student s1 = new Student();报错。这也从侧面说明了类默认就自带了一个无参构造器。不然我们上一节的面向对象入门的Student s1 = new Student();也会报错。

构造器的常见应用场景?
创建对象时,同时完成对对象成员变量(属性)的初始化赋值。简化代码。
请看下面的代码:当我们的对象有多个属性不用一个一个的.出来。我们可以直接在()中赋值,类中的成员变量就可以接收。

// Test.java
public static void main(String[] args) {
    Student s1 = new Student();
    s1.name = "张三";
    s1.age = 18;
    System.out.println(s1.name+":"+s1.age); // 张三:18

    Student s2 = new Student("李四",18);
    System.out.println(s2.name+":"+s2.age); // 李四:18
}
// Student.java
public class Student {
    // 类中的变量叫做成员变量。
    String name;
    int age;
    public Student(){  }
    public Student(String n ,int a){
        name = n;
        age = a;
    }
}

this

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

// Test.java
public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "张三";
        s1.print();             //com.itheima.thisdemo.Student@3b07d329  张三
        System.out.println(s1); // com.itheima.thisdemo.Student@3b07d329

        Student s2 = new Student();
        s2.print();             //com.itheima.thisdemo.Student@41629346 null
        System.out.println(s2); // com.itheima.thisdemo.Student@41629346
    }
// Student.java
public class Student {
    // 成员变量
    String name;
    public void print(){
        // this是一个变量,用在方法中,用于拿到当前对象。
        // 哪个对象调用这个方法,this就拿到哪个对象。
        System.out.println(this);
        System.out.println(this.name);
    }
}

this有啥应用场景
this主要用来解决:用来解决对象的成员变量与方法内部变量的名称一样时,导致访问冲突问题的。

// Test.java
public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "张三";
        s1.print();             //com.itheima.thisdemo.Student@3b07d329  张三
        System.out.println(s1); // com.itheima.thisdemo.Student@3b07d329

        Student s2 = new Student();
        s2.print();             //com.itheima.thisdemo.Student@41629346 null
        System.out.println(s2); // com.itheima.thisdemo.Student@41629346

        System.out.println("==========================");

        Student s3 = new Student();
        s3.name = "汪苏泷";
        s3.printHobby("唱歌!");
    }
// Student.java
public class Student {
    // 成员变量
    String name;
    public void print(){
        // this是一个变量,用在方法中,用于拿到当前对象。
        // 哪个对象调用这个方法,this就拿到哪个对象。
        System.out.println(this);
        System.out.println(this.name);
    }
    // 局部变量
    public void printHobby(String name){
        System.out.println(this.name  + "喜欢" + name);
    }
}

封装

面向对象的三大特征:封装、继承、多态。
1、什么是封装?
就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。类就是一种封装。
2、我们为什么要封装呢? 下面来具体说明

// Test.java
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.age = -19;
        s1.chinese= -98;
		// 我们的属性可以随意更改值。还可输入不符合条件的值。这样很不安全。
		// 我们需要把我们的值封装起来。
    }
}

// Student.java
public class Student {
    String name;
    int age;
    double chinese;
    double math;

    public void printAllScore(){
        System.out.println(name + "的总成绩是:" +
                (chinese + math));
    }

    public void printAverageScore(){
        System.out.println(name + "的平均成绩是:" +
                (chinese + math) / 2);
    }
}

3、封装的设计规范是什么样的?
合理隐藏,合理暴露。

4、代码层面如何控对象的成员公开或隐藏?
公开成员,可以使用public(公开)进行修饰。
隐藏成员,使用private(私有,隐藏) 进行修饰。

// Test.java
public class Test {
    public static void main(String[] args) {
        //    学会如何隐藏如何暴露。
        Student s1 = new Student();
        s1.setAge(19); // 赋值
        System.out.println(s1.getAge()); // 取值
    }
}

// Student.java
public class Student {
    String name;
    // 1、如何隐藏:使用private关键字(私有,隐藏)修饰成员变量,就只能在本类中被直接访问,
    // 其他任何地方不能直接访问。
    private int age;
    private double chinese;
    private double math;

    // 2、如何暴露(合理暴露):使用public修饰(公开)的get和set方法合理暴露
    // 成员变量的取值和赋值。
    // 这里的校验判断数值是否合法。可以不写,以后会在其他地方写。
    public void setAge(int age){  // 为年龄赋值
        if(age > 0 && age < 200){
            this.age = age;
        }else {
            System.out.println("您赋值的年龄数据非法!");
        }
    }

    public int getAge(){  // 获取年龄
        return age;
    }

    public void setChinese(double chinese) {
        this.chinese = chinese;
    }

    public double getChinese() {
        return chinese;
    }

    public void printAllScore(){
        System.out.println(name + "的总成绩是:" +
                (chinese + math));
    }

    public void printAverageScore(){
        System.out.println(name + "的平均成绩是:" +
                (chinese + math) / 2);
    }
}

Javabean

是一种特殊类,类中要满足如下需求

  1. 类中的成员变量全部私有,并提供public修饰的getter/setter方法
  2. 类中需要提供一个无参数构造器,有参数构造器可选

生成getter/setter方法和构造器的方法
打开你要生成的类,在这个类里面右击生成==>构造函数或者getter/setter方法选中即可
或者快捷键alt+insert

// Student.java
public class Student {
    // 1、成员变量需要私有
    private String name;
    private int age;
    private char sex;
    private double math;
    private double english;
    // 3、必须提供无参构造器。有参数构造器可有可无的。
    public Student() {  }
    public Student(String name, int age, char sex, double math, double english) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.math = math;
        this.english = english;
    }
    // 2、必须提供getter和setter方法。
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public char getSex() {
        return sex;
    }
    public void setSex(char sex) {
        this.sex = sex;
    }
    public double getMath() {
        return math;
    }
    public void setMath(double math) {
        this.math = math;
    }
    public double getEnglish() {
        return english;
    }
    public void setEnglish(double english) {
        this.english = english;
    }
}

实体类有啥应用场景?
我们之前是把求平均值和求总成绩的方法都写入Student类中了。我们实体类不要写这些方法。就单纯对数据存和取两种功能即可。

// Student.java
public class Student {
    private String name;
    private int age;
    private char sex;
    private double math;
    private double english;
    // 为了减少代码长度。
    //无参构造器,有参数构造器,getter和setter方法不在写
}
// StudentOperator.java
/** 学生业务操作对象:负责对学生的数据进行业务处理 */
public class StudentOperator {
    private Student s; // 记住要操作的学生对象。
    // 类比private int a;
    public StudentOperator(Student s) {
        this.s = s;
    }
    public void printAllScore() {
        System.out.println(s.getName() + "总成绩是:" + (s.getMath() + s.getEnglish()));
    }

    public void printAverageScore() {
        System.out.println(s.getName() + "平均成绩是:" + (s.getMath() + s.getEnglish()) / 2);
    }
}
// Test.java
public class Test {
    public static void main(String[] args) {
        // 实体类的基本作用:创建对象、封装数据。
        // 1、通过无参数构造器初始化对象
        Student s2 = new Student();
        s2.setName("播仔");
        s2.setMath(50);
        s2.setEnglish(100);

        // 2、创建学生操作对象,处理学生的数据
        StudentOperator operator = new StudentOperator(s2);
        operator.printAllScore();  // ALT + ENTER
        operator.printAverageScore();
    }
}

运行流程如下

  1. 把实例化对象(播仔,59,80)的地址给s2
  2. 通过实例化StudentOperator把s2地址传入StudentOperator中
  3. StudentOperator接收
  4. 接收后通过构造函数给StudentOperator。
  5. StudentOperator的成员变量s成功接收。
  6. 最终结果StudentOperator的成员变量s指向Test.java中的new Student("播仔",59,80)
    在这里插入图片描述

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

static关键字

static叫静态,可以修饰成员变量、成员方法。

static修饰成员变量

成员变量按照有无static修饰,分为两种:

  • 静态变量(类变量):有static修饰,属于类,与类一起加载一次,在内存里只有一份,会被类的全部对象共享
  • 实例变量(对象的变量):无static修饰,属于每个对象的。每个对象中都有一份,只能用对象访问。
public class Student {
    // 静态变量:有static修饰,属于类,只加载一份,
    // 可以被类和类的全部对象共享访问
    static String name;
    // 实例变量:没有static修饰,属于对象,每个对象都有一份
    int age;
}

如果还不理解可以看下面的图。
在这里插入图片描述

如何访问静态变量
类名.静态变量 (推荐)
对象.静态变量(不推荐)

如何访问实例变量

对象.实例变量
静态变量再内存中如何存储的。
// Student.java
public class Student {
    // 静态变量:有static修饰,属于类,只加载一份,
    // 可以被类和类的全部对象共享访问
    static String name;
    // 实例变量:没有static修饰,属于对象,每个对象都有一份
    int age;
}
package com.itheima.staticfield;
// Test.java
public class Test {
    public static void main(String[] args) {
        // 1、类名.静态变量(推荐)
        Student.name = "袁华";
        System.out.println(Student.name);// 袁华

        // 2、对象名.静态变量(不推荐)
        Student s1 = new Student();
        s1.name = "马冬梅";

        Student s2 = new Student();
        s2.name = "秋雅";

        System.out.println(s1.name); // 秋雅
        System.out.println(Student.name); // 秋雅

        // 3、对象名.实例变量
        s1.age = 23;
        s2.age = 18;
        System.out.println(s1.age); // 23
        // System.out.println(Student.age); // 报错!
    }
}
  1. 第一步
    在这里插入图片描述
  2. 第二步
    在这里插入图片描述
  3. 第三步
    在这里插入图片描述
  4. 第四步
    在这里插入图片描述
  5. 第5步
    在这里插入图片描述
  6. 第六步
    在这里插入图片描述
  7. 第七步
    在这里插入图片描述
    8.第八步
    在这里插入图片描述
    9第九步
    在这里插入图片描述
    10 第十步
    在这里插入图片描述
静态变量的应用场景

如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成静态变量来记住。

案例:系统启动后,要求用户类可以记住自己创建了多少个用户对象了。

// User.java
public class User {
    public static int count = 0;

    public User(){
    	// User.count++;
        // 注意:同一个类中访问静态成员可以省略类名不写
        count++;
    }
}
// Test2.java
public class Test2 {
    public static void main(String[] args) {
        // 目标:了解静态变量的应用。
        new User();
        new User();
        new User();
        new User();
        System.out.println(User.count);
    }
}

访问自己类中的类变量,是否可以省略类名不写count++;
在某个类中访问其他类里的类变量,必须带类名访问User.count++;

static修饰方法

成员方法的分类
  • 静态方法:有static修饰的成员方法,属于类。
    在这里插入图片描述

  • 实例方法:无static修饰的成员方法,属于对象。
    在这里插入图片描述
    下面使用代码来解释

// Student.java
public class Student {
    private double score;
    // 静态方法:有static修饰,属于类持有。没有使用了成员变量
    public static void printHelloWorld(){
        System.out.println("Hello World");
        System.out.println("Hello World");
        System.out.println("Hello World");
    }
    // 实例方法:没有static修饰,属于对象持有。使用了成员变量
    public void printPass(){
        System.out.println(score >= 60 ? "通过了" : "您挂科了!");
    }
    public void setScore(double score) {
        this.score = score;
    }
}
// Test.java
public class Test {
    public static void main(String[] args) {
        // 1、类名.静态方法(推荐)
        Student.printHelloWorld();

        // 2、对象.静态方法(不推荐)
        Student s1 = new Student();
        s1.printHelloWorld();

        // 3、对象名.实例方法
        // Student.printPass(); // 报错
        s1.setScore(59.5);
        s1.printPass();
    }
}

注意:什么时候使用静态方法什么时候使用实例方法
如果这个方法只是为了做一个功能且不需要直接访问对象的数据,这个方法直接定义成静态方法。比如printHelloWorld();没有使用成员变量。
如果这个方法是对象的行为,需要访问对象的数据,这个方法必须定义成实例方法。比如printPass();使用成员变量。

思考:我们的main方法是什么方法?它是如何跑起来的?
答:静态方法。当我们点击运行时调用Test.main()运行。
main并没有使用成员变量。它具有启动我们程序的功能。所以他是静态的。
在这里插入图片描述

public class Test {
    public static void main(String[] args) {
        printHelloWorld2();
        // 本质调用 Test.printHelloWorld2();
    }

    public static void printHelloWorld2(){
        System.out.println("Hello World");
        System.out.println("Hello World");
        System.out.println("Hello World");
        System.out.println("Hello World");
    }
}

static修饰代码块

JVM加载类时,加载静态代码块

  • 如果有多个静态块,按顺序加载
  • 每个静态代码块只会被执行一次
package com.hz.project01.staticuse;
public class StaticUse {
    static int num=100;
    static{
        num+=100;
        System.out.println(num);
    }
    static{
        num+=100;
        System.out.println(num);
    }
}
// 测试类。
package com.hz.project01.staticuse;
public class Main {
    public static void main(String[] args){
        StaticUse s1 =new StaticUse();
        StaticUse s2 =new StaticUse();
        StaticUse s3 =new StaticUse();
        StaticUse s4 =new StaticUse();
        System.out.println("执行四遍后的num值:"+StaticUse.num);
		// 200
		// 300
		// 执行四遍后的num值:300
    }
}

静态方法的应用

静态方法的常见应用场景
答:做工具类。

工具类是什么?
答:工具类中的方法都是一些静态方法,每个方法用来完成一个功能,以便供给开发人员直接使用。

使用类方法来设计工具类有啥好处?
答:提高了代码复用;调用方便,提高了开发效率。

public class XxxxUtil {
  	public static void xxx(){   ......  }
  	public static boolean xxxx(String email){  ... }  
 	public static String xxxxx(int n){  ... }
    ...
}

为什么工具类中的方法要用静态方法,而不用实例方法?
答:实例方法需要创建对象来调用,此时对象只是为了调用方法,对象占内存,这样会浪费内存。静态方法,直接用类名调用即可,调用方便,也能节省内存。

工具类定义时有什么要求?
工具类没有创建对象的需求,建议将工具类的构造器进行私有。

// XxxxUtil.java
public class XxxxUtil {
	// 工具类没有创建对象的必要性,所以建议私有化构造器
	private XxxxUtil () {}
}
// Test.java
public class Test {
    public static void main(String[] args) {
    	// 报错,因为XxxxUtil构造方法私有化,不能使用。
       // XxxxUtil x = new XxxxUtil();
    }
}

static的注意事项

  1. 静态方法中可以直接访问静态成员,不可以直接访问实例成员。
    public class Test4 {
    // 静态变量
    public static int count = 100;
    // 静态方法
    public static void printHelloWorld2(){
        System.out.println("Hello World!");
    }
    // 实例变量 :属于对象的。
    private String name;
    // 实例方法 :属于对象的。
    public void run(){  }
    
    public static void main(String[] args) {
        printHelloWorld();
    }
    
    // 1、静态方法中可以直接访问静态成员,不可以直接访问实例成员。
    public static void printHelloWorld(){
        System.out.println(count); // 100
        printHelloWorld2();// Hello World!
        // System.out.println(name); // 报错
        // 静态属性要想使用必须要先创建对象。
        Test4 t = new Test4();
        System.out.println(t.name);//null
        // run(); // 报错
        t.run();
        // System.out.println(this); // 报错。this代表的只能是对象。
    }
    
    // 2、实例方法中既可以直接访问静态成员,也可以直接访问实例成员。
    // 3、实例方法中可以出现this关键字,静态方法中不可以出现this关键字的。
    //    public void go(){
    //        System.out.println(count);
    //        printHelloWorld2();
    //        System.out.println(name);
    //        run();
    //        System.out.println(this);
    //    }
    }
    
  2. 实例方法中既可以直接访问静态成员,也可以直接访问实例成员。
  3. 实例方法中可以出现this关键字,静态方法中不可以出现this关键字的。
    public class Test4 {
    // 静态变量
    public static int count = 100;
    // 静态方法
    public static void printHelloWorld2(){
        System.out.println("Hello World!");
    }
    // 实例变量 :属于对象的。
    private String name;
    // 实例方法 :属于对象的。
    public void run(){  }
    
    public static void main(String[] args) {
        
    }
    // 2、实例方法中既可以直接访问静态成员,也可以直接访问实例成员。
    // 3、实例方法中可以出现this关键字,静态方法中不可以出现this关键字的。
        public void go(){
            System.out.println(count);
            printHelloWorld2();
            System.out.println(name);
            run();
            System.out.println(this);
        }
    }
    
  4. 实例方法中不可以定义静态变量。

方法传参

在这里插入图片描述
基本数据类型和引用数据类型数据在传参时区别

  • 基本数据类型,操作传递的是变量的值,改变一个变量的值不会影响另一个变量的值。
  • 引用数据类型(类、数组和接口),赋值是把原对象的引用(可理解为内存地址)传递给另一个引用

包的使用

命名规范

书写:全小写
顺序:网络后缀.公司名.项目名.模块名
比如:com.hz.project.emp

在这里插入图片描述

package关键字

语法package 该文件的位置(从src的文件夹下开始 && 写在代码第一行)
在这里插入图片描述

import关键字

语法:import 要使用的类名的位置;

package com.hz.project01.admin;
public class Admin {
    public static void print() {
        System.out.println("导入成功");
    }
}

在这里插入图片描述

完全限定名

比如我们要在第三个包中去调用另外两个不同包下的相同类。
在这里插入图片描述
我们直接写报错,s1和s2都调用的是test1中的Student类如何解决?
完全限定名。

//  test/main
package com.hz.project01.test;
import com.hz.project01.test1.Student;

public class Main {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.print(); // 我是test1班的Student类
        com.hz.project01.test2.Student s2 = new com.hz.project01.test2.Student();
        // 直接调用即可
        s2.print(); // 我是test2班的Student类
    }
}
//  test1/main
package com.hz.project01.test1;
public class Student {
    public void print() {
        System.out.println("我是test1班的Student类");
    }
}

//  test2/main
package com.hz.project01.test2;

public class Student {
    public void print() {
        System.out.println("我是test2班的Student类");
    }
}

这里红色调用test1班的学生,绿色调用test2班的学生。
在这里插入图片描述

综合小项目

// Movie.java
public class Movie {
    private int id;
    private String name;
    private double price;

    // 此处省略有参,无参构造,getter和setter方法
}
// MovieService.java  处理业务逻辑。
import java.util.Scanner;
public class MovieService {
    Movie[] movies;
    public MovieService(Movie[] movies){
        this.movies = movies;
    }
    // 展示所有电影信息
    public void showAllMovies(){
        for(int i = 0; i < movies.length; i++){
            System.out.println("电影id:"+movies[i].getId()+",电影名:"+
                    movies[i].getName()+",电影价格:"+movies[i].getPrice());
        }
    }
    // 根据id查询电影
    public void findMovieById(){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要查询的电影id");
        int id = sc.nextInt();
        for(int i = 0; i < movies.length; i++){
            if(movies[i].getId() == id){
                System.out.println("电影id:"+movies[i].getId()+",电影名:"+
                        movies[i].getName()+",电影价格:"+movies[i].getPrice());
                return;
            }
        }
        System.out.println("没有找到该电影");
    }
}

// Main.java
public class Main {
    public static void main(String[] args) {
        Movie[] movies = new Movie[5];
        movies[0] = new Movie(1, "战狼2", 29.6);
        movies[1] = new Movie(2, "哪吒2", 49.6);
        movies[2] = new Movie(3, "名侦探柯南", 39.6);
        movies[3] = new Movie(4, "马里奥", 19.6);
        movies[4] = new Movie(5, "冰雪奇缘", 54.6);
        MovieService movieService = new MovieService(movies);
        movieService.showAllMovies();

        movieService.findMovieById();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值