java学习笔记 第二篇 核心技术

第十章 接口、继承与多态

10.1 类的继承(extends关键字)

1.继承的基本思想是基于某个父类的扩展,制定出一个新的子类,子类可以继承父类原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者直接重写父类中的某些方法。
2.可以在子类的构造方法中使用super()语句调用父类的构造方法,也可以在子类中使用super关键字调用父类的成员方法,但子类没有权限调用父类中被修饰为private的方法。

重写方法

3.继承也可以重写(也称覆盖)父类的成员方法。重写就是在子类中将父类的成员方法的名字保留,重写成员方法的实现内容,更改成员方法的存储权限,或修改成员方法的返回值类型。

3.重构(一种特殊的重写方式),子类与父类的成员方法返回值、方法名称、参数类型及个数完全相同,唯一不同的是方法实现内容。

4.重写父类方法时,修改方法的权限只能从小的范围到大的范围改变。

5.子类重写父类可以修改方法的返回值类型,但重写的返回值类型必须是父类中同一方法返回值类型的子类。

6.当实例化子类对象是,父类对象也相应被实例化。换句话说,在实例化子类对象时,java编译器会在子类的构造方法中自动调用父类的无参构造方法。

7.实例化子类对象时,父类的无参构造方法被自动调用,但有参构造方法并不能被自动调用,只能依赖于super关键字显式地调用父类的构造方法。

10.2 Object类

在java中,所有的类都直接或间接继承了java.lang.Object类,它是所有类的子类,是java类层中的最高层类。

1. getaClass()方法

它会返回对象执行时的Class实例,然后可使用getName()方法获取类的名字。

语法: getClass().getName();

2. toString()方法

将一个对象返回为字符串形式,它会返回一个String实例。实际应用中通常重写toString()方法,为对象提供一个特定的输出模式。

3. equals()方法

equals()方法的默认实现是使用“==”运算符比较两个对象的引用地址,而不是对象的内容,所以想真正比较两个对象内容,需要在自定义类中重写equals()方法。

10.3 对象类型的转换

1. 向上转型

就是将子类转型成父类,通过父类型引用指向子类型对象来实现动态调用。一个具体类到较抽象类之间的转换。 语句:Shape s = new Circle();

2.向下转型

将抽象类转换为较具体类。向上转型是自动进行的,但是向下转型却不是,需要我们强制进行类型转换。这种方式称为显式类型转换。

B b = new B();

A a = b;

B bb = (B)a; //进行强制类型转换,也就是向下转型

3.分析

记住一个简单而又复杂的规则,一个类型引用只能引用引用类型自身含有的方法和变量,你可能说这个规则不对,因为父类引用指向子类对象时,最后执行的是子类的方法。其实这并不矛盾,那是因为采用了后期绑定(多态),运行时编译器又根据引用指向的实际类型去调用了子类的方法,而假若子类的这个方法在父类中并没有定义,则编译会出错。 当你使用父类引用指向子类对象的时候,其实jvm(java virtual machine)已经使用了编译器产生的类型信息调整转换了。这里你可以这样理解,相当于把不是父类中含有的方法从虚拟函数表中设置为不可见的,注意有可能虚拟函数表中有些函数地址由于在子类中已经被改写了,所以对象虚拟函数表中虚拟函数项目地址已经被设置为子类中完成的方法体的地址了。

10.4 instanceof判断对象类型

当程序执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生ClassCastException异常,所以在执行向下转型前需要判断父类对象是否为子类对象的实例。 这个判断通常使用instanceof操作符来完成。它可判断一个类实现了某个接口,也可以用来判断一个实例对象是否属于一个类。 语法: myobject instanceof ExampleClass//myobject某类对象引用;ExampleClass某个类

10.5 方法的重载

方法重载:让方法名相同而形参不同的构造方法同时存在。同样也可以应用到非构造方法中。 class MethodOverloading {
void receive(int i) {
} void receive(float f) { } void receive(int i,int j) { } } 重载中可以使两个方法返回值不同,但只有返回值不同并不可以区分两个方法重载,需要通过参数的个数以及参数类型来设置。

1. 不定长参数方法

