Java 笔记03

final可以修饰类、属性、方法。

 

当用final修饰类的时候,此类不可被继承,即final类没有子类。这样可以用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生。

 

当利用final修饰一个属性(变量)的时候,此时的属性成为常量。

JAVA利用final定义常量(注意在JAVA命名规范中常量需要全部字母都大写):

Final intAGE=10;

常量的地址不可改变,但在地址中保存的值(即对象的属性)是可以改变的。

 

Final可以配合static使用。 ?

Staticfinal int age=10;

 

在JAVA中利用publicstatic final的组合方式对常量进行标识(固定格式)。

 

对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效。

 

 

常量(这里的常量指的是实例常量:即成员变量)赋值:

①在初始化的时候通过显式声明赋值。Final int x=3;

②在构造的时候赋值。

局部变量可以随时赋值。

 

利用final定义方法:这样的方法为一个不可覆盖的方法。

Public final void print(){};

为了保证方法的一致性(即不被改变),可将方法用final定义。

 

如果在父类中有final定义的方法,那么在子类中继承同一个方法。

 

如果一个方法前有修饰词private或static,则系统会自动在前面加上final。即private和static方法默认均为final方法。

 

注:final并不涉及继承,继承取决于类的修饰符是否为private、default、protected还是public。也就是说,是否继承取决于这个方法对于子类是否可见。

Abstract(抽象)可以修饰类、方法

如果将一个类设置为abstract,则此类必须被继承使用。此类不可生成对象,必须被继承使用。

Abstract可以将子类的共性最大限度的抽取出来,放在父类中,以提高程序的简洁性。

Abstract虽然不能生成对象,但是可以声明,作为编译时类型,但不能作为运行时类型。

Final和abstract永远不会同时出现。

 

当abstract用于修饰方法时,此时该方法为抽象方法,此时方法不需要实现,实现留给子类覆盖,子类覆盖该方法之后方法才能够生效。

 

注意比较:

private void print(){};此语句表示方法的空实现。

Abstract void print(); 此语句表示方法的抽象,无实现。

 

如果一个类中有一个抽象方法,那么这个类一定为一个抽象类。

反之,如果一个类为抽象类,那么其中可能有非抽象的方法。

 

如果让一个非抽象类继承一个含抽象方法的抽象类,则编译时会发生错误。因为当一个非抽象类继承一个抽象方法的时候,本着只有一个类中有一个抽象方法,那么这个类必须为抽象类的原则。这个类必须为抽象类,这与此类为非抽象冲突,所以报错。

 

所以子类的方法必须覆盖父类的抽象方法。方法才能够起作用。

只有将理论被熟练运用在实际的程序设计的过程中之后,才能说理论被完全掌握!

为了实现多态,那么父类必须有定义。而父类并不实现,留给子类去实现。此时可将父类定义成abstract类。如果没有定义抽象的父类,那么编译会出现错误。

 

Abstract和static不能放在一起,否则便会出现错误。(这是因为static不可被覆盖,而abstract为了生效必须被覆盖。)

 

例:(本例已存在\CODING\abstract\TestClass.java文件中)

public classTestClass{

  public static void main(String[] args){

SuperClass sc=new SubClass();

Sc.print();

}

Abstract class SuperClass{

Abstract void print();}

}

class SubClass extends SuperClass(){

 void print(){

System.out.println(“print”);}

}

 

JAVA的核心概念:接口(interface)

接口与类属于同一层次,实际上,接口是一种特殊的抽象类。

如:

  interface IA{

}

publicinterface:公开接口

与类相似,一个文件只能有一个public接口,且与文件名相同。

在一个文件中不可同时定义一个public接口和一个public类。

 

一个接口中,所有方法为公开、抽象方法;所有的属性都是公开、静态、常量。

 

一个类实现一个接口的格式:

class IAImpleimplements IA{

};

 

一个类实现接口,相当于它继承一个抽象类。

 

类必须实现接口中的方法,否则其为一抽象类。

实现中接口和类相同。

 

接口中可不写public,但在子类中实现接口的过程中public不可省。

(如果剩去public则在编译的时候提示出错:对象无法从接口中实现方法。)

 

注:

①  一个类除继承另外一个类,还可以实现接口;

class IAImpl extends java.util.Arrylist implement IA{}

                 继承类                    实现接口

