前言:

本文讲述java中对象与类的一些概念。包括对象与类的有关概念,类间五种关系,类的访问权限等。

在java中,一切都可以用对象来描述,操作对象的标识符只不过是对象的一个引用,一个对象可以有多个引用,就像人可以有多个外号一样,但是这个外号不一定是真实存在这个人,可能以虚假的外号欺骗世人,引用亦如此,引用不一定需要有对象与之关联,一个引用倘若没有引用对象,那么这个引用就是null。而对于一个真实存在的对象,如果没有一个引用引用它,那么很不幸的,它将在不久的将来被jvm的垃圾回收器发现并回收。类是对象的一个模板和蓝图,通过类这个模板可以创建出多个相似的对象。

对象初始化的过程

在Java中,对象的创建通过new 关键字动态分配内存创建一个对象,也可以通过反射在运行时创建一个对象。对象在创建时的初始化过程如下:

如果该类A还未加载,则是先加载该类,执行该类的类构造器方法(),执行类构造器之前,如果该类有父类,则先执行父类的类构造器方法(),依次类推,最后当类加载完之后,就开始执行类A的实例构造器方法()进行对象初始化,执行()方法之前,需要先执行父类的()方法,依次类推。

ps: ()方法是编译器根据类的静态变量声明处赋值语句和静态初始化块生成的一个jvm可识别的方法,在类初始化过程调用;()方法是构造方法和实例变量声明处赋值语句,以及实例初始化块生成的一个方法,在对象实例化的时候才会调用,每个构造方法都会对应一个()方法。

类的静态变量赋值顺序:在静态变量声明的地方赋值->静态初始化块赋值->构造方法赋值

实例变量的赋值顺序:在实例变量声明的地方赋值->在实例初始化块赋值->在构造方法赋值

看代码:

public class Test{

public static void main(String[] args){

new Son();

}

}

class Base{

protected int a = 1;

protected static int b = 1;

{

a = 2;

b = 2;

System.out.println("Base类的实例初始化块执行:a为" + a + ",b为" + b);

}

static{

b = 3;

System.out.println("Base类的静态初始化化块执行:b为"+b);

}

public Base(){

b = 4;

a = 4;

System.out.println("Base类的构造方法执行:a为"+a + ",b为" + b);

}

}

class Son extends Base{

{

a = 6;

b = 6;

System.out.println("Son类的实例初始化块执行:a为" + a + ",b为" + b);

}

static{

b = 7;

System.out.println("Son类的静态初始化化块执行:b为"+b);

}

public Son(){

a = 8;

b = 8;

System.out.println("Son类的构造方法执行:a为" + a + ",b为" + b);

}

}

运行结果:

运行结果

如果运行结果如你所料,那么你基本掌握了这个知识点了,如果不是,那你要好好补补功课了。

类的构成

类有方法和属性构成。属性例如商品的价格数量、人的性别年龄等。方法例如价格的税率计算等。

类的属性和方法的访问权限

类的属性和方法的访问权限有以下几种:

权限

同一个类

同一个包的类

同一个包的子类

不同包的子类

不同包中的类

private (私有)

×

×

×

×

default (默认)

×

×

protected (保护)

×

public (公有)

类重用

类重用的方式主要是通过类间的继承关系和聚合组合关系实现的。

关于类的两种重用方式的区别与特点将在下篇文章《java基础(第一篇)继承与组合》总结。

关于类之间的关系

类之间的关系主要有五种:

依赖(use-a)

关联(association)

聚合(has-a)

组合(composition)

继承(is-a)

1. 依赖关系是一种use-a的关系。

一般而言,一个类A如果操作另一个类B的对象来实现某些功能,我们就称为A依赖于B。

表现为:方法参数传入另一个类的实例对象,静态方法的调用,在代码块和方法中定义的另一个类类型的局部变量等。

这种依赖关系是弱依赖,具有偶然性,并不是长期依赖,是在局部作用域内使用了另一个类的实例或者使用了另一个类的静态方法时。当调用类的方法时,才出现依赖关系

代码实例:

public class A{

//1. 参数形式

public void useOne(B b){

b.showB();//使用b做一些事情

}

public void useTwo(){

//2. 局部变量形式

new B().showB();

//3. 静态方法形式

B.bb();

}

}

public class B{

public void showB(){

System.out.println("b hello world!");

}

public static void bb(){

System.out.println("B static hello world!");

}

}

2. 关联关系是指在一个类中与另一个类有联系。

表现为成员变量的使用

关联关系分两种:单向关联和双向关联。

顾名思义,单向关联是指仅有一方关联了另一方,而双向关联指的是双方互相存在关联。

代码示例:

单向关联

public class A{

private B b = new B();

public void useB(){

//使用b做一些事情

}

}

public class B{

}

双向关联

public class A{

private B b = new B();

public useB(){

//使用b做一些事情

}

}

public class B{

private A a = new A();

public void useA(){

//使用a做一些事情

}

}

另外根据关联的对象的数量又可分为以下几种的关联:

表示方式

说明

1..1

表示一个类的一个对象只与另一个类的一个对象有关联

1..*

表示一个类的一个对象与另一个类的一个或多个对象有关联

0..*

表示一个类的一个对象与另一个类的零个或多个对象有关联

0..1

表示一个类的一个对象与另一个类的零个或一个对象有关联

m..n

表示一个类的一个对象与另一个类的m个到n个对象有关联

两个类之间虽然是存在联系,但是只是在结构上的联系,并没有要求在语义上有联系。两个类在生命周期上是平级关系,其中一个类的消失都不会促使另一个类的消亡,与下面讲述的聚合关系和组合关系有所不同。

3. 聚合关系是一种has-a 的关系,是关联关系的一种特例

