Day06面向对象1 OOP、类、面向对象、封装

1.面向对象

    OOP:面向对象的简写

  1.面向对象与面向过程

       面向过程干活的是自己,我要怎么干,亲力亲为,关注过程;

       面向对象由执行者变为指挥者找谁干,干什么,关注结果;

       面向过程和对象都是一种编程思想,java是一门面向对象的语言,

       而对象贯穿始终,想干活,先创建对象。

  2.面向对象的三大特征
       1).封装:把相关的数据封装成一个“类”组件
       2).继承
       3).多态

 默认抽象也是面向对象的特征
  3.类和对象
       1)类
          1.java语言最基本单位就是类,类似于类型
          2.类是一类事物的抽象,事物的共同特征
          3.类可以理解为模板或设计图纸(汽车图纸)
            一个源文件中,public只能修饰一个类(class),同一个包下,不能创建同名的类
      2)对象
         照着一个类做出很多对象,每个对象都要对应的序列号,对象是类的实现
         1.对象的状态用来描述对象的基本特征
         2.对象的行为用来描述对象的功能
         3.对象的标识是指对象在内存中都有一个唯一的地址值,用来和其他对象区分开来。
         4.类是一类事物的抽象,对象是具体的实现(实际造出来的汽车)
   4.类和对象的关系
        计算机语言来怎么描述现实世界中的事物的? 属性(特征)+ 行为(功能)
        那怎么通过java语言来描述呢?
        我们可以通过类来描述一类事物,用成员变量描述事物的属性,用方法描述事物的行为

  练习:创建手机这个类的案例:  

package cn.tedu.oop;

/**面向对象过程
 * //分析手机这类事物--用类描述
 * //特征:品牌、价格、颜色、尺寸
 * //行为:打电话、打微信、看直播
 */
/**一个java文件中可创建多个class,但被public修饰的class只能有一个
 * 而且这个公共类必须与文件名一致,也就是公共类的名字就是文件名
 */
public class TestCreateClass {
    /**4.在公共类中创建程序入口函数main()方法*/
    public static void main(String[] args) {
        /**5.创建手机类的对象p*/
     Phone p = new Phone(); //p保存的是变量的地址值
        /**6.通过“.”调用对象的具体功能*/
        p.call();
        p.learn();
        p.message();
        /**7.打印查看对象的具体值*/
        System.out.println(p.brand);
        System.out.println(p.color);
        System.out.println(p.price);
        System.out.println(p.size);
        /**8.创建手机类的对象2*/
         Phone p2 = new Phone();
         p2.message();
         /**9.修改p2对象的相关属性值*/
         p2.brand = "HUAWEI";
         p2.color = "赤橙红绿的白";
         p2.price = 8888.88 ;
         p2.size = 6.7;
        System.out.println(p2.brand);
        System.out.println(p2.color);
        System.out.println(p2.price);
        System.out.println(p2.size);


    }
}
/**1.通过class关键字描述手机这一类事物*/
class Phone{
    /**2.通过成员变量来描述手机这类事物的特征
     * 成员变量:类里方法外,无需手动初始化赋值*/
    //特征:品牌、价格、颜色、尺寸
    String brand;//品牌
    String color;//颜色
    double price;//价格
    double size;//尺寸
    /**3.通过方法来描述手机这类事物的功能
     * 格式:修饰符  返回值类型 方法名(参数列表){方法体}*/
    //行为:打电话、打微信、看直播
    public void call(){
        System.out.println("假装正在打电话~");
    }
    public void message(){
        System.out.println("假装正在发短信~");
    }
    public void learn(){
        System.out.println("假装正在看直播~");
    }

}

5.具体对象创建的流程:

