【JAVA基础】06 面向对象

1. 面向对象思想概述

  • 面向过程思想概述

    • 第一步

    • 第二步

  • 面向对象思想概述

    • 找对象(第一步,第二步)

  • 举例

    • 买煎饼果子

    • 洗衣服

  • 面向对象思想特点

    • 是一种更符合我们思想习惯的思想

    • 可以将复杂的事情简单化

    • 将我们从执行者变成了指挥者

      • 角色发生了转换

  • 面向对象开发

    • 就是不断的创建对象,使用对象,指挥对象做事情。

  • 面向对象设计

    • 其实就是在管理和维护对象之间的关系。

  • 面向对象特征

    • 封装(encapsulation)

    • 继承(inheritance)

    • 多态(polymorphism)

 

2. 类与对象概述

  • 我们学习编程是为了什么

    • 为了把我们日常生活中实物用学习语言描述出来

  • 我们如何描述现实世界事物

    • 属性 就是该事物的描述信息(事物身上的名词)

    • 行为 就是该事物能够做什么(事物身上的动词)

  • Java中最基本的单位是类,Java中用class描述事物也是如此

    • 成员变量 就是事物的属性

    • 成员方法 就是事物的行为

  • 定义类其实就是定义类的成员(成员变量和成员方法)

    • 成员变量 和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。

    • 成员方法 和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。

  • 类和对象的概念

    • 类:是一组相关的属性和行为的集合

    • 对象:是该类事物的具体体现

    • 举例:

      • 学生

      • 对象 具体的某个学生就是一个对象

 

3. 学生类的定义

  • 学生事物

  • 学生类

  • 案例演示

    • 属性:姓名,年龄,性别

    • 行为:学习,睡觉

    • class Demo1_Student { // 测试类
          public static void main(String[] args) {
              //创建对象的格式:类名 对象名 = new 类名();
              //对象名:其实就是合法的标识符,如果是一个单词所有字母小写,如果是多个单词,从第二个单词开始首字母大写
              Student s = new Student();
              //* D:如何使用成员变量呢?
              //* 对象名.变量名
              s.name = "张三";
              s.age = 23;
      
              System.out.println(s.name + "..." + s.age);
              //* E:如何使用成员方法呢?
              //* 对象名.方法名(...)
              s.study();
              s.sleep();
          }
      }
      
      
      /*
      * A:案例演示
          * 属性:姓名,年龄,性别
          * 行为:学习,睡觉
      
      * B:我们如何描述现实世界事物
          * 属性    就是该事物的描述信息(事物身上的名词)
          * 行为    就是该事物能够做什么(事物身上的动词)
      * C:Java中最基本的单位是类,Java中用class描述事物也是如此
          * 成员变量    就是事物的属性
          * 成员方法    就是事物的行为
      * D:定义类其实就是定义类的成员(成员变量和成员方法)
          * a:成员变量    和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
          * b:成员方法    和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。
      */
      
      class Student {  // 基本类
          String name;                        //姓名
          int age;                            //年龄
          String gender;                        //性别
      
          public void study() {                //定义学习的方法
              System.out.println("学生学习");
          }
      
          public void sleep() {                //定义睡觉的方法
              System.out.println("学生睡觉");
          }
      }

 

 

4. 学生类的使用

  • 文件名问题
    • 在一个java文件中写两个类:一个基本的类,一个测试类。

    • 建议:文件名称和测试类名称一致。

  • 如何使用对象?

    • 创建对象并使用

    • 格式:类名 对象名 = new 类名();

  • 如何使用成员变量呢?

    • 对象名.变量名

  • 如何使用成员方法呢?

    • 对象名.方法名(...)

5. 手机类的定义

  • 模仿学生类,让学生自己完成

    • 属性:品牌(brand),价格(price)

    • 行为:打电话(call),发信息(sendMessage),玩游戏(playGame)

    • class Demo2_Phone {
          public static void main(String[] args) {
              //创建对象
              Phone p = new Phone();
              //调用对象中的属性并赋值
              p.brand = "锤子";
              p.price = 998;
      
              System.out.println(p.brand + "..."  + p.price);
      
              //调用成员方法
              p.call();
              p.sendMessage();
              p.playGame();
          }
      }
      
      /*
      * 模仿学生类,让学生自己完成
          * 属性:品牌(brand)价格(price)
          * 行为:打电话(call),发信息(sendMessage)玩游戏(playGame)
      
      */
      class Phone {
          String brand;                    //品牌
          int price;                        //价格
      
          public void call() {            //打电话
              System.out.println("打电话");
          }
      
          public void sendMessage() {        //发信息
              System.out.println("发信息");
          }
      
          public void playGame() {        //玩游戏
              System.out.println("玩游戏");
          }
      }

 

