新手初学Java面向对象

java面向对象

面向对象【Java语言的核心机制,最重要的内容,Java语言的特色】
    * 面向过程和面向对象的区别
        - 面向过程:主要关注点是:实现的具体过程,因果关系【集成显卡的开发思路】
            * 优点:对于业务逻辑比较简单的程序,可以达到快速开发,前期投入成本较低。
            * 缺点:采用面向过程的方式开发很难解决非常复杂的业务逻辑,另外面向过程的
            方式导致软件元素之间的“耦合度”非常高,只要其中一环出问题,整个系统受到影响,
            导致最终的软件“扩展力”差。另外,由于没有独立体的概念,所以无法达到组件复用。
        - 面向对象:主要关注点是:主要关注对象【独立体】能完成哪些功能。【独立显卡的开发思路】
            * 优点:耦合度低,扩展力强。更容易解决现实世界当中更复杂的业务逻辑。组件复用性强。
           * 缺点:前期投入成本较高,需要进行独立体的抽取,大量的系统分析与设计。
                - C语言是纯面向过程的、C++半面向对象、Java纯面向对象
        - 现在出现的一些新的编程语言多数都是面向对象的。人在认识现实世界的时候以面向对象的方式。
        - 面向对象更符合人的思维方式。
    * 面向对象的三大特征【先背会】
        - 封装
        - 继承
        - 多态
        所有面向对象的编程语言都有这三大特征。
           采用面向对象的方式开发一个软件,生命周期当中:【整个生命周期中贯穿使用OO面向对象方式】
            * 面向对象的分析:OOA
            * 面向对象的设计:OOD
            * 面向对象的编程:OOP
    * 类和对象的概念
        * 什么是类?
            - 类在现实世界当中是不存在的,是一个模板,是一个概念。是人类大脑思考抽象的结果。
            - 类代表了一类事物。
            - 在现实世界当中,对象A与对象B之间具有共同特征,进行抽象总结出一个模板,这个模板被称为类。
       * 什么是对象?
            - 对象是实际存在的个体。现实世界当中实际存在。
               * 描述一下整个软件开发的过程:
            * 程序员先观察现实世界,从现实世界当中寻找对象
            * 寻找了N多个对象之后,发现所有的对象都有共同特征
            * 程序员在大脑中形成了一个模板【类】
            * Java程序员可以通过java代码来表述一个类
            * Java程序中有了类的定义
            * 然后通过类就可以创建对象
            * 有了对象之后,可以让对象直接协作起来形成一个系统。
                * 类--【实例化】->对象
        * 对象又被称为实例/instance
        * 对象--【抽象】-->类
        * 重点:
            类描述的是对象的共同特征。
            共同特征例如:身高特征
            这个身高特征在访问的时候,必须先创建对象,通过对象去访问这个特征。
            因为这个特征具体的某个对象上之后,值不同。有的对象身高1.80,有的
            对象身高2.80。
                * 一个类主要描述什么信息呢?
            一个类主要描述的是 状态 + 动作。
            状态信息:名字、身高、性别、年龄
            动作信息:吃、唱歌、跳舞、学习
            状态--> 一个类的属性
            动作--> 一个类的方法
               * 
            类{
                属性; //描述对象的状态信息
                方法; //描述对象的动作信息
            }
            注意:
                状态和动作当具体到某个对象上之后,发现最终的结果可能不一样。
                对象和对象之间有共同特征,但是具体到对象之后有数据的差异。
    * 类的定义【从这里开始编写代码】
        语法结构:
            [修饰符列表] class 类名{
                属性;
                方法;
            }
                学生类,描述所有学生对象的共同特征:
            学生对象有哪些状态信息:
                * 学号【int】
                * 名字【String】
                * 性别【boolean】
                * 年龄【int】【年龄是一个属性,年龄是一个数据,是数据就应该有数据类型】
                * 住址【String】
                .....
            学生对象有哪些动作信息:
                * 吃饭
                * 睡觉
                * 学习
                * 玩
                * 唱歌
                * 跳舞
                ....
                    重点:属性通常是采用一个变量的形式来完成定义的。
            int no;
            int age;
            String name;
            String address;
            boolean sex;
       * java语言中包括两种数据类型:
        - 基本数据类型
            byte
            short
            int
            long
            float
            double
            boolean
            char
        - 引用数据类型
            String.class SUN提供的
            System.class SUN提供的
           Student.class 程序员自定义的
            User.class 程序员自定义的
            Product.class 程序员自定义的
            Customer.class 程序员自定义的
            ......
                - java语言中所有的class都属于引用数据类型。