1).在main()方法外,通过class关键字创建描述手机这一类事物
2).通过成员变量来描述手机这类事物的特征
3).通过方法来描述手机这类事物的功能
4).在公共类中创建程序入口函数main()方法
5).创建手机类的对象p
6).通过“.”调用对象的具体功能
7).打印查看对象的具体值
6.编程思路:
6.1 抽象相关信息,封装成一个类,类相当于设计图纸
1)特征--属性--用成员变量来描述;
2)行为(功能)--方法--用方法来描述
6.2 创建对象,通过new关键字来创建对象Phone p= new Phone();
TIPS(小贴士):p是一个引用类型变量,它保存着的是对象的地址值
6.3 通过创建好的对象来调用功能,查看属性
TIPS:同一个类创建多个对象之间没有相互关系,并不相互影响
7.1 对象在内存中的存储
队列:先进先出FIFO(first in first out)
栈:后进先出LIFO(last in first out)先进后出
7.2 创建对象时,内存究竟经历了什么?
1).在栈内存中开辟一块空间,存放引用类型变量p,并把p压入栈底
2).在堆内存中开辟了一块空间,存放Phone对象
3).完成对象的初始化,并赋予默认值
4).给初始化完毕的对象赋予唯一的地址值
5).把地址值交给引用类型变量p来保存
8.使用3w1h原则描述面向对象OOP
1)what--是什么:面向对象是一种编程思想
2)why--为什么使用面向对象:相较于之前的面向过程而言,面向过程强调的是过程,凡事亲力亲为,而面向对象强调的是结果,我们由之前每件事物的具体执行者转变为指挥者,要做事情,先创建对象出来,通过对象完成具体业务,提高效率
3)when--何时何处使用它:java是一门面向对象的语言,万物皆对象,正是因为对象无处不在,所以容易被忽略,与其他技术点来说,面向对象的思想无处不在,只要想干活,必须先创建对象
4)how--如何使用它,使用时的注意事项:
9.编程顺序:
1)总结归纳一类事物的特点与行为,通过抽象,封装成一个“类”组件;类中包含:属性--成员变量(赋值) 行为---方法(调用)
2)通过new关键字,创建指定类的对象
3)有了对象,就可以通过“对象."来使用类中的所有资源
10.注意事项:
1).一个Java文件中只能有一个公共类,且此类与文件名同名
2).自定义抽象形成的类与公共类是并列关系
3.)在同包下,不能创建两个同名的class
4).根据同一个类模板创建出来的多个对象间不会互相影响

2.封装private(关键字)

1.封装是隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式,比如类和方法

2.总结归纳把一些属性和行为进行抽象,封装成一个“类”组件,提高重用性,比如Phone类
3.对类中的资源用private关键字进行修饰封装属性和方法,阻止外界直接访问资源,提高程序的安全性,
  1)属性的封装:
属性前加private,一旦封装属性,被private修饰的资源只能在本类中使用;
我们需要提供对应的属性设置值和访问值方法:getxxx()--获取属性值;setxxx()--设置属性值;
我们可以提高封装阻止外界直接访问资源,想要访问,必须按照我的方式来封装方法
  2)方法的封装:
       用private进行修饰的方法,被private修饰的资源外部无法直接访问
       可以在本类公共的方法中调用私有方法,如果想执行此私有方法的功能,调用公共方法即可
3.封装的步骤:
1).创建手机的类class XXXX{ }
2).成员变量来描述手机的属性特征String brand;
3).方法来描述手机的行为功能public void call(){}
4).在公共类中创建程序入口函数main()方法,并创建手机类的对象:Phone p = new       Phone();
5).通过“.”来调用手机类的具体属性和功能 p.call();System.out.println(p.brand);
6.1)对属性的封装,在属性前加private,提供对应的封装属性设置值和获取访问值两个方法//封装下方空白行,鼠标右键Generater--》Getter and Setter--》按住shift键单击最后一个红色锁标全选,ok即可
6.2)把第5步的调用注释掉,调用get和set方法设置对应属性的值//先set后get,缺一个方法都没有输出值:p.setBrand("HUAWEI");System.out.println(p.getBrand());set修改属性值,get获取查看属性值
7.1)对方法的封装,public 换成 private,// 只留一个public,把封装的方法名+参数列表()复制到唯一的public方法的内
7.2)调用普通方法public修饰的那个方法提取封装后的方法

练习:封装学生案例

