Java第二章----对象和类
从第一章到第二章整整隔了一个月的时间,这速度也是慢的无语了。因为这个月负责开发公司一个SaaS类型APP,忙的昏天暗地终于上线了,这才有时间写个博客。本章还是以概念为主,有点枯燥重在理解。
第一节:对象
名词解释
- OOA-Object Oriented Analysis-面向对象分析
- OOD-Object Oriented Design-面向对象设计
- OOP-Object Oriented Programming-面向对象程序设计
面向对象基本特性
- 万物皆可为对象:任何一件事物都可以表示为程序中的对象
- 程序是对象的集合:它们通过发送信息来告知彼此所需要做的
- 每个对象都有自己的或有其他对象所构成的存储:如:对象中引用其他对象
- 每个对象都拥有其类型:每个对象都是某个类class的实例,这里的类就是指类型
- 某一指定类型的所有对象都可以接受相同的信息:如:person对象拥有father和mother对象的所有性质
- 一句话总结就是:对象具有状态行为和标识,内部数据即状态-方法即行为-存在内存中的唯一地址即标识
面向对象三个特性
- 封装(encapsulate):把客观事物封装成抽象的类,并且类中的属性和方法有自己指定的访问权限。隐藏具体细节,是调用者只能遵循自己定义的规则,方便权限控制
- private:成员变量和方法只能在类内被访问,具有类可见性
default:成员变量和方法只能被同一个包里的类访问,具有包可见性
protected:可以被同一个包中的类访问,被同一个项目中不同包中的子类访问
public:可以被同一个项目中所有类访问,具有项目可见性,这是最大的访问权限
- 继承:指子类有父类所有的功能,并可以重写或补充自己的方法
关键字:extends ,Java是单继承关系所有对象的父类都是Object,多继承容易使代码混乱,单继承使只有一个父类代码逻辑更清晰如:它们都是相同的数据类型都有相同的方法功能且单继承结构对垃圾回收机制实现变得容易的多。Java是单继承多实现接口的结构。
重载(overloading):同一个类中有相同的方法名字不同的参数叫做方法重载
重写(overriding):两个类之间必须存在继承关系,且子类重写了父类中有的方法,包括方法名字参数返回值都相同,如果需要调用父类中方法须用super关键字调用
- 多态:指一个实现类在不同的情景下有不同的实现方式,即不同的类可以实现相同的接口来完成不同的任务,但我们可以通过相同的方式予以调用
条件:必须存在继承关系,子类重写父类的方法,向下转型
- 转化规则:子类转换父类向上转型可直接赋值,父类转换子类向下转型许强制类型转换且无法调用子类特有方法
package com.fengzb.java002.object; /** * @Description 封装 * @Author jxb * @Date 2017-06-10 22:52:20 */ public class Person { /** * 手 */ private String hand; /** * 脚 */ private String foot; /** * 头 */ private String head; public String getHand() { return hand; } public void setHand(String hand) { this.hand = hand; } public String getFoot() { return foot; } public void setFoot(String foot) { this.foot = foot; } public String getHead() { return head; } public void setHead(String head) { this.head = head; } /** * 无参构造方法 */ public Person(){ System.out.println("--jxb--Person--Person:我是Person无参构造方法"); } /** * @Description private方法可以在同一个类中调用 * @Param * @Author jxb * @Date 2017-06-11 23:19:48 */ private void isPerson() { System.out.println("--jxb--Person--isPerson:" + "我是人"); } /** * @Description 默认方法只有同一个包里可用 * @Param * @Author jxb * @Date 2017-06-12 12:32:00 */ void useHeadThinking() { System.out.println("--jxb--Person--useHeadThinking:" + "人用头想事情"); } /** * @Description protected方法同一个包可见,同一个项目不同包的子类可见 * @Param * @Author jxb * @Date 2017-06-12 12:36:06 */ protected void useFootWalk() { System.out.println("--jxb--Person--useFootWalk:" + "人用脚走路!"); } /** * @Description public方法可以同项目中所有类访问 * @Param * @Author jxb * @Date 2017-06-11 23:17:15 */ public void useHandEat() { System.out.println("--jxb--Person--useHandEat:" + "人用手吃饭!"); } /** * @Description private方法可以在同一个类中调用 * @Param * @Author jxb * @Date 2017-06-11 23:19:48 */ public void personDetail() { System.out.println("--jxb--Person--personDetail:" + "我是人类"); } }
Person
package com.fengzb.java002.object; /** * @Description 继承 * @Author jxb * @Date 2017-06-12 12:25:53 */ public class Mother extends Person { /** * 姓名 */ private String name; /** * 年龄 */ private int age; /** * 性别 */ private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } /** * @Description * @Param * @Author jxb * @Date 2017-06-11 23:17:15 */ public void useHandEat() { System.out.println("--jxb--Person--useHandEat:" + "wbb用手吃饭!"); } /** * @Description * @Param * @Author jxb * @Date 2017-06-11 23:17:15 */ public void motherDetail() { System.out.println("--jxb--Father--motherDetail:" + this.name + "-" + this.getAge() + "-" + this.getAge()); } }
Mother
- 封装(encapsulate):把客观事物封装成抽象的类,并且类中的属性和方法有自己指定的访问权限。隐藏具体细节,是调用者只能遵循自己定义的规则,方便权限控制
对象的生命周期
- 对象在堆(heap)的内存池中动态的创建,这种方式只有运行时才能知道有多少对象需要被创建,他们的生命周期如何,以及它们的具体类型。
- Java用NEW关键字来创建对象,Java提供垃圾回收的机制,它可以自动发现对象何时不再使用并继而销毁它。
异常处理
- 异常也是一种对象,它往往处于编程语言中,与程序正常执行路径并行,在发生错误时执行另一条路径。因为是完全另一条路径执行,所以不会干扰正常代码的运行
- Java从一开始就内置了异常处理,它要求你必须使用它,如果没有编写正确的异常处理代码,在编译时就会报错,这也是Java健壮性和安全性的表现
并发编程
- 我们想把问题分割成多个可独立运行的任务,在程序中这些独立运行的部分叫做线程,这就是并发
- 当多个线程访问同一个资源的时候有可能会有问题,我们必须使某个线程锁定某个资源,完成其任务后释放资源,这是线程锁也叫同步线程
对象存储位置
- 寄存器:这是最快的储存区,位于处理器内部,我们无法用程序操控它也无法感知它的存在
- 堆栈:位于RAM(随机访问储存器)中,堆栈指针下移分配内存上移释放内存,速度仅次于寄存区,Java系统必须知道所有项的生命周期以便用上下移动堆栈指针,虽然某些数据(对象引用)存储其中,但对象本身并不在其中
- 堆:一种通用的内存池也存在RAM中,用于存放所有Java对象。不需要知道对象的生命周期,需要的时候直接NEW出一个对象堆堆自动分配空间,但当清理的时候却要花费点时间
- 常量储存:常量因为是不会被改变的所以通常放在程序中,也可以放在ROM(只读存储器)中
- 非RAM存储:一些对象完全存活于数据之外比如:流对象和持久化对象。这种对象通常存储在硬盘上
- 特例基本类型:创建一个并非是引用的自动变量,直接存储在栈中,因此更加高效
- 用引用操作对象:就像遥控器操纵电视机一样,没有电视机遥控器还可以存在只是不能发出任何消息,所以为了安全起见创建一个引用的时候就初始化一个对象
第二节:类
作用域
- 作用域决定了其内部变量的可见性和生命周期,用花括号表示。但用new创建的引用对象,它可以存活于作用域之外,虽然引用对象不能用了,但是new出来的对象还一直在内存中,Java通过垃圾回收机制最终回收无用的对象,finalize方法在垃圾回收之前调用,但不推荐使用
类
- 用class关键字后面紧跟着新的类型名称,用来抽象某一类的对象。命名方式:首字母大写每个单词的首字母大写
- 依赖(uses-a)(dependence)
聚合(has-a)(aggregation)
继承(is-a)(inheritance)
设计类时尽量做到高内聚低耦合
所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始
- 用class关键字后面紧跟着新的类型名称,用来抽象某一类的对象。命名方式:首字母大写每个单词的首字母大写
属性
- 属性就是对象本身的一些描述字段,他可以是基本数据类型也可以是其他对象的引用。命名方式:首字母小写每个单词的首字母大写
方法-参数-返回值
- 方法是对象行为的描述,可以有很多方法,利用传递的参数做业务处理返回想要得到的值。命名方式:首字母小写每个单词的首字母大写
构造器:与类名相同,每个类可以有一个以上的构造器,没有返回值,伴随new关键字被调用。一个类中如果没有构造器,系统就会默认一个无参的构造器,数值型为0,布尔型为false,对象为null
- 方法是对象行为的描述,可以有很多方法,利用传递的参数做业务处理返回想要得到的值。命名方式:首字母小写每个单词的首字母大写
static
- static类是不被允许的,通常使用内部类实现静态类
- static方法在类被加载后jvm就可以在运行时数据区读取到,因此不依赖创建对象就可以直接调用类名.方法名()。可以调用其他static方法,只能调用static数据,不能用super和this调用
- static变量在jvm加载的时候只会分配一块内存(节省内存),可以用类名.变量名来调用,private static表示私有的静态数据。而实例变量会每new一个对象就是一块内存
- static代码块通常叫做静态代码块,在类加载的时候被顺序执行,在构造方法之前执行
final
- final类不能被继承,里面的方法都是final的,没有继承所以就没有重写
- final方法不允许被覆盖,为了锁定其方法不被扩展或者为了提高效率。private方法无法继承因此private方法默认是final的(有争议)
- final变量一但被赋值就无法改变
- final参数可以运用但不能被改变
- final+static表示不能被改变的静态数据或方法也叫全局常量
初始化数据
- 在声明中赋值
- 在初始化块中赋值
- 在构造方法中赋值
- 声明>初始化块>构造方法
- Father
package com.fengzb.java002.object; /** * @Description 测试类 * @Author jxb * @Date 2017-06-11 23:07:24 */ public class ObjectTest { public static void main(String[] args) { System.out.println("--jxb--ObjectTest--main:----------测试继承----------begin"); /** * private 方法无法调用 */ Person person = new Person(); person.useHandEat(); /** * 向上转型 拥有父类的可见方法,当子类重写父类方法时,调用的是子类的方法-多态 */ Person pMother=new Mother(); pMother.useHandEat(); /** * 编译和运行均不会报错 * 向下转型需要强制类型转换 */ Mother ppMother = (Mother)pMother; ppMother.setName("枫"); ppMother.motherDetail(); /** * 编译不会报错但运行会报java.lang.ClassCastException(类型转换异常) * 可以用instanceof 来判断是否可以向下转型 */ Person mperson = new Person(); //这里转换后运行会出现异常 //Mother mother = (Mother) mperson; //mother.useHandEat(); if(mperson instanceof Mother){ Mother mother = (Mother) mperson; mother.useHandEat(); System.out.println("--jxb--ObjectTest--main:很显然走不到这里"); } System.out.println("--jxb--ObjectTest--main:----------测试继承----------end"); System.out.println("--jxb--ObjectTest--main:----------测试final static----------begin"); /** * address输出的是:北京昌平,所以具体加载顺序如下: * 1:声明式赋值被加载 * 2:静态模块被加载且只加载一遍(这个实际还是很有用的) * 3:父类构造方法被加载 * 4:本身构造方法被加载 */ Father father = new Father(); Father father1 = new Father(); System.out.println("--jxb--ObjectTest--main:"+Father.address); /** * final无法赋值 */ //Father.TEL="18588888888"; System.out.println("--jxb--ObjectTest--main:"+Father.TEL); System.out.println("--jxb--ObjectTest--main:----------测试final static----------end"); } }
ObjectTest
包(package):将类组织起来,一般用域名的逆序作为包名。如果一个类里面引用相同名字的外部类,可以通过inport关键字导入包路径来区分
注释:单行(//)以及多行注释(/* */),注释内容Java虚拟机会自动过滤
注释文档:JavaDoc可以生成html文档,以@符号为标识符如:@version
Java第二章----对象和类的更多相关文章
- javascript进阶课程--第二章--对象
javascript进阶课程--第二章--对象 学习要点 理解面向对象的概念 掌握对象的创建方法 掌握继承的概念和实现方法 基本概念 对象究竟是什么?什么叫面向对象编程? 对象是从我们现实生活中抽象出 ...
- C++ primer plus读书笔记——第10章 对象和类
第10章 对象和类 1. 基本类型完成了三项工作: 决定数据对象需要的内存数量: 决定如何解释内存中的位: 决定可使用数据对象执行的操作或方法. 2. 不必在类声明中使用关键字private,因为这是 ...
- “全栈2019”Java第二章:安装JDK11(Windows)
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 文章原文链接 "全栈2019"Java第二章:安装JDK11(Windows) 下一 ...
- javascript进阶教程第二章对象案例实战
javascript进阶教程第二章对象案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过案例练习补充几个之前没有见到或者虽然讲过单是讲的不仔细的知识点. 二.具体实例 温馨提示 面向对象的知 ...
- 关于Java中的对象、类、抽象类、接口、继承之间的联系
关于Java中的对象.类.抽象类.接口.继承之间的联系: 导读: 寒假学习JavaSE基础,其中的概念属实比较多,关联性也比较大,再次将相关的知识点复习一些,并理顺其中的关系. 正文: 举个例子:如果 ...
- [Effective Java]第二章 创建和销毁对象
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 《疯狂Java:突破程序员基本功的16课》读书笔记-第二章 对象与内存控制
Java内存管理分为两个方面:内存分配和内存回收.这里的内存分配特指创建Java对象时JVM为该对象在堆内存中所分配的内存空间.内存回收指的是当该Java对象失去引用,变成垃圾时,JVM的垃圾回收机制 ...
- [Java核心技术]第四章-对象与类(4.1-4.6总结)
4.1面向对象程序设计概述 OOP(面向对象编程Object Oriented Programming) OOP中数据第一位,算法第二位. 类 封装:关键在于不能让其他方法直接访问类的实例域,程序仅通 ...
- Java 第二章 变量、数据类型和运算符
第二章 变量.数据类型和运算符 什么是变量: 变量代表一块内存区域,变量类型不一样,这一块内存的大小也不一样. #在编程语言里面,你可以通过定义变量,向内存里添加数据或者修改内存已有的数据. ...
随机推荐
- sort函数的用法与实验
用了这么久的sort排序,但是一直没有对他进行总结. 像我这样的蒟蒻有了sort排序就再也没有看过快排.冒泡排序.桶排序了...... sort的头文件<algorithm> 存在于C++ ...
- WebLogic部署报java.lang.ClassCastException: weblogic.xml.jaxp.RegistrySAXParserFactory cannot be cast to javax.xml.parsers.SAXParserFactory
今天在部署WebLogic项目时,报了java.lang.ClassCastException: weblogic.xml.jaxp.RegistrySAXParserFactory cannot b ...
- iOS有关图片处理的总结 (四)------图片的饱和度,亮度,对照度。
在做图片处理的时候.会遇到调节图片的饱和度的问题,这里就要用到Core Image这个框架,Core Image是一个非常强大的框架. 它能够让你简单地应用各种滤镜来处理图像,比方改动鲜艳程度, 色泽 ...
- HDU 3569 Imaginary Date 简单期望
推一下公式.就会发现是这个.. 由于设结果有x种方案.则每一个数字出现的概率都均等,然后和就是x*m 每种方案的概率是1/x 每一个数出现的概率都是1/n 所以每一个方案的和就是 sum/n *m # ...
- Vue深度学习(3)
基础 Vue.js允许自定义指令,实质上是让你教 Vue一些新技巧:怎样将数据的变化映射到 DOM 的行为.可以使用 Vue.directive(id, definition) 的方法传入指令 id ...
- Ubuntu SSH root 登录 Permission denied 错误
问题: $ ssh root@40.125.21.75 root@40.125.21.75's password: Permission denied, please try again. 解决方式, ...
- java开发收藏
一.java工具 1.jenkins 项目集成工具 2.launch4j java打包成exe工具 二.json库 1.jsoniter 比以下都快 2.dsljson 3.fastjson 4.gs ...
- Asynchronous vs synchronous client applications(MQTT)
来自我的CSDN博客 想查看英文原文的请点击原文网址.在上两篇翻译中,Homejim我给大家分别翻译了同步客户端应用程序和异步客户端应用程序.本人对这两个的区别也有困惑,因此将paho下的这个比较 ...
- PL/SQL Developer使用技巧(部分)
PL/SQL Developer使用技巧(部分) 关键字自动大写 在sql命令窗口中输入SQL语句时,想要关键字自动大写,引人注目该怎么办呢? 一步设置就可以达成了.点击Tools->Prefe ...
- iOS常见的几种加密方法(base64.MD5.Token传值.系统指纹验证。。加密)
普通加密方法是讲密码进行加密后保存到用户偏好设置中 钥匙串是以明文形式保存,但是不知道存放的具体位置 一. base64加密 base64 编码是现代密码学的基础 基本原理: 原本是 8个bit 一组 ...