6. 一个对象的内存图

  • 画图演示

    • 一个对象

    • class Demo1_Car {
          public static void main(String[] args) {
              Car c1 = new Car();                //创建对象
      
              //调用属性并赋值
              c1.color = "red";                //为车的颜色赋值
              c1.num = 8;                        //为车的轮胎数赋值
      
              //调用行为
              c1.run();
      
              Car c2 = new Car();                //创建对象
              c2.color = "black";                //为车的颜色赋值
              c2.num = 4;                        //为车的轮胎数赋值
              c2.run();
      
              //c2 = null;                        //用null把原来的地址值覆盖掉了
      
              //c2.run();                        //c2里面记录的是null,所以报出空指针异常
      
              Car c3 = c2;
              c3.run();
              
          }
      }
      /*
      车的属性
          车的颜色
          车的轮胎数
      车的行为
          车运行
      */
      
      class Car {
          //成员变量
          String color;                        //车的颜色
          int num;                            //车的轮胎数
      
          public void run() {                    //车运行
              System.out.println(color + "..." + num);
          }
      }
    • 【JAVA基础】06 面向对象

7. 二个对象的内存图

  • 画图演示

    • 二个不同的对象

    • 【JAVA基础】06 面向对象

 

 

8. 三个引用两个对象的内存图

  • 画图演示

    • 三个引用,有两个对象的引用指向同一个地址

    • 【JAVA基础】06 面向对象

9. 成员变量和局部变量的区别

class Demo2_Person {
    public static void main(String[] args) {
        Person p = new Person();
        p.speak();
    }
}
/*
* A:在类中的位置不同
    * 成员变量:在类中方法外
    * 局部变量:在方法定义中或者方法声明上
* B:在内存中的位置不同
    * 成员变量:在堆内存(成员变量属于对象,对象进堆内存)
    * 局部变量:在栈内存(局部变量属于方法,方法进栈内存)
* C:生命周期不同
    * 成员变量:随着对象的创建而存在,随着对象的消失而消失
    * 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
* D:初始化值不同
    * 成员变量:有默认初始化值
    * 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
    
* 注意事项:
    * 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
    * 基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char
    * 引用数据类型变量包括哪些:数组,类,接口,枚举
*/
class Person {
    String name;                        //成员变量
    int num;

    public void speak() {
        int num = 10;                        //x和num都是局部变量
        System.out.println(name);
    
        System.out.println(num);
    }
}
  • 在类中的位置不同

    • 成员变量:在类中方法外

    • 局部变量:在方法定义中或者方法声明上

  • 在内存中的位置不同

    • 成员变量:在堆内存(成员变量属于对象,对象进堆内存)

    • 局部变量:在栈内存(局部变量属于方法,方法进栈内存)

  • 生命周期不同

    • 成员变量:随着对象的创建而存在,随着对象的消失而消失

    • 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

  • 初始化值不同

    • 成员变量:有默认初始化值

    • 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。

  • 注意事项:

    • 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。

    • 基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char

    • 引用数据类型变量包括哪些:数组,类,接口,枚举

 

10. 方法的形式参数是类名的时候如何调用

  • 方法的参数是类名

    • public static void print(Student stu) {            //引用数据类型当作形式参数
              stu.name = "张三";
              stu.age = 23;
              stu.speak();
          }
    • 如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。

  • class Demo1_Student {
        public static void main(String[] args) {
            print(10);
    
            Student s = new Student();                    //创建对象,并将对象的地址值赋值给s
            print(s);
        }
    
        public static void print(int x) {                //基本数据类型当作形式参数
            System.out.println(x);
        }
    
        public static void print(Student stu) {            //引用数据类型当作形式参数
            stu.name = "张三";
            stu.age = 23;
            stu.speak();
        }
    }
    
    /*
    * A:方法的参数是类名public void print(Student s){}//print(new Student());
        * 如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。
    */
    class Student {
        String name;                    //姓名
        int age;                        //年龄
    
        public void speak() {
            System.out.println(name + "..." + age);
        }
    }

 

