Java拾遗(2)

面向对象的三个主要特征:

行为——可以对对象施加哪些操作,或可以对对象施加哪些方法

状态——当施加那些方式时,对象如何响应

标识——如何辨别具有相同行为与状态的不同对象

作为一个类,每个对象的标识永远是不同的,状态常常也存在着差异

类之间的关系:

依赖("is-a"):一个类的方法操纵另一个类的对象 (尽量减少依赖)

聚合("has-a"):类A的对象包含类B的对象

继承("is-a"):特殊与一般;一般而言,类A扩展类B,类A不但包含从类B继承的方法,还会拥有一些额外的功能

new Date();这个对象被初始化为当前的时间和日期

一个对象变量并没有实际包含一个对象,而仅仅引用一个对象

在Java中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用.

new 操作符的返回值也是一个引用

语句  Date deadline = new Date(); 有两个部分,表达式new Date()构造了Date类型的对象,并且它的值是对新创建对象的引用,这个引用存储在变量deadline中

局部变量不会自动初始化为null,而必须调用new或将它们设置为null进行初始化

在所有的方法中不要命名与实例域同名的变量。

不要编写返回引用可变对象的访问器的方法,如果需要返回一个可变对象的引用,应该首先对它进行克隆,对象clone是指对存放在另一个位置上的对象的副本

两种情况使用静态方法:

  1. 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供
  2. 一个方法值需要访问类的静态域

工厂方法:  

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
NumberFormat percentFormatter  = NumberFormat.getPercentInstance();
double x = 0.1;
System.out.println(currencyFormatter.format(x));  // prints $0.10
System.out.println(percentFormatter.format(x));   // prints 10%

调用构造函数的步骤:

  1. 所有数据域被初始化为默认值(0、false 或 null)  
  2. 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块
  3. 如果构造器第一行调用了第二个构造器,则执行第二个构造器

执行这个构造器的主体

嵌套的包中没有任何关系,如java.util包与java.util.jar包毫无关系,每一个都拥有独立的类集合

继承

  在子类中可以增加域、增加方法或覆盖超类的方法,但不能删除继承的任何域和方法

  class Manager extends Employee

  由于Manager类的构造器不能访问Employee类的私有域,所以必须利用Employee类的构造器对这部分私有域进行初始化,我们可以通过super实现对超类构造器的调用。使用super调用构造器的语句必须是子类构造器的第一条语句。

  如果子类的构造器没有显示地调用超类的构造器,则将自动地调用超类默认(没有参数)的构造器。如果超类没有不带参数的构造器,并且子类的构造器中又没有显示地调用超类的其他构造器,则java编译器将报告错误

this用途:引用隐式参数;调用该类其他的构造器

super用途:调用超类的方法;调用超类的构造器

多态

是否应该设计为继承的"is-a"规则,它表明子类的每个对象也是超类的对象

置换规则:程序中出现超类对象的任何地方都可以用子类对象置换

可以将一个子类的对象付给超类变量

Manager boss = new Manager(...);

Employee[] staff = new Employee[3];

staff[0] = boss;

staff[0]与boss引用同一个对象,但编译器将staff[0]看成Employee对象

不能将超类的引用赋给子类变量

在java中,子类数组的引用可以转换成超类数组的引用,而不需要采用强制类型转换

  Manager[] managers = new Manager[10];

将它转换成Employee[]数组完全合法的

  Employee[] staff = new managers;

在覆盖一个方法的时候,子类方法不能进行低于超类方法的可见性

如果一个类声明为final,只有其中的方法自动地成为final,而不包括域

将方法或类声明为final主要目的是

将一个子类的引用赋给一个超类变量,编译器是允许的,将一个超类的引用赋给一个子类变量,必须进行类型转换。

Java拾遗(2),布布扣,bubuko.com

时间: 2024-11-04 17:28:31

Java拾遗(2)的相关文章

[Java拾遗三]JavaWeb基础之Servlet

Servlet    1,servlet介绍        servlet是一项动态web资源开发技术.        运行在服务器端.        作用:处理业务逻辑,生成动态的内容,返回给浏览器.        本质就是一个类     servlet的入门        1.编写servlet(类)--- 继承HttpServlet        2.编写关系--- web.xml(在WEB-INF下)        3.访问:            路径:http://localhost

JAVA拾遗录(一)

本系列博文主要收录Java中一些常见的但是平常又容易忘记.记错或者记混的知识点的集合.各个知识点之间没有必然的联系,可以随意跳着看,希望能够对各位同学有所帮助. 本博文持续更新.修改,转载请保留原文链接. 1. JAVA堆和栈的区别 堆和栈都是内存的一部分,有着不同的作用,而且一个程序需要在这片区域上分配内存.众所周知,所有的JAVA程序都运行在JVM上,这里所说的自然是JVM中的堆和栈. 最主要的区别就是栈内存用来存储局部变量和方法调用.而堆内存用来存储Java中的对象.无论是成员变量,局部变

java拾遗4----一个简单java程序的运行全过程

简单说来,一个java程序的运行需要编辑源码.编译生成class文件.加载class文件.解释或编译运行class中的字节码指令. 下面有一段简单的java源码,通过它来看一下java程序的运行流程: 1 class Person 2 3 { 4 5 private String name; 6 7 private int age; 8 9 10 11 public Person(int age, String name){ 12 13 this.age = age; 14 15 this.na

【Java拾遗】Java transient关键字

1. transient的作用及使用方法 2. transient使用小结 3. transient使用细节--被transient关键字修饰的变量真的不能被序列化吗? 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化. 然而在实际开发过程中,我们常常会遇到这样的

java拾遗3----XML解析(三) StAX PULL解析

使用PULL方式解析XML: Pull是STAX的一个实现 StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程. 为什么说StAX方式的效率优于SAX呢? 因为SAX 是推模式的,所有的操作在解析器自动控制下进行,所有事件都会处理,不管需不需要解析整个文档,解析器都会自动启动解析任务,然后按顺序向下解析,直到解析完成才终

[Java拾遗四]JavaWeb基础之Servlet_Request&&Response

今天来回顾下之前学过Servle的Resquest以及Response的知识.1,Request和Response技术:    rr的作用:        request是请求,封装用户的请求信息.若想获取请求信息,找request就行了        response是响应,封装服务器的响应信息,若想往页面写东西,找response就可以了    rr的体系结构:        request        在servlet中有一个service(ServletRequest,ServletR

[Java拾遗五]使用Session防止表单重复提交

申明:此文章属于转载, 转自博客: http://www.cnblogs.com/xdp-gacl/p/3859416.html在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提交的常见应用场景 有如下的form.jsp页面 1 <%@ page language="java" import="java.util.*&qu

Java 拾遗

1.选择表达式中的类型转换 public class Test { public void static main(String args[]){ int i = 5; System.out.println("Vlaue Is " + ((a<5) ? 10.9:9)); } } 当前程序的输出是什么?其实很容易得出输出9的错误结论:因为Java会根据精度自动进行类型转换,所以此时9应当为9.0. public class Test { public static void ma

Java拾遗(一):浅析Java子类和父类的实例化顺序 及 陷阱

本文主要介绍Java里经常使用的子类和父类的变量实例化顺序及陷阱,并结合一个Android实例来探讨此问题.日后编程中应尽量避免此陷阱. 首先看以下一段代码: 定义一个虚类Server.java package org.yanzi.test1; public abstract class Server { private static final int DEFAULT_PORT = 900; public Server() { // TODO Auto-generated constructo