写点什么

Surpass Day——Java 面向对象的创建和使用

作者:胖虎不秃头
  • 2022 年 10 月 07 日
    河南
  • 本文字数:3327 字

    阅读完需:约 11 分钟

Surpass Day——Java面向对象的创建和使用

面向对象与面向过程

1、面向对象

1、三大特性


三大特性:封装、继承、多态;


面向对象的分析 OOA


面向对象的设计 OOD


面向对象的编程 OOP


2、类与对象


对象抽象化找出共同特征定义为类(类是属性、模板、概念);


对象(个体)真实存在;


不存在,是虚拟的;


类---->对象(通过实例化);


对象---->类(通过抽象化);


状态---->一个类的属性(通过对象的状态信息);


动作---->一个类的方法(描述对象的动作信息);


注意:


状态和动作当具体到某个对象上之后,发现最终的结果可能不一样;


对象和对象之间有共同的特征,但是具体到对象之后有数据的差异。

2、面向过程和面向对象的区别

-面向过程:


主要关注点是:实现的具体过程,因果关系【集成显卡的开发思路】


*优点:


对于业务逻辑比较简单的程序,可以达到快速开发,前期投入成本较低;


*缺点:


采用面向过程的开发很难解决非常复杂的业务逻辑,另外面向过程的方式导致软件元素之间的”耦合度“非常高,只要其中一环出问题,整个系统受到影响,导致最终的软件”扩展力“差。另外由于没有独立体的概念,所以无法达到组件复用。


-面向对象:


主要关注点是:主要关注对象}【独立体】能完成哪些功能。【独立显卡的开发思路】


*优点:


耦合度低,扩展力强。更容易解决现实世界当中更复杂的业务逻辑。组合复用性强。


*缺点:


前期投入成本高,需要进行独立体的抽取,大量的系统分析和设计。


-C 语言是纯面向过程的、C++半面向对象、Java 纯面向对象


\



类的定义

1、语法结构

[修饰符列表] class 类名{


}


String 不属于基本数据类型,是一个字符串类型,也是一个引用类型;


String 是 SUN 在 JavaSE 中提供的字符串类型;


String.class 字节码文件;


重点:


1、属性通常是采用一个变量的形式来完成定义的;


2、在类体当中,方法体之外定义的变量被称为"成员变量",成员变量没有赋值,系统赋默认值:一切向 0 看齐;

2、基本数据类型

byte、short、int、long、float、double、boolean、char;


3、引用数据类型

String.class SUN 提供的;


System.class SUN 提供的;


Student.class 程序员自定义的(是一个类,类型,引用数据类型

1、成员/实例/对象变量、实例(对象)

1.1 对象的基本性质

1)类体=属性+方法,属性【存储数据采用变量的形式】;


2)对象又被称为实例,实例变量又被称为对象变量【对象级别的变量】;


3)不创造对象,这个变量的内存空间是不存在的,只有创建了对象,这个变量的内存空间才会被创建;

1.2 成员变量、实例变量、静态变量(类变量)、局部变量

1)成员变量:作用范围是整个类,相当于 C 中的全局变量,定义在方法体和语句块之外,一般定义在类体当中;成员变量包括实例变量和静态变量(类变量);


成员变量没有手工赋值的话,系统默认值如下:


数据类型                                默认值
​
————————————————————————————————————————————————
​
byte,short,int,long                     0;
​
float,double                            0.0;
​
boolean                               false;
​
char                                  \U000;
​
引用数据类型                             null;


2)实例变量:独立于与方法之外的变量,无 static 修饰,声明在一个类中,但在方法、构造方法和语句块之外,数值型变量默认值为 0,布尔型默认值为 false,引用类型默认值为 null;


实例变量不能通过“类名”去访问,必须通过引用;


实例变量在堆内存的 java 对象内存中存储;


3)静态变量(类变量):独立于方法之外的变量,用 static 修饰,默认值与实例变量相似,一个类中只有一份,属于对象共有,存储在(方法区内存)静态存储区,经常被声明为常量,调用一般是类名.静态变量名,也可以用对象名.静态变量名调用;


public static String level = "SSS"; *//成员变量、静态变量(类变量)*


4)局部变量:类的方法中的变量,访问修饰符不能用于局部变量,声明在方法、构造方法或语句块中,在栈上分配,无默认值,必须经初始化;



