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份。
- */
- // 用户类
- 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);
- }
- }
- 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); // 深圳
- }
- }
- // 丈夫类
- 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);
- }
- }
知识点
- // 顾客类
- 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语言是面向对象
- 要想创建对象必须先定义类
- 定义类的语法:
- [修饰符列表] 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);
- }
- }
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!
原文链接:https://www.cnblogs.com/Axianba/p/14949743.html