这样可以实现变相的多继承。

②  一个类只能继承另外一个类,但是它可以继承多个接口,中间用“,”隔开。

Implements IA,IB

所谓实现一个接口,就是指实现接口中的方法。

③  接口和接口之间可以定义继承关系,并且接口之间允许实现多继承。

例:interface IC extends IA,IB{};

接口也可以用于定义对象

IA I=new IAImpl();

实现的类从父类和接口继承的都可做运行时类型。

IAImple extends A implement IA,IB

IB I=new IAImple();

I instance of IAImple;

I instance of A;

I instance of IA;

I instance of IB;

返回的结果均为true.

 

接口和多态都为JAVA技术的核心。

 

接口往往被我们定义成一类XX的东西。

接口实际上是定义一个规范、标准。

 

①  通过接口可以实现不同层次、不同体系对象的共同属性;

通过接口实现write once as anywhere.

以JAVA数据库连接为例子:JDBC制定标准;数据厂商实现标准;用户使用标准。

接口通常用来屏蔽底层的差异。

②接口也因为上述原因被用来保持架构的稳定性。

 

JAVA中有一个特殊的类: Object。它是JAVA体系中所有类的父类(直接父类或者间接父类)。

 

此类中的方法可以使所的类均继承。

 

以下介绍的三种方法属于Object:

(1)  finalize方法:当一个对象被垃圾回收的时候调用的方法。

(2)  toString():是利用字符串来表示对象。

当我们直接打印定义的对象的时候,隐含的是打印toString()的返回值。

可以通过子类作为一个toString()来覆盖父类的toString()。

以取得我们想得到的表现形式,即当我们想利用一个自定义的方式描述对象的时候,我们应该覆盖toString()。

(3)equal

首先试比较下例:

String A=newString(“hello”);

String A=newString(“hello”);

A==B(此时程序返回为FALSE)

因为此时AB中存的是地址,因为创建了新的对象,所以存放的是不同的地址。

 

附加知识:

字符串类为JAVA中的特殊类,String中为final类,一个字符串的值不可重复。因此在JAVA VM(虚拟机)中有一个字符串池,专门用来存储字符串。如果遇到String a=”hello”时(注意没有NEW,不是创建新串),系统在字符串池中寻找是否有”hello”,此时字符串池中没有”hello”,那么系统将此字符串存到字符串池中,然后将”hello”在字符串池中的地址返回a。如果系统再遇到String b=”hello”,此时系统可以在字符串池中找到 “hello”。则会把地址返回b,此时a与b为相同。

 

 

Stringa=”hello”;

System.out.println(a==”hello”);

系统的返回值为true。

 

故如果要比较两个字符串是否相同(而不是他们的地址是否相同)。可以对a调用equal:

System.out.println(a.equal(b));

equal用来比较两个对象中字符串的顺序。

a.equal(b)是a与b的值的比较。

 

 

注意下面程序:

student a=new student(“LUCY”,20);

student b=new student(“LUCY”,20);

System.out.println(a==b);

System.out.println(a.equal(b));

此时返回的结果均为false。

 

以下为定义equal(加上这个定义,返回ture或false)

public booleanequals(Object o){

  student s=(student)o;

  if(s.name.equals(this.name)&&s.age==this.age)

else returnfalse;

}如果equals()返回的值为

 

以下为实现标准equals的流程:

public booleanequals(Object o){

  if (this==o) return trun;  //此时两者相同
  if (o==null) return false;

  if (! o instanceof strudent) returnfalse;  //不同类

  studeng s=(student)o; //强制转换

  if(s.name.equals(this.name)&&s.age==this.age) return true;

else returnfalse;

}

 

以上过程为实现equals的标准过程。

 

 练习:建立一个employee类,有String name,int id,doublesalary.运用get和set方法,使用toString,使用equals。

 

封装类:

JAVA为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被Object来装载。

除了int和char,其余类型首字母大写即成封装类。

转换字符的方式:

int I=10;

String s=I+” ”;

Strings1=String.valueOf(i);

 

Int I=10;

IntergerI_class=new integer(I);

 

看javadoc的帮助文档。

附加内容:

“==”在任何时候都是比较地址,这种比较永远不会被覆盖。

 

程序员自己编写的类和JDK类是一种合作关系。(因为多态的存在,可能存在我们调用JDK类的情况,也可能存在JDK自动调用我们的类的情况。)