// 定义一个类,类名Student
// Student是一个类,代表了所有的学生对象,是一个学生的模板。
public class Student{    // 定义一个公开的类,起名Student
    // 属性【描述的是对象的状态信息】
    // 熟悉通常采用变量的方式来定义
    // 在类体当中,方法体之外定义的变量被称为“成员变量”
    // 成员变量没有赋值,系统赋默认值:一切箱0看齐。
    // 学号
    int no;
    // 姓名
    String name;
    // 性别
    boolean sex;
    // 年龄
    int age;
    // 住址
    String address;
    // 方法
    // 方法描述的是对象的动作信息
    // 当前例子就只描述属性了
}
// 学生类
// 学生类是一个模板
// 描述了所有学生的共同特征【状态+行为】
// 当前类只描述学生的状态信息【属性】
// Student是类,属于引用数据类型,这个类型名就是:Student
public class Student{
    // 类体-属性+方法
    // 属性【存储数据采用变量的形式】
    // 由于变量定义在类体当中,方法体之外,这种变量称为成员变量
    // 所有学生都有学好信息
    // 但是每一个学生的学号都是不同的
    // 所以要访问这个学号必须先创建对象,通过对象去访问学号信息
    // 学号信息不能直接通过“类”去访问,所以这种成员变量又被叫做:实例变量
    // 对象又被称为实例,实例变量又成为对象变量。【对象级别的变量】
    // 不创建对象,这个no变量的内存空间是不存在的,只有创建了对象,这个no变量内存空间才会创建
    int no;
    // 姓名
    String name;
    // 年龄
    int age;
    // 性别
    boolean sex;
    // 住址
    String addr;

}
// 成员变量没有手动赋值的话,系统赋默认值
// 默认值
/*
    数据类型                      默认值
    ---------------------------------
    byte,short,int,long        0
    float,double                0.0
    boolean                        false
    char                        \u0000
    引用数据类型                null 空值
*/
// -----------------------------------------------------------------------------------------------------
/*
    对象的创建和使用
*/
public class OOTest01
{
    public static void main(String[] args){
        // int 是基本数据类型
        // i 是一个变量名
        // 10是一个int类型的字面值
        int i = 10;
        // 通过一个类可以实例化N个对象
        // 实例化对象的语法:new 类名();
        // new是java语言当中的一个运算符
        // new运算符的作用是创建对象,在JVM堆内存当中开辟新的内存空间
        // 方法区内存:在类加载的时候,class字节码片段被加载到该内存空间当中
        // 栈内存(局部变量):方法代码片段执行的时候,会给该方法分配内存空间,在栈内存中压栈
        // 堆内存:new的对象在堆内存中存储
        // Student是一个应用数据类型
        // s 是一个变量名
        // new Student()是一个学生对象
        // s是一个局部变量【在栈内存中存储】
        // 什么是对象?new运算符在堆内存中开辟的内存空间称为对象
        // 什么是引用?引用是一个变量,只不过这个变量保存了另一个java对象的内存地址
        // java语言当中,程序员不能直接操作堆内存,java中没有指针,不像c语言
        // java语言当中,程序员只能通过“引用”去访问堆内存当中对象内部的示例变量
        Student s = new Student();
        // 访问实例变量的语法格式:
        // 读取数据:引用.变量名
        // 修改数据:引用.变量名 = 值
        /*
        int stuNo = s.no;
        String stuName = s.name;
        int stuAge = s.age;
        boolean stuSex = s.sex;
        String stuAddr = s.addr;
        System.out.println("学号 = " + stuNo);
        System.out.println("姓名 = " + stuName);
        System.out.println("年龄 = " + stuAge);
        System.out.println("性别 = " + stuSex);
        System.out.println("地址 = " + stuAddr);
        */
        s.no = 10;
        s.name = "jack";
        s.age = 20;
        s.sex = true;
        s.addr = "深圳";
        System.out.println("学号 = " + s.no);    // 10
        System.out.println("姓名 = " + s.name);    // jack
        System.out.println("年龄 = " + s.age);    // 20
        System.out.println("性别 = " + s.sex);    // true
        System.out.println("地址 = " + s.addr);    // 深圳
        // 编译报错,no这个实例变量不能直接采用”类名“的方式访问
        // 因为no是实例变量,对象级别的变量,变量存储在java对象的内部,必须先有对象
        // 通过对象才能访问no这个实例变量,不能直接通过"类名"访问
        // System.out.println(Student.no);
        // 在通过类实例化一个全新的对象
        // stu是一个引用类型
        // stu同时也是一个局部变量
        // Student是变量的数据类型
        Student stu = new Student();
        System.out.println("学号 = " + stu.no);        // 0
        System.out.println("姓名 = " + stu.name);    // null
        System.out.println("年龄 = " + stu.age);    // false
        System.out.println("性别 = " + stu.sex);    // 0
        System.out.println("地址 = " + stu.addr);    // null
    }
}

