类与类之间的关系

一、继承关系      继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性。在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。


二、实现关系      实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性。在UML类图设计中,实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。

三、依赖关系      简单的理解,依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A。比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖。表现在代码层面,为类B作为参数被类A在某个method方法中使用。在UML类图设计中,依赖关系用由类A指向类B的带箭头虚线表示。

四、聚合关系      聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。

显式参数和隐式参数

显式参数,就是平时见到的在方法名括号中间的参数,就是所谓能看得见的参数。

隐式参数,是在类的方法中调用了类的实例域。这个被调用的实例域就是隐式参数。在以下的这个类中调用了a.ariseSalary(100),就用到了隐式参数。比如:

  1. public class Abc
  2. {
  3.     private double salary;
  4.     public Abc(){
  5.     }
  6.     public void ariseSalary(double em){
  7.         double employ = salary * em;
  8.         salary += employ;
  9.     }
  10. }
  1. Abc a = new Abc();
  2. a.ariseSalary(100);

在上面的类中,如果调用了这个方法salary是实例域,ariseSalary方法中的salary就是隐式参数。如果在隐式参数的前面加上this,隐式参数就更清晰:

  1. public void ariseSalary(double em){
  2.     double employ = this.salary * em;
  3.     this.salary += employ;
  4. }

推荐在隐式参数的前面加上this操作符。this操作符代表的是本类

面向对象的特性是:封装,继承,多态

不要在一个get方法中返回一个可修改对象,这样破坏了封装,应该返回这个对象的clone。

一个方法可以访问它所属的类的所有对象的私有数据。

  1. package com.zjf.spring.mybatis.model;
  2.  
  3. public class Person {
  4.  private Integer id;
  5.     public boolean equals(Person obj) {
  6.        return this.id.equals(obj.id);
  7.     }
  8. }

id是obj对象私有属性,但是因为是在Person类里的方法,而obj是Person对象,所以可以使用obj.id。

final域

final实体域

final实体域必须保证在每一个构造器执行之后要被初始化。否则编译错误。也就是要么定义的时候直接赋值,要么在公共构造器代码块初始化它,要么在每个构造器都初始化它。否则编译通不过。

而且构造完之后就不能改变了,这里的不能改变是指对象引用不能变,但是如果这是一个可变对象,它的内容是不能保证不变的。

所以final一般用在基本数据类型,或者不可变类上。用在可变的类上,会造成混乱。

final静态域

和实体域类似,final静态域必须在定义的时候初始化,或者在静态代码块中初始化。

方法参数

java语言总是采用值传递。也就是说,方法得到的是所有参数值的一个拷贝。

这里说的拷贝,是局限在堆栈上的。

对于基本类型很好理解。对于对象的话,我们可以理解。

如:我们要把Person p传递给一个方法,其实我们是这么操作的。

Person p1 = p,然后把p1传递过去。

p1是p在堆栈总的拷贝,但是他们指向同一个堆的位置。

如果,Person是可变对象,这个时候我们执行了p1的方法做了修改,p的内容也会变化。

但是,如果我们,执行p1 = new Person,这个时候不会对p有任何影响。

这就是java所说的:值拷贝,方法不能修改传递给它的参数。

值传递区别与c中的引用传递,如果是引用传递,其实是把p直接传递过去了。

域的初始化

如果没有在构造器中对实体域进行初始化,java会自动初始化。数字为0,布尔为false,对象引用为null。

尽量不要这么做。

默认构造器

仅当类没有提供任何构造器的时候,java会提供一个默认无参构造器。

构造器相互调用

一个构造器调用另外一个通过this方法,而且必须在构造器的第一行代码,而且只能调用一个,只能调用一次。

初始化块

  1. package com.zjf;
  2. public class FinalTest {
  3.    private final int j ;
  4.    //初始化块
  5.    {
  6.       j = 0;
  7.    }
  8.    public FinalTest() {
  9.  
  10.    }
  11. }

初始化顺序

  1. 所有的域被初始化为默认值(0,false,null)
  2. 按照代码出现的顺序,依次执行初始化语句和初始化块。
  3. 调用构造器。

关于第二点,举例如下:

  1. package com.zjf;
  2. public class FinalTest {
  3.    //初始化块
  4.    {
  5.       j = 0;
  6.    }
  7.    public FinalTest() {
  8.       System.out.println(j);
  9.    }
  10.    private int j = 1;
  11.    public static void main(String[] args) {
  12.       new FinalTest();
  13.    }
  14. }

结果为1

如果把初始化块放到下面:

  1. package com.zjf;
  2.  
  3. public class FinalTest {
  4.  
  5.    public FinalTest() {
  6.       System.out.println(j);
  7.    }
  8.  
  9.    private int j = 1;
  10.  
  11.    public static void main(String[] args) {
  12.       new FinalTest();
  13.    }
  14.    // 初始化块
  15.    {
  16.       j = 0;
  17.    }
  18. }

