java 学习笔记

来源:互联网 发布:林珊珊淘宝店铺首页 编辑:程序博客网 时间:2024/06/01 16:40

达内 java 学习笔记 1
A JAVA 的面向对象编程 ——– 课堂笔记
面向对象主要针对面向过程。
面向过程的基本单元是函数。
什么是对象:EVERYTHING IS OBJECT (万物皆对象)
所有的事物都有两个方面:
有什么(属性) :用来描述对象。
能够做什么(方法) :告诉外界对象有那些功能。
后者以前者为基础。
大的对象的属性也可以是一个对象。
为什么要使用面向对象:
首先,面向对象符合人类看待事物的一般规律。
对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节。
方法的定义非常重要。方法有参数,也可能有 返回值。
注意区分:对象(本身) 、对象的实现者、对象的调用者。
分析对象主要从方法开始。
我们通过类来看待对象,类是对象的抽象。
其次,采用面向对象方法可以使系统各部分各司其职、各尽所能。
对象之间的耦合性一定要低(比如不同硬盘和不同主板之间的关系) 。这样才能使每个对象本身做成最
好的。
对于对象的要求:高内聚、低耦合,这样容易拼装成为一个系统。
实现高内聚就是要最大限度低提高复用性(复用性好是因为高内聚) 。
可复用性是 OOP 的基础。
比较面向过程的思想和面向对象的思想:
面向过程的思想:由过程、步骤 、函数组成,以过程为核心;
面向对象的思想:以对象为中心,先开发类,得到对象,通过对象之间相互通信实现功能。
面向过程是先有算法,后有数据结构。
面向对象是先有数据结构,然后再有算法。
在用面向对象思想开发的过程中,可以复用对象就进行复用,如无法进行复用则开发新的对象。
开发过程是用对个简单的对象的多个简单的方法,来实现复杂的功能 。
从语法上来看,一个类是一个新的数据类型。
在面向对象编程中,除了简单数据类型,就是对象类型。
定义类的格式:
class Student{
代码
}
注意类名中单词的 首字母大写。
实例变量:定义在类中但在任何方法之外。 (New 出来的均有初值)
诚信、创新、开放、合作
达内 java 学习笔记 2
局部变量:定义在方法之中的变量。
局部变量要先赋值,再进行运算,而实例变量均已经赋初值。这是局部变量和实例变量的一大区别。
实例变量的对象赋值为 null 。
局部变量不允许范围内定义两个同名变量。实例变量的作用域在本类中完全有效,当被其他的类调用的
时候也可能有效。
实例变量和局部变量允许命名冲突。
书写方法的格式:
修饰符 返回值 方法名 调用过程中 方法体
可能出现的例外
public int/void addNumber( 参数) throw Excepion {}
例:
public int addNumber(int a,int b){
}
注:方法名中的参数 int a,int b 为局部变量
类方法中的一类特殊方法:构造方法。
构造方法是当用类生成对象时,系统在生成对象的过程中利用的方法。
注意:构造方法在生成对象的时候会被调用,但并不是构造方法生成了对象。
构造方法没有返回值。格式为:public 方法名。
构造方法的方法名与类名 相同。
构造方法是在对象生成的过程中自动调用,不可能利用指令去调用。
在一个对象的生成周期中构造方法只用一次,一旦这个对象生成,那么这个构造方法失效。
用类来生成对象的语句:
Student s=new Student() 。
第一个 Student 表示这是用 Student 类进行定义。 “Student() ”表示调用一个无参数的构造方法。
如果() 中有参数,则系统构造对象的过程中调用有参的方法。
此时 S 称为一个对象变量。
Student s 的存储区域存放的是地址:一个对象在硬盘上占有一个连续地址,首地址赋予 予 s 空间。
S 称为对象 Student 的引用。
注意:在对象变量中存放的是引用(地址) ;在简单变量中存放的是数值。
可以构造多个构造方法,但多个构造方法的参数表一定不同,参数顺序不同即属于不同的构造方法:
public student(string name,int a){
}
public student(int a,string name){
}
为两个不同的构造方法。
如果我们未给系统提供一个构造方法,那么系统会自动提供一个为空的构造方法。
练习:写一个类,定义一个对象,定义两个构造方法:一个有参,一 个无参。
(编写一个程序验证对象的传递的值为地址)
注意下面这种形式:
static void changename(student stu){stu.setName “LUCY”}
注意生成新的对象与旧对象指向无关,生成新对象生命消亡与旧对象无关。
面向对象方法的重载(overloading )和覆盖(overriding ) 。
在有些 JAVA 书籍中将 overriding 称为重载,overloading 称为过载。
达内 java 学习笔记 3
Overloading 在一个类中可以定义多个同名方法,各个方法的 参数表 一定不同。但修饰词可能相 同,
返回值也可能相同。
在程序的编译过程中根据变量类型来找相应的方法。因此也有人认为 overloading 是编译时的多态,
以后我们还会学到运行时多态。
为什么会存在 overloading 技术呢?作为应对方法的细节。
利用类型的差异来影响对方法的调用。
吃()可以分为吃肉,吃菜,吃药,在一个类中可以定义多个吃方法。
构造方法也可以实现 overloading 。例:
public void teach(){};
public void teach(int a){};
public void teach(String a){} 为三种不同的方法。
Overloading 方法是从低向高转。
Byte —short —float —int —long —double 。
在构造方法中,this 表示本类的其他构造方法:
student(){};
student(string n){
this();// 表示调用 student()
}
如果调用 student(int a) 则为 this(int a) 。
特别注意 :用 this 调用其他构造方法时,this 必须为第一条语句,然后才是其他语句。
This 表示当前对象。
Public void printNum(){
Int number=40 ;
System.out.println(this.number);
}
此时打印的是实例变量,而非局部变量,即定义在类中而非方法中的变量。
This.number 表示实例变量。
谁调用 this.number 那么谁即为当前(this) 对象的 number 方法。
用 封装:使对象的属性尽可能私有,对象的方法尽可能的公开。用 private 表示此成员属性为该类的私有
属性。
Public 表示该属性(方法)公开;
Private 表示 该属性(方法)为只有本类内部可以访问(类内部可见) 。
(想用 private 还要用 set 和 和 get 方法供其他方法调用,这样可以保证对属性的访问方式统一,并且便于
维护访问权限以及属性数据合法性)
如果没有特殊情况,属性一定私有,方法该公开的公开。
如果不指明谁调用方法,则默认为 this 。
区分实例变量和局部变量时一定要写 this 。
11.29
继承:
达内 java 学习笔记 4
父类(SuperClass )和 子类(SonClass ) 。
父类的非私有化属性和方法可以默认继承到子类。
Class Son extends Father{
}
而 如果父类中的私有方法被子类调用的话,则编译报错。
父类的构造方法子类不可以继承,更不存在覆盖的问题。 (非构造方法可以)
如果子类访问父类的构造方法,则在编译的时候提示访问不到该方法。
JAVA 中不允许多继承,一个类有且只有一个父类(单继承) 。
JAVA 的数据结构为树型结构,而非网状。 (JAVA 通过接口和内部类实现多继承)
方法的覆盖(overriding )
方法的重载并不一定是在一个类中:子类可以从父类继承一个方法,也可以定义一个同名异参的方法,
也称为 overloading 。
当子类从父类继承一个无参方法, 而又定义了一个同样的无参方法, 则子类新写的方法覆盖父类的方法,
称为覆盖。 (注意返回值类型也必须相同,否则编译出错。 )
如果方法不同,则成重载。
对于方法的修饰词,子类方法要比父类的方法范围更加的宽泛。
父类为 public ,那么子类为 private 则出现错误。
之所以构造方法先运行父类再运行子类是因为构造方法是无法覆盖的。
以下范围依次由严到宽:
private :本类访问;
default :表示默认,不仅本类访问,而且是同包可见。
Protected :同包可见+ 不同包的子类可见
Public :表示 所有的地方均可见。
当构造一个对象的时候,系统先构造父类对象,再构造子类对象。
构造一个对象的顺序: (注意:构造父类对象的时候也是这几步)
①递归地构造父类对象;
②顺序地调用本类成员属性赋初值语句;
③本类的构造方法。
Super() 表示调用父类的构造方法。
Super() 也和 this 一样必须放在第一行。
This() 用于调用本类的构造方法。
如果没有定义构造方法,那么就会调用父类的无参构造方法,即 super() 。
要养成良好的编程习惯:就是要加上默认的父类无参的构造方法。
思考:可是如果我们没有定义无参的构造方法,而在程序中构造了有参的构造方法,那么如果方法中没
有参数,那么系统还会调用有参的构造方法么?应该不会。
多态:多态指的是编译时类型变化,而运行时类型不变。
多态分两种:
①编译时多态:编译时动态重载;
②运行时多态:指一个对象可以具有多个类型。
对象是客观的,人对对象的认识是主观的。
例:
达内 java 学习笔记 5
Animal a=new Dog() ;查看格式名称;
Dog d=(Dog)a 。声明父类来引用子类。
(思考上面的格式)
运行时多态的三原则: (应用时为覆盖)
1 、 对象不变; (改变的是主观认识)
2 、 对于对象的调用只 能限于编译时类型的方法,如调用运行时类型方法报错。
在上面的例子中: Animal a=new Dog() ;对象 a a 的编译时类型为 Animal ,运行时类型为 dog 。
注意:编译时类型一定要为运行时类型的父类(或者同类型) 。
对于语句: Dog d=(Dog)a 。将 d d 强制声明为 a a 类型,此时 d d 为 为 Dog() ,此时 d d 就可以调用运行时类型。
注意:a a 和 和 d d 指向同一对象。
3 、 在程序的运行时,动态类型判定。运行时调用运行时类型,即它调用覆盖后的方法。
关系运算符:instanceof
a instanceof Animal;( 这 个式子的结果是一个布尔表达式)
a 为对象变量,Animal 是类名。
上面语句是判定 a 是否可以贴 Animal 标签。如果可以贴则返回 true ,否则返回 false 。
在上面的题目中: a instanceof Animal 返回 True ,
a instanceof Dog 也返回 True ,
instanceof 用于判定是否将前面的对象变量赋值后边的类名。
Instanceof 一般用于在强制类型转换之前判定变量是否可以强制转换。
如果 Animal a=new Animal() ;
Dog d=Dog()a;
此时编译无误,但运行则会报错。
Animal a=new Dog() 相当于下面语句的功能:
Animal a=getAnimal() ;
Public static Animal.getAnimal;
Return new Dog() ;
封装、继承、多态为面向对象的三大基石(特性) 。
运行时的动态类型判定针对的是方法。运行程序访问的属性仍为编译时属性。
Overloading 针对的是编译时类型,不存在运行时的多态。
习题:建立一个 shape 类,有 circle 和 和 rect 子类 。
Shape 类有 zhouchang()和 和 area() 两种方法。
(正方形)squ 为 为 rect 子类,rect 有 有 cha() 用于比较长宽的差。
的 覆盖时考虑子类的 private 及父类的 public (考虑多态) ,之所以这样是避免调用 A 时出现实际调用 B
的情况。而出现错误。
11.29 下午讲的是教程上的 Module6
Module6-7 包括:面向对象高级、内部类、集合、反射(暂时不讲) 、例外。
面向对象高级、集合和例外都是面向对象的核心内容。
面向对象高级: 修饰符:
达内 java 学习笔记 6
static: ① 可修饰变量(属性) ; ②可修 饰方法;③可修饰代码块。
Static int data 语句说明 data 为类变量,为一个类的共享变量,属于整个类。
Int data 为实例变量。
例:
static int data;
m1.data=0;
m1.data++ 的结果为 1, 此时 m2.data 的结果也为 1 。
Static 定义的是一块为整个类共有的一块存储区域,其发生变化时访问到的数据都时经过变化的。
其变量可以通过类名去访问:类名. 变量名。与通过访问对象的编译时类型访问类变量为等价的。
Public static void printData(){}
表明此类方法为类方法(静态方法)
静态方法不需要有对象,可以使用类名调用。
静态方法中不允许访问类的非静态成员,包括成员的变量和方法,因为此时是通过类调用的,没有对象
的概念。This.data 是不可用的。
一般情况下,主方法是静态方法,所以可调用静态方法,主方法为静态方法是因为它是整个软件系统的
入口,而进入入口时系统中没有任何对象,只能使用类调用。
覆盖不适用于静态方法。
静态方法不可被覆盖。 (允许在子类中定义同名静态方法,但是没有多态,严格的讲,方法间没有多态
就不能称为覆盖)
当 当 static 修饰代码块时(注:此代码块要在此类的任何一个方法之外) ,那么这个代码块在代码被装载进
虚拟机生成对象的时候可被装载一次,以后再也不执行了。
一般静态代码块被用来初始化静态成员。
Static 通常用于 Singleton 模式开发:
Singleton 是一种设计模式,高于语法,可以保证一个类在整个系统中仅有一个对象。
11.30
final 可以修饰类、属性、方法。
当用 final 修饰类的时候,此类不可被继承,即 final 类没有子类。这样可以用 final 保证用户调用时动作
的一致性,可以防止子类覆盖情况的发生。
当利用 final 修饰一个属性(变量)的时候,此时的属性成为常量。
JAVA 利用 final 定义常量(注意在 JAVA 命名规范中常量需要全部字母都大写) :
Final int AGE=10 ;
常量的地址不可改变,但在地址中保存的值(即对象的属性)是可以改变的。
Final 可以配合 static 使用。 ?
Static final int age=10 ;
在 在 JAVA 中利用 public static final 的组合方式对常量进行标识(固定格式) 。
对于在构造方法中利用 final 进行赋值的时候,此时在构造之。 前系统设置的默认值相对于构造方法失效。
达内 java 学习笔记 7
常量(这里的常量指的是实例常量:即成员变量)赋值:
①在初始化的时候通过显式声明赋值。 Final int x=3 ;
②在构造的时候赋值。
局部变量可以随时赋值。
利用 l final 定义方法:这样的方法为一个不可覆盖的方法。
Public final void print(){} ;
为了保证方法的一致性(即不被改变) ,可将方法用 l final 定义。
如果在父类中有 l final 定义的方法,那么在子类中继承同一个方法。
如果一个方法前有修饰词 e private 或 或 static ,则 系统会自动在前面加上 final 。即 e private 和 和 static
方法默认均为 l final 方法。
注:l final 并不涉及继承,继承取决于类的修饰符是否为 private 、 default 、d protected 还是 public 。
也就是说,是否继承取决于这个方法对于子类是否可见。
Abstract( 抽象) ) 可以修饰类、方法
如果将一个类设置为 abstract ,则此类必须被继承使用。此类不可生成对象,必须被继承使用。
t Abstract 可以将子类的共性最大限度的抽取出来,放在父类中,以提高程序的简洁性。
t Abstract 虽然不 能生成对象,但是可以声明,作为编译时类型,但不能作为运行时类型。
l Final 和 和 t abstract 永远不会同时出现。
当 当 t abstract 用于修饰方法时,此时该方法为抽象方法,此时方法不需要实现,实现留给子类覆盖,子
类覆盖该方法之后方法才能够生效。
注意比较:
private void print(){} ;此语句表示方法的空实现。
Abstract void print() ; 此语句表示方法的抽象,无实现。
如果一个类中有一个抽象方法,那么这个类一定为一个抽象类。
反之,如果一个类为抽象类,那么其中可能有非 抽象的方法。
如果让一个非抽象类继承一个含抽象方法的抽象类,则编译时会发生错误。因为当一个非抽象类继承一
个抽象方法的时候,本着只有一个类中有一个抽象方法,那么这个类必须为抽象类的原则。这个类必须
为抽象类,这与此类为非抽象冲突,所以报错。
所以子类的方法必须覆盖父类的抽象方法。方法才能够起作用。
只有将理论被熟练运用在实际的程序设计的过程中之后,才能说理论被完全掌握!
为了实现多态, 那么父类必须有定义。 而父类并不实现, 留给子类去实现。 此时可将父类定义成 abstract
类。如果没有定义抽象的父类,那么编译会 出现错误。
Abstract 和 和 static 不能放在一起,否则便会出现错误。 (这是因为 static 不可被覆盖,而 abstract 为了生
效必须被覆盖。 )
例: (本例已存在\CODING\abstract\TestClass.java 文件中)
public class TestClass{
public static void main(String[] args){
达内 java 学习笔记 8
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{
}
public interface :公开接口
与类相似,一个文件只能有一个 public 接口,且与文件名相同。
在一个文件中不可同时定义一个 public 接口和一个 public 类。
一个接口中,所有方法为公开、抽象方法;所有的属性都是公开、静态、常量。
一个类实现一个接口的格式:
class IAImple implements 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();
达内 java 学习笔记 9
I instance of IAImple;
I instance of A;
I instance of IA;
I instance of IB;
返回的结果均为 true.
接口和多态都为 A JAVA 技术的核心。
接口往往被我们定义成一类 X XX 的东西。
接口实际上是定义一个规范、标准。
①通过接 口可以实现不同层次、不同体系对象的共同属性;
通过接口实现 write once as anywhere.
以 以 A JAVA 数据库连接为例子:C JDBC 制定标准;数据厂商实现标准;用户使用标准。
接口通常用来屏蔽底层的差异。
②接口也因为上述原因被用来保持架构的稳定性。
JAVA 中有一个特殊的类: Object 。它是 JAVA 体系中所有类的父类(直接父类或者间接父类) 。
此类中的方法可以使所的类均继承。
以下介绍的三种方法属于 Object:
(1) finalize 方法:当一个对象被垃圾回收的时候调用的方法。
(2) toString(): 是利用字符串来表示对象。
当我们直接打印定义的对象的时候,隐含的是打印 toString() 的返回值。
可以通过子类作为一个 toString() 来覆盖父类的 toString() 。
以取得我们想得到的表现形式,即当我们想利用一个自定义的方式描述对象的时候,我们应该覆盖
toString() 。
(3)equal
首先试比较下例:
String A=new String(“hello”);
String A=new String(“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 为相同。
String a=”hello”;
System.out.println(a==”hello”);
系统的返回值为 true 。
故如果要比较两个字符串是否相同(而不是他们的地址是否相同) 。可以对 a 调用 equal:
System.out.println(a.equal(b));
达内 java 学习笔记 10
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 boolean equals(Object o){
student s=(student)o;
if (s.name.equals(this.name)&&s.age==this.age)
else return false;
} 如果 equals() 返回的值为
以下为实现标准 equals 的流程:
public boolean equals(Object o){
if (this==o) return trun; // 此时两者相同
if (o==null) return false;
if (! o instanceof strudent) return false; // 不同类
studeng s=(student)o; // 强制转换
if (s.name.equals(this.name)&&s.age==this.age) return true;
else return false;
}
以上过程为实现 equals 的标准过程。
练习:建立一个 employee 类,有 String name,int id,double salary. 运用 get 和 和 set 方法,使用 toString ,
使用 equals 。
封装类:
JAVA 为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被 Object 来装载。
除了 int 和 和 char ,其余类型首字母大写即成封装类。
转换字符的 方式:
int I=10;
String s=I+” ”;
String s1=String.valueOf(i);
Int I=10;
Interger I_class=new integer(I);
看 看 javadoc 的帮助文档。
附加内容:
“== ”在任何时候都是比较地址,这种比较永远不会被覆盖。
达内 java 学习笔记 11
程序员自己编写的类和 JDK 类是一种合作关系。 (因为多态的存在,可能存在我们调用 JDK 类的情况,
也可能存在 JDK 自动调用我们的类的情况。 )
注意:类型转换中 double\interger\string 之间的转换最多。
12.01
内部类:
(注:所有使用内部类的地方都可以不用内部类,使用内部类可以使程序更加的简洁,便于命名规范和
划分层次结构) 。
内部类是指在一个外部类的内部再定义一个类。
内部类作为外部类的一个成员,并且依附于外部类而存在的。
内部类可为静态,可用 PROTECTED 和 和 PRIVATE 修饰。 (而外部类不可以:外部类只能使用 PUBLIC
和 和 DEFAULT ) 。
内部类的分类:
成员内部类、
局部内部类、
静态内部类、
匿名内部类(图形是要用到,必须掌握) 。
①成员内部类:作为外部类的一个成员存在 ,与外部类的属性、方法并列。
内部类和外部类的实例变量可以共存。
在内部类中访问实例变量:this. 属性
在内部类访问外部类的实例变量:外部类名.this. 属性。
成员内部类的优点:
⑴ 内部类作为外部类的成员,可以访问外部类的私有成员或属性。 (即使将外部类声明为 PRIVATE ,但
是对于处于其内部的内部类还是可见的。 )
⑵的 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的 private 还要小的访
问权限。
注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。
为 对于一个名为 outer 为 的外部类和其内部定义的名为 inner 现 的内部类。编译完成后出现 outer.class 和
outerinner.classTestOuter.javaclass.访使out.inner.使inners=newinner();innernewOuter.Innerin=Outer.new.Inner()Outer.Innerin=newOuter.Inner()Outerprivate访java12publicprivate访访final使static访newOuter.Innerin=newOuter.Inner()使privatePeoplerun();Machinerun();robotclassRobotextendsPeopleimplementMachine.run()使IAIAI=newIA();new使Out1.class 。
如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。
因匿名内部类无构造方法,所以其使用范围非常的有限。
(下午: )Exception (例外/ 异常) (教程上的 MODEL7 )
对于程序可能出现的错误应该做出预案。
例外是程序中所有出乎意料的结果。 (关系到系统的健壮性)
JAVA 会将所有的错误封装成为一个对象,其根本父类为 Throwable 。
Throwable 有两个子类:Error 和 和 Exception 。
达内 java 学习笔记 13
一个 Error 对象表示一个程序错误,指的是底层的、低级的、不可恢复的严重错误。此时程序一定会退
出,因为已经失去了运行所必须的物理环境。
对于 Error 错误我们无法进行处理,因为我们是通过程序来应对错误,可是程序已经退出了。
我们可以处理的 Throwable 对象中只有 Exception 对象(例外/ 异常) 。
Exception 有两个子类:Runtime exception (未检查异常)
非 非 Runtime exception (已检查异常)
(注意:无论是未检查异常还是已检查异常在编译的时候都不会被发现,在编译的过程中检查的是程序
的语法错误, 而异常是一个运行时程序出错的概念。 )
在 在 Exception 中,所有的非未检查异常都是已检查异常,没有另外的异常! !
未检查异常是因为程序员没有进行必要的检查,因为他的疏忽和错误而引起的异常。一定是属于虚拟机
内部的异常(比如空指针) 。
应对未检查异常就是养成良好的检查习惯。
已检查异常是不可避免的,对于已检查异常必须实现定义好应对的方法。
已检查异常肯定跨越出了虚拟机的范围。 (比如“未找到文件” )
如何处理已检查异常(对于所有的已检查异常都要进行处理) :
首先了解异常形成的机制:
当一个方法中有一条语句会 出现了异常,它就会 throw(抛出)一个例外对象,然后后面的语句不会执行
返回上一级方法,其上一级方法接受到了例外对象之后,有可能对这个异常进行处理,也可能将这个异
常转到它的上一级。
对于接收到的已检查异常有两种处理方式:throws 和 和 try 方法。
注意:出错的方法有可能是 JDK ,也可能是程序员写的程序,无论谁写的,抛出一定用 throw 。
例:public void print() throws Exception.
对于方法 a ,如果它定义了 throws Exception 。那么当它调用的方法 b 返回异常 对象时,方法 a 并不处
理,而将这个异常对象向上一级返回,如果所有的方法均不进行处理,返回到主方法,程序中止。 (要
避免所有的方法都返回的使用方法,因为这样出现一个很小的异常就会令程序中止) 。
如果在方法的程序中有一行 throw new Exception(),返回错误,那么其后的程序不执行。因为错误返回
后,后面的程序肯定没有机会执行,那么 JAVA 认为以后的程序没有存在的必要。
对于 try „„catch 格式:
try { 可能出现错误的代码块} catch(exception e){ 进行处理的代码} ;
对象变量的声明
用这种方法,如果代码正确,那么程序不经过 catch 语句直接向下运行;
和 如果代码不正确,则将返回的异常对象和 e 进行匹配,如果匹配成功,则处理其后面的异常处理代码。
(如果用 exception 来声明 e 的话,因为 exception 为所有 exception 对象的父类,所有肯定匹配成功) 。
处理完代码后这个例外就完全处理完毕,程序会接着从出现异常的地方向下执行(是从出现异常的地方
还是在 catch 后面呢?利用程序进行验证) 。最后程序正常退出。
Try 中如果发现错误,即跳出 try 去匹配 catch ,那么 try 后面的语句就不会被执行。
一个 try 可以跟进多个 catch 语句,用于处理不同情况。当一个 try 只能匹配一个 catch 。
我们可以写多个 catch 语句,但是不能将父类型的 exception 的位置写在子类型的 excepiton 之前,因为
这样父类型肯定先于子类型被匹配,所有子类型就成为废话。JAVA 编译出错。
达内 java 学习笔记 14
在 在 try ,catch 后还可以再跟一子句 finally 。其中的代码语句无论如何都会被执行(因为 finally 子句的这
个特性,所以一般将释放资 源,关闭连接的语句写在里面) 。
如果在程序中书写了检查(抛出)exception 但是没有对这个可能出现的检查结果进行处理,那么程序就
会报错。
而如果只有处理情况(try )而没有相应的 catch 子句,则编译还是通不过。
如何知道在编写的程序中会出现例外呢
1 . 调用方法,查看 API 中查看方法中是否有已检查错误。
2 . 在编译的过程中看提示信息,然后加上相应的处理。
Exception 有一个 message 属性。在使用 catch 的时候可以调用:
Catch(IOException e){System.out.println(e.message())};
Catch(IOException e){e.printStackTrace()};
上面这条语句回告诉我们出错类型所历经的过程,在调试的中非常有用。
开发中的两个道理:
①如何控制 y try 的范围:根据操作的连动性和相关性,如果前面的程序代码块抛出的错误影响了后面程
序代码的运行,那么这个我们就说这两个程序代码存在关联,应该放在同一个 y try 中。
②对已经查出来的例外,有 throw( 积极) )和 和 try catch (消极)两种处理方法。
对于 h try catch 放在能够很好地处理例外的位置(即放在具备对例外进行处理的能力的位置) 。如果没
有处理能力就继续上抛。
当我们自己定义一个例外类的时候必须使其继承 n excepiton 或者 RuntimeException 。
w Throw 是一个语句,用来做抛出例外的功能。
而 而 s throws 是表示如果下级方法中如果有例外抛出,那么本方法不做处理,继续向上抛出。
s Throws 后跟的是例外类型。
断言是一种调试工具( assert )
其后跟的是布尔类型的表达式,如果表达式结果为真不影响程序运行。如果为假系统出现低级错误,在
屏幕上出现 t assert 信息。
t Assert 只是 用于调试。在产品编译完成后上线 t assert 代码就被删除了。
方法的覆盖中,如果子类的方法抛出的例外是父类方法抛出的例外的父类型,那么编译就会出错:子类
无法覆盖父类。
结论:子类方法不可比父类方法抛出更多的例外。子类抛出的例外或者与父类抛出的例外一致,或者是
父类抛出例外的子类型。或者子类型不抛出例外。
如果父类型无 throws 时,子类型也不允许出现 throws 。此时只能使用 try catch 。
练习:写一个方法:int add(int a,int b)
{
return a+b ;
}
当 当 a+b=100; 抛出 100 为异常处理。
12.02
集合(从本部分开始涉及 API )
集合是指一个对象容纳了多个对象,这个集合对象主要用来管理维护一系列相似的对象。
。 数组就是一种对象。 (练习:如何编写一个数组程序,并进行遍历。 )
java.util.* 定义了一系列的接口和类,告诉我们用什么类 NEW 。 出一个对象,可以进行超越数组的操作。
达内 java 学习笔记 15
(注:JAVA1.5 对 对 JAVA1.4 的最大改进就是增加了对范型的支持)
集合框架接口的分类: (分 collection 接口 和 map 接口)
Collection 接口 Map 接口
List 接口 Set 接口 SortedMap 接口
SortedSet 接口
JAVA 中所有与集合有关的实现类都是这六个接口的实现类。
Collection 接口:集合中每一个元素为一个对象,这个接口将这些对象组织在一起,形成一维结构。
List 接口代表按照元素一定的相关顺序来组织(在这个序列中顺序是主要的) ,List 。 接口中数据可重复。
Set 接口是数学中集合的概念:其元素无序,且不可重复。 (正好与 List 对应)
SortedSet 会按照数字将元素排列,为“可排序集合” 。
Map 接口中每一个元素不是一个对象,而是一个键对象和值对象组成的键值对(Key-Value ) 。
Key-Value 是用一个不可重复的 key 集合对应可重复的 value 集合。 (典型的例子是字典: 通过页码的 key
值找字的 value 值) 。
例子:
key1 —value1;
key2 —value2;
key3 —value3.
SortedMap :如果一个 Map 可以根据 key 值排序,则称其为 SortedMap 。 (如字典)
!! 注意数组和集合的区别:数组中只能存简单数据类型。Collection 接口和 Map 接口只能存对象。
以下介绍接口:
List 接口: (介绍其下的两个实现类:ArrayList 和 和 LinkedList )
ArrayList 和数组非常类似,其底层 ① 也用数组组织数据,ArrayList 是动态可变数组。
①底层:指存储格式。说明 ArrayList 对象都是存在于数组中。
注:数组和集合都是从下标 0 开始。
ArrayList 有一个 add(Object o) 方法用于插入数组。
ArrayList 的使用: (完成这个程序)
先 先 import java.util.* ;
用 用 ArrayList 在一个数组中添加数据,并遍历。
ArrayList 中数组的顺序与添加顺序一致。
只有 List 可用 get 和 和 size 。而 Set 则不可用(因其无序) 。
Collection 接口都是通过 Iterator() (即迭代器)来对 Set 和 和 List 遍历。
: 通过语句: Iterator it=c.iterator(); 得到一个迭代器, 将集合中所有元素顺序排列。 然后可以通过 interator
方法进行遍历,迭代器有一个游标 (指针)指向首位置。
Interator 有 有 hasNext() ,用于判断元素右边是否还有数据,返回 True 说明有。然后就可以调用 next 动
作。Next()会将游标移到下一个元素,并把它所跨过的元素返回。 (这样就可以对元素进行遍历)
练习:写一个程序,输入对象信息,比较基本信息。
集合中每一个元素都有对象,如有字符串要经过强制类型转换。
Collections 是工具类,所有方法均为有用方法,且方法为 static 。
有 有 Sort 方法用于给 List 排序。
达内 java 学习笔记 16
Collections.Sort() 分为两部分,一部分为排序规 则;一部分为排序算法。
规则用来判断对象;算法是考虑如何排序。
对于自定义对象,Sort 不知道规则,所以无法比较。这种情况下一定要定义排序规则。方式有两种:
①g java.lang 下面有一个接口: Comparable (可比较的)
可以让自定义对象实现一个接口,这个接口只有一个方法 comparableTo(Object o)
其规则是当前对象与 o o 对象进行比较,其返回一个 t int 值,系统根据此值来进行排序。
如 当前对象o >o 对象,则返回值 >0 ; (可将返回值定义为 1 1 )
如 当前对象o =o 对象,则返回值 =0 ;
如 当前对象<

0 0
原创粉丝点击