/*
    局部变量在栈内存中存储
    成员变量中的实例变量在堆内存的java对象内存存储
    实例变量是一个对象一份,100个对象有100份。
*/

新手初学Java面向对象_第1张图片

// 用户类
public class User{
    // 属性【以下都是成员变量之实例变量】
    // 用户编号
    // int 是一种基本数据类型:整数型
    // no是一个实例变量
    int no;
    // 用户名
    // String 是一种引用数据类型:代表字符串
    // name是一个实例变量
    // name是一个引用
    String name;
    // 家庭住址
    // Adddress是一种引用数据类型:代表家庭住址
    // addr是一个实例变量
    // addr是一个引用
    Address addr;
}
// ----------------------------------------------------------------------
// 家庭住址类
public class Address{
    // 属性成员变量之实例变量】
    // 城市
    // String是一种引用数据类型,city是一个变量名,属于实例变量
    // oity是一个引用:保存内存地址的一个变量,该变量保存内存地址指向了堆内存当中的对象
    String city;
    // 街道
    String street;
    // 邮编
    String zipcode;
}
// ----------------------------------------------------------------------
// 测试类
public class OOTest02{
    public static void main(String[] args){
        // 创建User对象
        // u是局部变量
        // u是一个应用
        // u保存内存地址指向堆内存的User对象
        User u = new User();
        // 输出User对象内部实例变量的值
        System.out.println(u.no);    // 0
        System.out.println(u.name);    // null
        System.out.println(u.addr);    //  null
        // 修改User对象内部实例变量的值
        u.no = 110;
        u.name = "jack";    // "jack" 是一个java对象,属于String对象
        u.addr = new Address();
        // 在main方法当中目前只能看到一个引用“u”
        // 一切都是只能通过u来进行访问
        System.out.println(u.name + "居住在那个城市:" + u.addr.oity);
        System.out.println(u.name + "居住在那个街道:" + u.addr.street);
        System.out.println(u.name + "居住在那个邮编:" + u.addr.zipcode);
        u.addr.oity = "深圳";
        u.addr.street = "福田";
        u.addr.zipcode = "516600";
        System.out.println(u.name + "居住在那个城市:" + u.addr.oity);
        System.out.println(u.name + "居住在那个街道:" + u.addr.street);
        System.out.println(u.name + "居住在那个邮编:" + u.addr.zipcode);


    }
}