结果为0。

静态构造器

static

{

//静态代码

}

在类(不是对象)初始化的时候调用。

finalize方法

finalize方法会在对象被垃圾回收之前被调用,但是何时被垃圾回收依赖于不同的垃圾回收机制,所以不能保证这个方法什么时候会被执行,所以尽量不要使用这个方法。

public private 包作用域

如果没有public 也没有private 就是包作用域。

类上只能投public和包作用域。

如果方法和属性可以有public ,private和包作用域。

包作用域要求包一模一样,即使是子包也不可以。

java 对象与类的更多相关文章

  1. Java-Runoob:Java 对象和类

    ylbtech-Java-Runoob:Java 对象和类 1.返回顶部 1. Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 ...

  2. (五)Java 对象和类

    Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 消息解析 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例,有状态和行为. ...

  3. Java 教程 (Java 对象和类)

    Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例(对象不是找个女朋友 ...

  4. JavaSE基础(十二)--Java 对象和类

    Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例(对象不是找个女朋友 ...

  5. Java对象转xml报文和xml报文转Java对象帮助类

    import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marsha ...

  6. java对象和类学习

    定义对象的类: 一个对象的状态(属性或特征)是指那些具有他们当前值的数据域 一个对象的行为是由方法定义的,调用对象的方法就是完成对象的一个动作 使用一个通用类来定义同一类型的对象.类是一个模板,一个对 ...

  7. Java对象与类中的一个小练习

    一直在Eclipse里做练习.是做一个练习,执行一个的那种.刚刚学习了Java的对象与类,练习中把类和执行放在同一包下的两个.java文件里面了.是可以执行的.(Get) 相关代码: public c ...

  8. JAVA对象和类

    Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 Java中的类 类可以看成是创建Java对象的模板. 通过下面一个简单的类来理解下Java中类的定 ...

  9. 重新学习Java——对象和类(二)

    上一节回归了如何以面向对象的思想去使用一些Java中的公共类,也设计了一些自己的类并介绍了设计类的基本方法和技巧,这一节我们将继续回顾这些内容,并争取从中获得新的体验和感受. 1. 静态域与静态方法 ...

  10. 重新学习Java——对象和类(一)

    之前通过记笔记的方法,对于<Java核心技术>这本书的前一章进行了重新的复习,感觉效果很好,比单独看书带来了更好的复习效果,了解了很多以前不是很注意的一些细节,但是在一些自己较为熟悉的地方 ...

随机推荐

  1. MySQL备份工具之mysqlhotcopy

    mysqlhotcopy使用lock tables.flush tables和cp或scp来快速备份数据库.它是备份数据库或单个表最快的途径,完全属于物理备份,但只能用于备份MyISAM存储引擎和运行 ...

  2. flum到kafka 收集数据 存储到redis 案例 (ip.txt)

    ip.scala package ip import org.apache.kafka.clients.consumer.ConsumerRecord import org.apache.kafka. ...

  3. Platform区分不同平台

    用于区分平台 OS 属性 表示当前的平台类型.只有 ios 与 android 两个值.如可以使用为同一个属性在不同的平台上赋不同的值 const styles = StyleSheet.create ...

  4. Day02:对象和类(下)

    构造方法 什么是构造方法 在类实例化对象时运行的一种特殊的方法 为什么需要构造方法 构造方法适合为对象的属性赋初值 编写构造方法 public 类名(){ //方法体 } 构造方法不写返回值 构造方法 ...

  5. LeetCode.1021-删除最外面的括号(Remove Outermost Parentheses)

    这是小川的第380次更新,第408篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第242题(顺位题号是1021).有效的括号字符串为空(""),&qu ...

  6. 【OpenCV开发】OpenCV:使用VideoCapture类进行视频读取和显示

    原文来自:http://blog.csdn.net/thefutureisour/article/details/7530344 -------------以下为原文---------------这次 ...

  7. Java学习开发第一阶段总结

    前言: 按照学院的安排我专业应该在下学期学习Java课程,因为对技术的热爱,我选择了在本学期学习Java.俗话说得好“笨鸟先飞”,那我就先学习这门课程了. 第一阶段的学习总结: 在此次阶段任务相对比较 ...

  8. 第j九周学习总结暨第七周实验报告

    完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: (3)卖票过程延时1秒钟: (4)不能出现一票多卖或卖出负数号票的情况. 一:实验代码 package d ...

  9. python生成饼图解决中文乱码

    解决乱码问题 乱码的原因 字体的不匹配 解决的方法 加上引用中文字体就好了 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] 代码 def sta ...

  10. python正则表达式re 中m.group和m.groups的解释

    转载:http://www.cnblogs.com/kaituorensheng/archive/2012/08/20/2648209.html 先看代码instance: >>> ...