表示类A的一个对象拥有另一个类A的实例。

在java中,同样表示为成员变量的形式。但是与普通关联关系有所不同,聚合关系在语义上并不是平级关系,聚合关系的类A 与 类 B 是一种 A has-a B 的关系。而这个b 也可以是多个类共享。

举栗子:

电脑与连接在电脑的打印机,电脑拥有一台打印机设备。这台打印机设备属于这台电脑,同时也可以属于其他共享这个打印机的电脑。

4. 组合关系是一种contain-a的关系,也是关联关系的一种特例,区别同样在于语义

表示类A的一个对象包含另一个类B的一个实例对象。

与聚合关系不同在于,聚合关系的a消亡并不会促使b消亡。而组合关系中a的消亡会导致b也跟着消亡,组合关系中a与b也是整体与部分的关系,但部分不能脱离整体而存在。

举个栗子:

人和人的头就是组合关系。人一旦死去,头部也会随之消亡。而聚合关系中的例子打印机 可以单独存活于外,电脑死机了,打印机还是连接着其他电脑,但是人的头部恐怕以目前的技术很难接到其他本体吧。

5. 继承关系也称泛化(generalization)

表示一个子类继承了父类。在java中通过关键字extends 实现

这五种类之间的关系的耦合度:继承>组合>聚合>关联>依赖

参考

java 的对象类用_java基础(第零篇)对象与类相关推荐

  1. java保护型数据成员_Java基础知识笔记第四章:类和对象

    编程语言的几个发展阶段 面向机器语言 面向过程语言 面向对象语言:封装.继承.多态 类 类声明 classPerson{ ....... }class植物{ ....... } 类体 类使用类体来描述 ...

  2. java语言用数组接收字符_Java基础——数组应用之字符串String类

    字符串String的使用 Java字符串就是Unicode字符序列,例如串"Java"就是4个Unicode字符J,a,v,a组成的. Java中没有内置的字符串类型,而是在标准J ...

  3. java 输出一个爱心_java基础 之 几个常用的类

    在以上的文章中我们看了Java的一些基础的使用,今天我们主要学习一下Java的几个常用的类 java操作系统底层Sytem类: System类代表当前Java程序的运行平台,程序不能创建System类 ...

  4. formdata传参java用对象怎么接受_Java基础4

    Java方法详解 何谓方法 方法的定义及调用 方法的重载 命令行传参 可变参数 递归 何谓方法? System.out.println(),那么它是什么呢? //System"类" ...

  5. java arraylist枚举器遍历_Java基础(七)泛型数组列表ArrayList与枚举类Enum

    一.泛型数组列表ArrayList 1.在Java中,ArrayList类可以解决运行时动态更改数组的问题.ArrayList使用起来有点像数组,但是在添加或删除元素时,具有自动调节数组容量的功能,而 ...

  6. java时间日期格式器_JAVA基础类库(二)-----日期、时间类和格式器

    Date类 public classDateTest{public static voidmain(String[] args){ Date d1= newDate();//获取当前时间之后100ms ...

  7. java 查看类_JAVA基础知识之JVM-——通过反射查看类信息

    Class实例 当类被加载之后,JVM中就会生成一个Class实例,通过这个实例就可以访问JVM中的这个类.有三种方式可以获取Class对象 使用Class的静态方法forName(完整包名) 调用类 ...

  8. java io 对象_JAVA基础知识之IO——对象序列化

    对象序列化 Java对象序列化(Serialize)是指将Java对象写入IO流,反序列化(Deserilize)则是从IO流中恢复该Java对象. 对象序列化将程序运行时内存中的对象以字节码的方式保 ...

  9. java继承原理内存角度_Java基础知识巩固

    最近发现自己的Java基础知识还是有点薄弱,刚好有点空闲时间进行再补一补,然后进行整理一下,方便自己以后复习.其实个人认为Java基础还是很重要的,不管从事Java后端开发还是Android开发,Ja ...

最新文章

  1. ring0下的 fs:[124]
  2. ExecutorService框架
  3. UML学习总结(3)——StarUML指导手册
  4. 【STM32】标准外设库,系统架构,时钟系统
  5. 翘课老黄历——设计文档
  6. BZOJ1179 Atm //缩点+spfa
  7. c语言软件幻化,python字符串处理
  8. ShardingSphere(四) 垂直分库配置搭建,实现写入读取
  9. latex中使用bibtex显示paragraph ended before \mule@arg was complete 的解决方法
  10. C++中动态定义一维数组,二维数组,三维数组的方法
  11. css_input[checked]复选框去掉默认样式并添加新样式
  12. kibana数据导入导出_MySQL数据库批量导出和导入查询数据
  13. 开源视频质量评价工具: IQA
  14. js阻止浏览器默认事件
  15. python 在线客服_后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统...
  16. Linux随笔 - 修改主机名
  17. CI框架 url指向错误 配置根目录
  18. 数据库原理实验六——ODBC/JDBC数据库编程
  19. uni-app项目的启动
  20. ldap radius mysql_freeradius +ldap

热门文章

  1. Python画板画图之美
  2. java菜单面板设置完能关闭_用Java创建一个屏幕外框架(或者:当所有应用程序窗口关闭时,如何避免Mac上的空白菜单)?...
  3. 1506G. Maximize the Remaining String
  4. sqlserver oracle插件,SQLServer链接服务器至Oracle
  5. dual mysql 获取序列_MySQL获取周、月、天日期,生成排序号
  6. 关于linux kernel编译的几项关键点:
  7. 初识WINCE的HIVE注册表
  8. 【转】c#中@的3种作用
  9. 认识ASP.NET 5项目结构和项目文件xproj
  10. 日常收集C#接口知识(知识全面)