语法: 返回值 方法名(参数数据类型···参数名称) 使用“···”形式定义不定长参数,编译器会将(int···a)这种形式看做是(int[]a),所以在add()方法体做累加操作时使用到for循环语句,循环中根据数组a的长度作为循环条件。 public static int add(int...a){
int s=0;
for(int i=0;i s+=a[i];
return s;
} public static void main(String args[]){
System.out.println("调用不定长参数方法:"+add(1,2,3,4,5,6,7,8,9));
}

10.6 多 态

多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

10.7 抽象类与接口

10.7.1 抽象类(abstract关键字)

public abstract class Test{//定义抽象类 abstract void testAbstract();//定义抽象方法 } 1.抽象方法没有方法体,抽象类除了被继承外没有其它意义。 2.只要类中有一个抽象方法,此类就被标记为抽象类。 3.抽象类被继承后需要实现其中所有的抽象方法。

10.7.2 接口

接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中的所有方法没有方法体。 1.定义接口(interface关键字): public interface drawTest{ void draw();//接口内的方法,省略abstract关键字 } 2.实现接口(implements关键字): public class Parallelogram extends Quadrangle implements drawTest{ ``` } 3.接口中定义的方法必须被定义为public或abstract形式。 4.在接口中定义的任何字段都自动是static和final的。

接口与继承

java中不允许多个多重继承,但可以同时实现多个接口。 语法: class 类名 implements 接口 1,接口 2,···,接口 n

第十一章 类的高级特性

11.1 Java类包

1.Java中每个接口或类都来自不同的类包。 2.一个完整的类名需要包名与类名的结合。如:java.util.Data 3.同一个包中的类相互访问,可以不用指定包名。

11.1.1创建类包

类中定义包名的语法: package 包名 需将package表达式放置在程序第一行。当使用package关键字为类指定包名之后,包名将会成为类名的一部分,说明该类必须指定全名。 java包命名全部使用小写字母。

11.1.2 导入类包(import关键字)

1.使用import关键字导入包 语法: import com.lzw.*;//指定com.lzw包中的所有类在程序中可以使用 import com.lzw.Math;//指定com.lzw包中的Math类在程序中可以使用 2.使用import导入静态成员 语法: improt static 静态成员

11.2 final变量

1.final关键字用于变量声明,一但该变量被设定,就不可以再改变该变量的值。 语句: final double PI= 3.14; 2.final除了可以修饰基本数据类型的常量外,还可以修饰对象引用。 3.被定义为final的常量需要定义时使用大写字母命名,并且中间需要使用下划线进行连接。 4.被定义为final的对象引用只能指向唯一一个对象,不可以将它指向其他对象,但是一个对象本身的值却是可以改变的。通过将常量声明为static final,可使常量真正做到不可改变。 5.在Java中定义全局常量,通常使用public static final修饰。 6.将方法的参数定义为final类型,这预示着无法在方法中更改参数引用所指向的对象。

11.3 final方法

1.方法定义为final类型可以防止任何子类修改该类的定义与实现方式,且效率要高于非final方法。 2.设置为private修饰符的方法子类无法访问,所以定义为private的方法隐式被定义为final类型,无需将private的方法再定义为final类型。

11.4 final类

定义为final的类不能被继承,语法: final 类名{} 如果将某个类设置为final形式,则类中所有方法都被隐式设置为final形式,但final类中的成员变量可以被定义为final或非final形式。

11.5 内部类

在类中再定义一个类,则将在类中再定义的那个类称为内部类。

11.5.1 成员内部类

1.一个类中使用内部类可以在内部类中直接存取其所在类的私有成员。可以随意使用外部类的成员方法和成员变量。 2.内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。 3.外部类不可以直接访问内部类成员变量,内部类实例化操作必须在外部类或外部类的非静态方法中实现。 OuterClass out=new OuterClass(); OuterClass.innerClass in=out.doit();
OuterClass.innerClass in2=out.new innerClass();

2.内部类向上转型为接口

1.如果将一个权限修饰符为private的内部类向上转型为其父类对象,或者直接向上转型为一个接口,在程序中就可以完全隐藏内部类的具体实现过程。仅留下一个接口和一个外部类,这是内部类最基本的用途。

?2.非内部类不能被声明为private或protected访问类型:

对于个方法而言,他的上层是类,再上层是包,所以方法有由类继承得到的权限,由包"继承"得到的权限,和公共权限 而对于类而言,他的上层就是包,所以一个类只有"继承"自包的权限和公共的访问权限,并没有子类继承的概念 一个类要是有权限继承另一个类,那么要么他们同包要么那个类是public的,不然就已经没有机会访问了,更别提继承了,所以protected当中的子类部分是没有意义的,而剩下的同包,只需要默认权限就可以,所以用protected是多余的

3.使用this关键字获取内部类与外部类的引用

如果在内部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字。

public class TheSameName { private int x; private class Inner{ private int x=9; public void doit(int x){ x++; //调用形参x this.x++; //调用内部类变量x TheSameName.this.x++; //调用外部类变量x } } }

内部类对象与外部类对象在内存中的分布情况:
java学习笔记 第二篇 核心技术

11.5.2 局部内部类

可在类的方法中或任意的作用域中定义内部类。

!方法中定义的内部类只能访问final类型的局部变量

因为java中规定,内部类只能访问外部类中的成员变量,不能访问方法中定义的变量,如果要访问方法中的变量,就要把方法中的变量声明为final(常量)的,因为这样可以使变量全局化,就相当于是在外部定义的而不是在方法里定义的

11.5.3 匿名类

return new A(){ ```//内部类体 }; 匿名内部类编译后,会产生以“外部类名$序号”为名称的.class文件。

在使用匿名内部类时,要记住以下几个原则:
 ·匿名内部类不能有构造方法。
 ·匿名内部类不能定义任何静态成员、方法和类。
 ·匿名内部类不能是public,protected,private,static。
 ·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
 ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

·内部类只能访问外部类的静态变量或静态方法。

package hqs; interface pr{ void show(); } public class AdvancedPractice { //2.在类中通过返回值为pr的方法中创建一个匿名内部类 public pr doit(){ return new pr(){ @Override public void show() { // TODO 自动生成的方法存根 System.out.println("匿名内部类2"); } }; } public static void main(String[] args) { // TODO 自动生成的方法存根 System.out.println("主函数"); //1.直接在主函数中创建匿名内部类 new pr(){ public void show(){ System.out.println("匿名内部类"); } }.show(); //2.实例化外部类,并通过doit()方法得到匿名内部类 AdvancedPractice ap = new AdvancedPractice(); pr pr1 = ap.doit(); pr1.show(); } }

11.5.4 静态内部类

内部类前添加static,特点: 1.如果创建静态内部类的对象,不需要其外部类的对象 2.不能从静态内部类的对象中访问非静态静态外部类的对象。 3.非静态内部类不可以声明静态成员。

11.5.5 内部类的继承

public class OutputInnerClass entends ClassA.ClassB{//继承内部类b public OutputInnerClass(ClassA a){ a.super(); } } class ClassA{ class ClassB{ } }

第十二章 异常处理

12.1 异常概述

1.异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。
2.Java语言的异常捕获结构由try、catch和finally3部分组成。 语法:

try{ //程序代码块 } catch(Exceptiontype1 e){ //对Exceptiontype1的处理 } catch(Exceptiontype2 e){ //对Exceptiontype2的处理 } ··· finally{ //程序块 }

12.2 Java常见异常

java学习笔记 第二篇 核心技术

12.3 自定义异常

用户自定义异常,只需要继承Exception类。 步骤: 1.创建自定义异常类 2.在方法中通过throw关键字抛出异常对象 3.可通过try-catch语句捕获并处理,或在方法的声明处通过throws指明要抛出给方法调用者的异常 4.捕获并处理

12.4 在方法中抛出异常

1.throws关键字

通常应用在声明方法,用来指定方法可能抛出的异常。多个异常用逗号隔开。

2.throw关键字

通常用于方法体中,并抛出一个异常对象。程序执行到throw语句时立即终止。

12.5 运行时异常

RuntimeException异常是在程序运行过程中产生的。

异常类结构:

java学习笔记 第二篇 核心技术

适配器模式
java学习笔记 第二篇 核心技术
Handler的介绍和使用
java学习笔记 第二篇 核心技术
struts2上传文件
java学习笔记 第二篇 核心技术
通过JFreeChart的饼状

分类:默认分类 时间:2012-01-07 人气:4
本文关键词:
分享到:

相关文章

  • JAVA程序求职必看-125条常见的java面试笔试题汇总 2012-01-01

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,

  • 混血儿新生命--Java+PHP整合 2012-01-01

    最近才有时间处理此事,将此设想应用到现实应用程序中。 下面从两个方面讲解如何开发与发布。 示例:讲解java+php 开发模式,以菜单管理为例。 示例如下: 一:java 结构代码 java开发结构图如下: java 程序代码请看在下面上传文件,由于上传文件不能大于2M,所以用到的lib 没有上传,如需求,可留邮箱给我,我发给大家。 注:PHP和Java各有其语言内部定义的数据类型,当PHP数据传送到Java,或Java数据传送到PHP时,LAJP在内部自动地、准确地对他们进行转换,程序员无需进

  • java之jvm学习笔记(策略和保护域) 2012-01-02

    前面一节,我们做了一个简单的实验,来说明什么是策略文件,在文章的最后,也顺带的讲了一下什么是策略,还有策略的作用。 为了引出另外一个很重要的概念ProtectionDomain(保护域),所以我们还是要先来回顾一下什么是策略。 首先,什么是策略,今天的东西纯粹是比较概念的。当然,如果你读过笔记九,今天的东西,就真的是soso 策略与策略文件: java对应用程序的访问控制策略是由抽象类java.security.Policy的一个子类的单例所表示,任何时候,每个应用程序实际上只有一个Policy

  • java 线程 新类库中的构件 CyclicBarrier使用 2012-01-05

    package org.rui.thread.newc; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; impor

  • Java 学习笔记:深入Serializable 2012-01-07

    Java的Serializable Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。 说白了,Java都是通过对象来描述实体,而对象是不能再网络上传递的,如果将对象生成一种可以解析的"一连串的字节描述"

  • java流--考验你的想象力 2012-01-07

    在学习java的学习中,我们会接触到一个概念,就是“流”,大概分为输入输出流,在我们的想象中,流,是水,是动态的,但是让我们在只有0和1的电脑上想象水流,这是个抽象的概念,今天,我们一起随着我的文字,梳理一下这些流! 首先,我们要知道电脑硬件的一点知识,我电脑上对数据的存储有三种方式,外界存储,内存,缓存。比如电脑上的硬盘,光盘,U盘等都是外存,咱们平常说的内存条就是内存,缓存是直接在CPU里的。我们就将这几个东西理解为容器,外存就像是门口的河,内存就是咱们家的水桶,缓存咱们自己的水杯,而水呢?

  • 如何为Mac更新Java? 2012-01-07

      每次启动 Java 小应用程序、Java Web Start 应用程序或 Java 控制面板时,系统将首先启动程序,然后在后台 (因此不会影响 Java 应用程序的性能) 确定在过去 7 天内是否检查过 Java 更新,小编根据自己的经验为大家提供一篇java mac版更新教程。   在 Java 控制面板中更新 Java   1、单击位于 System Preferences(系统首选项)下的 Java 图标来启动 Java Control Panel(Java 控制面板)。   2、转到

  • Ubuntu 14.04安装java的方法以Ubuntu14.04为例 2012-01-08

      因为Linux软件的安装都需要使用到命令,很多人在安装java的时候遇到了不少问题,下面小编以Ubuntu14.04为例,给大家详细介绍下java的安装,一起来学习下吧。   JRE vs OpenJDK vs Oracle JDK   在我们继续了解如何安装Java之前,让我们快速地了解JRE、OpenJDK和Oracle JDK之间的不同之处。   JRE(Java Runtime Environment),它是你运行一个基于Java语言应用程序的所正常需要的环境。如果你不是一个程序员的

  • mysql orcale数据类型跟java对照 2012-01-08

    oracle 中Number 分为两种 1.Number 2.Number(10,2) 第一种对应的是java中的整形 int long short byte 而第二种对应java中的 浮点型 float double oracle中的的date 对应java中的 java.util.date java.sql.date 是都可以的 但通常应用java.util.date 因为它的作用范畴大于java。sql。date number要根据oracle数据库定义类型的细节来决定 如果是number

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.072 (s). 10 q(s)