2、对象的创建和使用

2.1 对象和引用的定义

new 运算符在栈内存中开辟的内存空间称为对象;


引用是一个变量,只不过这个变量中保存了另一个 java 对象的内存地址;


1)与 C 语言中的指针不同,指针可以指向内存空间的任意一块地址


2)java 中无指针,不能直接操作堆内存,只能通过“引用”访问堆内存中对象的实例变量,保证了 java 语言的安全性)

2.2 对象的创建

1)通过一个类可以实例化多个对象,实例化的语法:new 类名();


2)new 是 java 语言中的一个运算符,其作用是创建对象,在 JVM 堆内存中开辟新的内存空间;


int i = 10;


int 是一个基本数据类型;i 是一个变量名;10 是 int 类型的字面值;


Student s = new Student( );


Student 是一个引用数据类型s 局部变量在栈内存中存储】表示引用new Student() 是创建一个学生对象;

2.3 JVM 三大内存

方法区内存:在类的加载的时候,class 字节码代码片段会被加载到该内存空间;


栈内存(局部变量) :方法代码片段在执行的时候会给该方法分配内存空间,在栈内存中压栈;


堆内存:new 的对象在堆内存中存储;



点击并拖拽以移动


​编辑

2.4 对象的访问

访问实例变量的语法格式:


读取数据:引用.变量名;


修改数据:引用.变量名 = 值;

2.5 实例

//用户类public class User{    int no;//基本数据类型 实例变量     String name;//引用数据类型 实例变量    Address addr;//引用数据类型  实例变量}
复制代码


点击并拖拽以移动


//家庭住址类public class Address{    String city;//引用数据类型  实例变量  city是一个引用:保存内存地址的一个变量,该变量保存内存地址指向了堆内存;    String street;    String zipcode;}
复制代码


点击并拖拽以移动


//测试类1public class helloworld{    public static void main(String[] args){        User u = new User();         System.out.println(u.no);         System.out.println(u.name);         System.out.println(u.addr);         u.no = 110;         u.name = "jack";        u.addr = new Address();    }}
复制代码


点击并拖拽以移动



点击并拖拽以移动


​编辑


//测试类2public class helloworld{    public static void main(String[] args){        User u = new User();        Address a = new Address();        u.addr = a;        System.out.println(u.addr.city);        a.city = "天津";        System.out.println(u.addr.city);    }}
复制代码


点击并拖拽以移动



点击并拖拽以移动


​编辑

2.6 夫妻类

//丈夫类public class Wife{    String name;    Husband h;//丈夫对象当中含妻子引用}
复制代码


点击并拖拽以移动


//妻子类public class Husband{    String name;    Wife w;//妻子对象当中还有丈夫引用}
复制代码


点击并拖拽以移动


public class code{    public static void main(String[] args){        //创建一个丈夫对象        Husband huang = new Husband();        huang.name = "黄晓明";        //创建一个妻子对象        Wife baby = new Wife();        baby.name = "baby";        //结婚【通过丈夫找到妻子,也可以通过妻子找到丈夫】        huang.w = baby;        baby.h = huang;        //得到黄晓明的妻子的名字        System.out.println(huang.name + "妻子的名字是" + huang.w);    }}
复制代码


点击并拖拽以移动

2.7 JVM

2.7.1 内存区

当中变化最频繁的是栈内存,最先有数据的是方法去内存,垃圾回收器主要针对的是堆内存;

2.7.2 垃圾回收器【自动垃圾回收机制、GC 机制】

什么时候考虑将某个 java 对象的内存回收呢?


1)当栈内存当中 java 对象称为垃圾数据的时候,会被垃圾回收器回收;


2)什么时候堆内存的 java 的对象会变成垃圾呢? -没有更多的引用指向它的时候;


-这个对象无法被访问,因为访问对象只能通过引用的方式访问;

2.8 空指针异常

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


点击并拖拽以移动


 
复制代码



点击并拖拽以移动


​编辑

2.9 关联关系和继承关系

关联关系:A has a B【A 对象中含有 B 对象的引用】;


继承关系:A is a B【关系更加紧密】


发布于: 刚刚阅读数: 5
用户头像

还未添加个人签名 2022.07.29 加入

还未添加个人简介

评论

发布
暂无评论
Surpass Day——Java面向对象的创建和使用_Java_胖虎不秃头_InfoQ写作社区