package cn.tedu.oop;
/**本类测试学生类的封装*/
public class TestPrivate {
    /**4.在公共类中创建程序入口函数main()方法
     * 创建学生类的对象*/
    public static void main(String[] args) {
        Student s =new Student();
        /**5.通过创建好的对象,查看对象的属性值,调用方法*/
        //s.study();//调用学习功能
        //s.eat();//调用干饭功能
        System.out.println(s.name);//查看s对象的name姓名属性值
        System.out.println(s.sNum);//查看s对象sNum学号属性值
        //System.out.println(s.subject);//查看s对象subject科目属性值
        //'subject' has private access in 'cn.tedu.oop.Student'通过路径访问权限
        s.setSubject("侦探");
        System.out.println(s.getSubject());
        s.study();

    }

}
/**1.通过class关键字封装一个学生类*/
class Student{
    /**2.描述学生这一类事物的属性--通过成员变量*/
    String name = "柯南";//姓名
    int sNum =2105;//学号
   private String subject = "侦探";//科目//封装:属性前加private,外界main()方法无法用
    /**空白处右键-->Generate-->Geter and seter-->红锁图标ok*/
    public String getSubject() {//get方法是获取值
        return subject;
    }

    public void setSubject(String subject) {//set方法是设置值
        this.subject = subject;//this表示当前类
    }

    /**3.描述学生这一类事物的行为--通过方法*/
    public void study(){
        System.out.println("我们在学习java。");
        eat();//私有方法调用,把私有方法复制到公共方法里
    }
    private void eat(){//public也可以封装,外界也无法用
        System.out.println("韭菜加鸡蛋,越吃越能干!");
    }

}

面试题TIPS:1.如何封装?
                      我们可以使用private关键字来封装成员变量与方法
                    2.如何访问私有资源?
                       1).关于成员变量:
                            setXxx – 对外提供公共的设置值方式
                            getXxx – 对外提供公共的获取值方式
                      2).关于成员方法:
                            把私有方法放在公共方法里供外界调用即可

3.拓展:OOP综合练习

创建包:cn.tedu.oop

创建类:TestCar

package cn.tedu.oop;
/**本类用于面向对象的巩固练习*/
public class TestCar {
    //3.创建程序入口函数main()方法
    //创建汽车类对象c
    public static void main(String[] args) {
        Car c =new Car();
        //4.通过汽车类
//        c.color = "暗夜紫";
//        c.brand = "BWM";
//        c.length = 0.2;
//        c.price = 200;
//        //5.查看设置好的属性值
//        System.out.println(c.brand);
//        System.out.println(c.color);
//        System.out.println(c.length);
//        System.out.println(c.price);
        //6.通过c对象调用汽车类的方法
        //c.start();
        //c.stop();
        //7.3调用提供的set与get方法,设置并获取对应属性的值
        c.setBrand("特斯拉");
        c.setColor("black");
        c.setPrice(200.02);
        c.setLength(3);
        System.out.println(c.getBrand());
        System.out.println(c.getColor());
        System.out.println(c.getPrice());
        System.out.println(c.getLength());
        //8.3调用公共类来实现私有方法功能的使用
        c.start();

    }
}
//1.抽象汽车这一类事物的属性和行为,封装成一个类组件
class Car{
    //2.属性--用成员变量来描述
    //7.1封装所有属性值--使用private修饰
    private String color;
    private String brand;
    private double price;
    private double length;
    //7.2生成所有属性的set和get方法
/**右键空白处-->Generate-->Getter and setter-->按住shift单击最后一个红锁图案可全选所有属性,ok即可生成get、set方法*/
    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public double getPrice() {
        return price;
    }

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

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    //2.行为(功能)--用方法来描述
    //8.2可以在本类公共的方法里,调用私有方法
    public void start(){
        System.out.println("汽车开动了");
        stop();//调用是有方法stop
    }
    //8.1封装方法,通过Private
    private void stop(){
        System.out.println("汽车停止了");
    }
}

4访问控制符

作用:用来控制一个类,或者类中的成员的访问范围。

TIPS:default是表示不写修饰符,默认,如果写default单词来修饰会报错

5.匿名对象

没有名字的对象,是对象的简化表示形式。
使用场景:
当被调用的对象只调用一次时(多次会创建多个对象浪费内存)
Demo d = new Demo();
d.sleep();
d.game();
//这个d就是对象的名字。
也可以写成:
new Demo().show();//创建了一个对象调方法
new Demo().game();//又创建了一个对象调方法


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值