新手初学Java面向对象_第2张图片

public class OOTest03{
    public static void main(String[] args){
        // u是引用
        // u是局部变量
        User u = new User();
        // 上一个版本中编写的
        // u.addr = new Address();
        // a是引用
        // a是局部变量
        Address a = new Address();
        u.addr = a;
        
        System.out.println(u.addr.city); // null
        a.city = "天津";
        System.out.println(u.addr.city);  // 天津
        u.addr.city = "深圳";
        System.out.println(u.addr.city);    // 深圳
    }
}

新手初学Java面向对象_第3张图片

// 丈夫类
public class Husband{
    // 姓名
    String name;
    // 丈夫对象当中含有妻子引用
    Wife w;
}
// -----------------------------------------------------------------

// 妻子类
public class Wife{
    // 姓名
    String name;
    // 妻子对象当中含有丈夫引用
    Husband h;
}
// -------------------------------------------------------------------
public class OOTest04{
    public static void main(String[] args){
        // 创建一个丈夫对象
        Husband huangXiaoMing =  new Husband();
        huangXiaoMing.name = "黄晓明";
        // 创建一个妻子对象
        Wife baby = new Wife();
        baby.name = "baby";
        // 结婚【能通过丈夫找到妻子,通过妻子也可以找到丈夫】
        huangXiaoMing.w = baby;
        baby.h = huangXiaoMing;
        // 得到以上“黄晓明”的妻子的名字
        System.out.println(huangXiaoMing.name + "的妻子名字叫:" + baby.name);
        System.out.println(huangXiaoMing.name + "的妻子名字叫:" + huangXiaoMing.w.name);
    }
}

新手初学Java面向对象_第4张图片

知识点

新手初学Java面向对象_第5张图片

// 顾客类
public class Customer
{
    // id
    int id;
}
// ------------------------------------------------------------------------
// 测试程序
public class OOTest05
{
    public static void main(String[] args){
        Customer c = new Customer();
        System.out.println(c.id); // 0
        c = null;
        // 以下程序编译可以通过,因为符合语法
        // 运行出现空指针异常
        // 空应用访问“实例”相关的数据一定会出现空指针异常
        // java.lang.NullPointerException
        System.out.println(c.id);
    }
}

// “实例”相关的数据表示:这个数据访问的时候必须有对象的参与,这种数据就是实例相关的数据

新手初学Java面向对象_第6张图片

/*
    Java语言是面向对象
    要想创建对象必须先定义类
    定义类的语法:
        [修饰符列表] class 类名{
            属性:
            方法:
        }
    属性通常采用变量来表示,既然是变量那么变量肯定有数据类型。【数据类型包括:基本数据类型 + 引用数据类型】
    属性对应的是状态信息。
    观察现实世界当中超市中的商品,发现这所有的商品都有一些共同的特征,例如,每一个商品都有编号,每一个商品都有单价,所以定义以下的类,来代表所有的商品
*/