11. 匿名对象的概述和应用

  • 什么是匿名对象

    • 没有名字的对象

  • 匿名对象应用场景

    • 调用方法,仅仅只调用一次的时候。

      • 那么,这种匿名调用有什么好处吗?

        • 节省代码

      • 注意:调用多次的时候,不适合。匿名对象调用完毕就是垃圾。可以被垃圾回收器回收。

    • 匿名对象可以作为实际参数传递

      • class Demo3_Car {
            public static void main(String[] args) {
                //Car c1 = new Car();
                /*c1.color = "red";
                c1.num = 8;
                c1.run();*/
                //method(c1);
        
                method(new Car());
        
                //Car c2 = new Car();
                //method(c2);
                method(new Car());                //匿名对象可以当作参数传递
            }
        
            //抽取方法提高代码的复用性
            public static void method(Car cc) {    //Car cc = new Car();
                cc.color = "red";
                cc.num = 8;
                cc.run();
            }
        }
        
        class Car {
            String color;            //颜色
            int num;                //轮胎数
        
            public void run() {
                System.out.println(color + "..." + num);
            }
        }
        View Code
  • 案例演示

    • 匿名对象应用场景

    • class Demo2_Car {
          public static void main(String[] args) {
              /*Car c1 = new Car();            //创建有名字的对象
              c1.run();
              c1.run();
      
              new Car().run();            //匿名对象调用方法
              new Car().run();    */        //匿名对象只适合对方法的一次调用,因为调用多次就会产生多个对象,不如用有名字的对象    
          
              //匿名对象是否可以调用属性并赋值?有什么意义?
              /*
              匿名对象可以调用属性,但是没有意义,因为调用后就变成垃圾
              如果需要赋值还是用有名字对象
              */
              new Car().color = "red";
              new Car().num = 8;
              new Car().run();
          }
      }
      
      class Car {
          String color;            //颜色
          int num;                //轮胎数
      
          public void run() {
              System.out.println(color + "..." + num);
          }
      }
  •  【JAVA基础】06 面向对象

    12. 封装的概述

    • 封装概述

      • 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

    • 封装好处

      • 隐藏实现细节,提供公共的访问方式

      • 提高了代码的复用性

      • 提高安全性。

    • 封装原则

      • 将不需要对外提供的内容都隐藏起来。

      • 把属性隐藏,提供公共方法对其访问。

     

    13. private关键字的概述和特点

    • 人类赋值年龄的问题

    • private关键字特点

      • 是一个权限修饰符

      • 可以修饰成员变量和成员方法

      • 被其修饰的成员只能在本类中被访问

    • 案例演示

      • 封装和private的应用:

        • 把成员变量用private修饰

        • 提供对应的getXxx()和setXxx()方法

      • private仅仅是封装的一种体现形式,不能说封装就是私有

      • class Demo1_Person {
            public static void main(String[] args) {
                Person p1 = new Person();
                p1.name = "张三";            //调用姓名属性并赋值
                //p1.age = -17;                //调用年龄属性并赋值
                //p1.speak();                    //调用行为
        
                p1.setAge(-17);
        
                System.out.println(p1.getAge());
            }
        }
        
        class Person {
            String name;                    //姓名
            private int age;                //年龄
            
            public void setAge(int a) {        //设置年龄
                if (a > 0 && a < 200) {
                    age = a;
                }else {
                    System.out.println("请回火星吧,地球不适合你");
                }
                
            }
        
            public int getAge() {            //获取年龄
                return age;
            }
        
            public void speak() {
                System.out.println(name + "..." + age);
            }
        }

     

    14. this关键字的概述和应用

    • this关键字特点

      • 代表当前对象的引用

    • 案例演示

      • this的应用场景

      • 用来区分成员变量和局部变量重名

          • class Demo1_This {
                public static void main(String[] args) {
                    Person p1 = new Person();
                    p1.setName("张三");
                    p1.setAge(23);
                    System.out.println(p1.getName() + "..." + p1.getAge());
            
                    Person p2 = new Person();
                    p2.setName("李四");
                    p2.setAge(24);
                    System.out.println(p2.getName() + "..." + p2.getAge());
                }
            }
            
            class Person {
                private String name;            //姓名
                private int age;                //年龄
              
            public void setAge(int age) { //设置年龄 if (age > 0 && age < 200) { this.age = age; // this.age 指的是类成员变量,age指的是方法的局部变量 //System.out.println(age); }else { System.out.println("请回火星吧,地球不适合你"); } } public int getAge() { //获取年龄 return age; } public void setName(String name) { //设置姓名 this.name = name; // this.name指的是类成员变量 //System.out.println(name); } public String getName() { return name; } }

     

    15. 手机类代码及其测试

    • 学生练习

      • 请把手机类写成一个标准类,然后创建对象测试功能。

      • class Demo2_Phone {
            public static void main(String[] args) {
                Phone p1 = new Phone();
                p1.setBrand("三星");
                p1.setPrice(5288);
        
                System.out.println(p1.getBrand() + "..." + p1.getPrice());
                p1.call();
                p1.sendMessage();
                p1.playGame();
            }
        }
        /*
        手机类
            属性:品牌brand,价格price
            行为:打电话call,发短信sendMessage,玩游戏,playGame
        */
        class Phone {                                //java bean
            private String brand;                    //品牌
            private int price;                        //价格
        
            public void setBrand(String brand) {    //设置品牌
                this.brand = brand;
            }
        
            public String getBrand() {                //获取品牌
                return this.brand;                    //this.可以省略,你不加系统会默认给你加
            }
        
            public void setPrice(int price) {        //设置价格
                this.price = price;
            }
        
            public int getPrice() {                    //获取价格
                return price;
            }
        
            public void call() {                    //打电话
                System.out.println("打电话");
            }
        
            public void sendMessage() {                //发短信
                System.out.println("发短信");
            }
        
            public void playGame() {                //玩游戏
                System.out.println("玩游戏");
            }
        }

    16. 构造方法Constructor概述和格式

    • 构造方法概述和作用

      • 给对象的数据(属性)进行初始化

    • 构造方法格式特点

      • 方法名与类名相同(大小也要与类名一致)

      • 没有返回值类型,连void都没有

      • 没有具体的返回值return;

      • class Demo1_Constructor {                        //Constructor构造
            public static void main(String[] args) {
                Person p = new Person();  //在一创建对象的时候,系统就帮我调用了构造方法
                //p.Person();        //构造方法不能用对象调用
                p.show();
        
                Person p2 = new Person();         //再次创建对象
            
                p2.show();
            }
        }
        
        
        class Person {
            private String name;
            private int age;
        
            //构造方法
            public Person() {
                //System.out.println("Hello World!");
                //return;         //构造方法也是有return语句的,格式是return;
                name = "张三";
                age = 23;
            }
        
            public void show() {
                System.out.println(name + "..." + age);
            }
        }

     

    17. 构造方法的重载及注意事项

    • 案例演示

      • 构造方法的重载

      • 重载:方法名相同,与返回值类型无关(构造方法没有返回值),只看参数列表

      • class Demo2_Person {
            public static void main(String[] args) {
                Person p1 = new Person();
                p1.show();
        
                System.out.println("---------------------");
        
                Person p2 = new Person("张三",23);
                p2.show();
        
                System.out.println("---------------------");
        
                Person p3 = new Person("李四",24);
                p3.show();
            }
        }
        
        class Person {
            private String name;            //姓名
            private int age;                //年龄
        
            public Person() {                //空参构造
                System.out.println("空参的构造");
            }
        
            public Person(String name,int age) {
                this.name = name;
                this.age = age;
                System.out.println("有参的构造");
            }
            
            public void show() {
                System.out.println(name + "..." + age);
            }
        }
    • 构造方法注意事项

      • 如果我们没有给出构造方法,系统将自动提供一个无参构造方法。

      • 如果我们给出了构造方法,系统将不再提供默认的无参构造方法。

        • 注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法

     

    18. 给成员变量赋值的两种方式的区别

    • setXxx()方法

      • 修改属性值
      • 这种相对比较灵活,开发中用得更多点

    • 构造方法

      • 给对象中属性进行初始化

    class Demo3_Person {
        public static void main(String[] args) {
            Person p1 = new Person("张三",23);
            //p1 = new Person("张天一",23);    //这种方式看运行结果貌似是改名了,其实是将原对象变成垃圾
            System.out.println(p1.getName() + "..." + p1.getAge());
    
            System.out.println("--------------------");
            Person p2 = new Person();        //空参构造创建对象
            p2.setName("李四");
            p2.setAge(24);
    
            p2.setName("李鬼");
            System.out.println(p2.getName() + "..." + p2.getAge());
        }
    }
    /*
    构造方法
        给属性进行初始化
    setXxx方法
        修改属性值
        这两种方式,在开发中用setXxx更多一些,因为比较灵活
    */
    class Person {
        private String name;                //姓名
        private int age;                    //年龄
    
        public Person() {                    //空参构造
        }
    
        public Person(String name,int age) {//有参构造
            this.name = name;
            this.age = age;
        }
        
        public void setName(String name) {    //设置姓名
            this.name = name;
        }
    
        public String getName() {            //获取姓名
            return name;
        }
    
        public void setAge(int age) {        //设置年龄
            this.age = age;
        }
    
        public int getAge() {                //获取年龄
            return age;
        }
    }
    View Code

    19. 学生类的代码及测试

    • 案例演示

      • class Demo4_Student {
            public static void main(String[] args) {
                Student s1 = new Student();                    //使用空参构造
                s1.setName("张三");                            //设置姓名
                s1.setAge(23);                                //设置年龄
        
                System.out.println("我的姓名是:" + s1.getName() + ",我的年龄是:" + s1.getAge());
                //getXxx()获取属性值,可以打印,也可以赋值给其他的变量,做其他的操作
                Student s2 = new Student("李四",24);
                s2.show();                                    //只是为了显示属性值
            }
        }
        /*
        * A:案例演示
            * 学生类:
                * 成员变量:
                    * name,age
                * 构造方法:
                    * 无参,带两个参
                * 成员方法:
                    * getXxx()/setXxx()
                    * show():输出该类的所有成员变量值
        * B:给成员变量赋值:
            * a:setXxx()方法
            * b:构造方法
            
        * C:输出成员变量值的方式:
            * a:通过getXxx()分别获取然后拼接
            * b:通过调用show()方法搞定
        */
        
        class Student {
            private String name;                            //姓名
            private int age;                                //年龄
        
            public Student(){}                                //空参构造
        
            public Student(String name,int age) {            //有参构造
                this.name = name;
                this.age = age;
            }
        
            public void setName(String name) {                //设置姓名
                this.name = name;
            }
        
            public String getName() {                        //获取姓名
                return name;
            }
        
            public void setAge(int age) {                    //设置年龄
                this.age = age;
            }
        
            public int getAge() {                            //获取年龄
                return age;
            }
        
            public void show() {
                System.out.println("我的姓名是:" + name +  ",我的年龄是:" +  age);
            }
        }
        View Code
  • 学生类:

    • 成员变量:

      • name,age

    • 构造方法:

      • 无参,带两个参

    • 成员方法:

      • getXxx()/setXxx()

      • show():输出该类的所有成员变量值

  • 给成员变量赋值:

    • setXxx()方法

    • 构造方法

  • 输出成员变量值的方式:

    • 通过getXxx()分别获取然后拼接

    • 通过调用show()方法搞定

  • 20. 手机类的代码及测试

     

     

    21. 创建一个对象的步骤

     

    【JAVA基础】06 面向对象

    22. 长方形案例练习

     

    23. 员工类案例练习

     

    24. static关键字及内存图

    【JAVA基础】06 面向对象

     【JAVA基础】06 面向对象

     

    25. static关键字的特点

     

     

    26. static的注意事项

     

    27. 静态变量和成员变量的区别

     

    28. main方法的格式详细解释

     

    29. 工具类中使用静态

     

    30. 说明书的制作过程

     

    31. 如何使用JDK提供的帮助文档

     

    32. 学习Math类的随机数功能

     

    33. 猜数字小游戏案例

     

    相关推荐