注意:类型转换中double\interger\string之间的转换最多。

时间: 2024-08-04 02:00:35

Java 笔记03的相关文章

Java笔记:集合框架实现原理

这篇文章是对http://www.cnblogs.com/skywang12345/category/455711.html中java集合框架相关文章的一个总结,在此对原作者的辛勤整理表示感谢. Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(Iterator迭代器.Enumeration枚举类.Arrays和Collec

Java笔记:Java内存模型

1. 基本概念 <深入理解Java内存模型>详细讲解了java的内存模型,这里对其中的一些基本概念做个简单的笔记.以下内容摘自 <深入理解Java内存模型>读书总结 并发 定义:即,并发(同时)发生.在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. 并发需要处理两个关键问题:线程之间如何通信及线程之间如何同步. 通信:是指线程之间如何交换信息.在命令式编程中,线程之间的通信机制

Java笔记:多线程

一些概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程 是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在 Windows 系统中,一个运行的 exe 就是一个进程. 线程 是指进程中的一个执行流程,一个进程中可以运行多个线程.比如 java.exe 进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. 同时 执行是人的感觉,在线程之间实际上轮换执行. 多线程间堆空间共享,栈空间独立.堆存的是地址

java笔记十一:动态编译

JDK6.0推出了动态编译的新功能,能够在程序中动态的写一个类,再对之进行编译.编译成class文件后就可以通过类加载方式把动态编译的类加载到内存中.当然也能通过RunTime类调用javac命令来动态编译. 动态编译类的主要步骤: ①.写一个字符串,这个字符串就是要编译的类的全部内容. ②.通过输出流,把该字符串的内容写到工程下面指定的包中. ③.对创建的java文件进行编译. 动态编译涉及的类有JavaCompiler.StandardJavaFileManager,具体如何编译看下面的例子

java笔记九:对象序列化与反序列化

在java程序运行过程中,有许多的对象同时存在,但是程序结束运行或者JVM停止运行时这些对象都会消失.如何将这些对象保存起来以便下一次 再将这些对象读入内存呢?或者如何将某些对象通过网络传到另一端的java程序?实施对象的这种操作叫做对象的序列化(或者叫做持久化),重新读入内存叫 做反序列化. 基本数据类型的包装类和所有容器类都可以被序列化.用户自定义的类默认是不可以被序列化的.如果想要自己定义的类可以序列化就必须让这个类实现java.io.Serializable接口. 下面看一个Demo:

java笔记三:List接口

List承诺可以将元素维护在特定的序列中.List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和删除元素.List与 set 不同,列表通常允许重复的元素.并且存放的顺序与插入的顺序一致. List接口的常用方法有: **[add](http://www.cnblogs.com/java/util/List.html#add(E))**([E](http://www.cnblogs.com/java/util/List.html "List 中的类型参数&qu

java笔记六:线程间的协调

昨天重新学习了java多线程的使用,多线程的难点就在线程之间的协调.在<操作系统>一课中,我们学习了进程,其实多线程和多进程一样,都会涉及到多个进程或者线程对某一资源共享访问的问题,当多个线程都需要修改这个资源的时候就会出现线程安全问题. 比如说在银行开个账户会有一个存折和一张卡,如果某一天同一时间丈夫拿着存折去 柜台取钱,而妻子拿着银行卡去ATM取钱.当丈夫查询余额里面有3000元,正准备取2000元,这时候妻子也到ATM里面查询也有3000,也取 2000元.其实银行不可能让我们这么做,如

Java笔记:工厂模式

工厂模式主要是为创建对象提供接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品. 2)工厂方法模式(Factory Method):又称为多形性工厂. 3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品. GOF在<设计模式>一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模

java笔记四:Set接口

Set不保存重复的元素.Set中最常被使用的是测试归属性,你可以很容易的询问某个对象是否在某个Set中.Set具有与Collection完全一样的接口,因此没有任何额外的功能.实际上Set就是Collection,只是行为不同. 实现了Set接口的主要有HashSet.TreeSet.LinkedHashSet这几个共同点就是每个相同的项只保存一份.他们也有不同点,区别如下: 1.HashSet: HashSet使用的是相当复杂的方式来存储元素的,使用HashSet能够最快的获取集合中的元素,效