public class Product{
    // 编号 【通常是一个数字,而且该数字通常是整数型的】
    // productNo 是基本数据类型
    // 实例变量
    int productNo;
    // 单价 【通常是一个数字,但是数字可能带有小数,所以采用浮点型数据double表示】
    // price 是基本数据类型
    // 实例变量
    double price;
// ----------------------------------------------------------------------
/*
    每一个类中都可以编写主方法,但是一般情况下
    一个系统只有一个入口,所以主方法一般写一个
*/
public class ProductTest{    // 商品测试类
    // 程序入口
    public static void main(String[] args){
        // 创建对象,商品对象
        // iphone7 局部变量
        // iphone7 应用
        // iphone7 变量中保存内存地址的指向堆内存当中的商品对象
        Product    iphone7 = new Product();
        // 访问实例变量的语法:引用.变量
        // 读取:引用.变量名
        System.out.println("商品的编号:" + iphone7.productNo);
        System.out.println("商品的单价:" + iphone7.price);
        // 修改:引用.变量名 = 值;
        iphone7.productNo = 111;
        iphone7.price = 68000;
        System.out.println("商品的编号:" + iphone7.productNo);
        System.out.println("商品的单价:" + iphone7.price);

    }
}
// 人类
public class Ren{
    // 身份证号
    String id;
    // 名字
    String name;
    // 性别
    boolean sex;
    // 年龄
    int age;
}
// -------------------------------------------------------------------------
/*
    别墅类
        * 面积
        * 主人
*/
public class BieShu{
    // 面积
    double mianJi;
    // 主人【人类】
    // 变量/应引用
    // 变量怎么声明:数据类型 变量名;
    // 关联关系: A has a B 关系【A对象中含有B对象的引用】
    // BieShu对象含有Ren对象的引用
    Ren zhuRen;
}

// ----------------------------------------------------------------------
public class Test{
    public static void main(String[] args){
        // 思路:先创造人物对象,再创造别墅对象,让别墅有主人
        Ren zhangsan = new Ren();    // 初始化
        // 不采用系统默认值
        // 手动赋值
        zhangsan.id = "45682110";
        zhangsan.name = "张三";
        zhangsan.sex = true;
        zhangsan.age = 100;
        // 创建别墅对象
        BieShu fangzi = new BieShu();
        fangzi.mianJi = 150.0;
        fangzi.zhuRen = zhangsan;
        // 想知道房子主人的名字是什么?
        System.out.println(fangzi.zhuRen.name);
        // 房子换主人
        // 创建一个新的主人对象
        Ren lisi = new Ren();
        lisi.name = "李四";
        // 换主人
        fangzi.zhuRen = lisi;
        System.out.println(fangzi.zhuRen.name);
    }
}
// 学生类
class Student{
    String name;
    int no;
    // 笔记本
    Notebook book;
}

// ----------------------------------------------------------------------

// 笔记本类
class Notebook{
    // 品牌
    String brand;
    // 型号
    String model;
    // 颜色
    String color;
}

// ----------------------------------------------------------------------
/*
    需求:
        定义一个计算机类【电脑/笔记本】,计算机类有那些属性
            * 品牌  * 型号  * 颜色
        定义一个学生类,学生类有那些属性:
            * 姓名  * 学号  * 学生有一台笔记本电脑
        请编写程序来表示以上的类,然后分别将类创建为对象,对象数量不限,然后让其中的一个学生去使用其中的一台笔记本电脑
        然后编译并运行,并且将整个执行过程采用图形的方式描述出来。
*/

// 测试类
public class OOTest06{
    public static void main(String[] args){
        // 创建笔记本对象
        Notebook BiJiBen = new Notebook();
        // 手动赋值
        BiJiBen.brand = "华为";
        BiJiBen.model = "KX100";
        BiJiBen.color = "黑色";

        // 创建学生对象
        Student s = new Student();
        // 手动赋值
        s.no = 111;
        s.name = "jack";
        s.book = BiJiBen;
        System.out.println(s.name);
        System.out.println(s.no);
        System.out.println(s.book.brand);
        
        // 让这个学生和笔记本对象产生关系【通过学生能找到他的笔记本】
        System.out.println("学号:" + s.no + " 名字叫 " + s.name + " 的电脑品牌是:" + s.book.brand);
        System.out.println("学号:" + s.no + " 名字叫 " + s.name + " 的电脑品牌是:" + s.book.model);
        System.out.println("学号:" + s.no + " 名字叫 " + s.name + " 的电脑品牌是:" + s.book.color);

        // 修改品牌
        s.book.brand = "苹果";
        System.out.println("学号:" + s.no + " 名字叫 " + s.name + " 的电脑品牌是:" + s.book.brand);
    }
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

你可能感兴趣的