1.1接口概念 类:具有相同属性和功能的事物集合
接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”。
接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计。
请记住:一切事物均有功能,即一切事物均有接口。
与定义类的class不同,接口定义时需要使用interface关键字。
定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件。这点可以让我们将接口看做是一种只包含了功能声明的特殊类。
使用interface代替了原来的class,其他步骤与定义类相同:
接口中的方法均为公共访问的抽象方法 接口中无法定义普通的成员变量
类与接口的关系为实现关系,即类实现接口。实现的动作类似继承,只是关键字不同,实现使用implements。
其他类(实现类)实现接口后,就相当于声明:”我应该具备这个接口中的功能”。实现类仍然需要重写方法以实现具体的功能。
在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑。
接口中定义功能,当需要具有该功能时,可以让类实现该接口,只声明了应该具备该方法,是功能的声明。 在具体实现类中重写方法,实现功能,是方法的具体实现。 于是,通过以上两个动作将功能的声明与实现便分开了。(此时请重新思考:类是现实事物的描述,接口是功能的集合。)
1.4接口中成员的特点
1、接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量,其值不能改变。后面我们会讲解static与final关键字
2、接口中可以定义方法,方法也有固定的修饰符,public abstract
3、接口不可以创建对象。
4、子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类。
1.5接口特点
接口可以继承接口 如同类继承类后便拥有了父类的成员,可以使用父类的非私有成员。A接口继承B接口后,A接口便拥有了A、B两个接口中所有的抽象方法。 Java支持一个类同时实现多个接口,或一个接口同时继承多个接口。 类可以在继承一个类的同时,实现多个接口。 接口与父类的功能可以重复,均代表要具备某种功能,并不冲突。
3、通过上面的例子总结接口和抽象类的区别: 相同点: 都位于继承的顶端,用于被其他类实现或继承; 都不能直接实例化对象; 都包含抽象方法,其子类都必须覆写这些抽象方法; 区别: 抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性; 接口只能包含抽象方法; 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
抽象类为继承体系中的共性内容,接口为继承体系外的扩展功能
二者的选用: 优先选用接口,尽量少用抽象类; 需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;
包的特点: A:可以有多层 B:不同包下的文件名可以
C:包的声明必须是第一行代码
不同包之间的互相访问 1.使用类的全名
2.使用关键字import 将类导入
注意:*代表得是通配符,代表导入了这个包所有的类,并没有导入子包下的类
相同包下的类可以直接访问,不需要做其他的操作
类的全名:包名.类名
权限修饰符: public 当前类,相同包下不同的类,不同包下的类 default 当前类,相同包下不同的类, private 当前类 protected 当前类,相同包下不同的类
default : 当前包下使用
protected:让子类对象使用
在Java中提供了四种访问权限,使用不同的访问权限时,被修饰的内容会有不同的访问权限,以下表来说明不同权限的访问能力:
public protected default private
同一类中 √ √ √ √
同一包中(子类与无关类) √ √ √
不同包的子类 √ √
不同包中的无关类 √
归纳一下:在日常开发过程中,编写的类、方法、成员变量的访问 A:要想仅能在本类中访问使用private修饰 B:要想本包中的类都可以访问除了private修饰符,其它都可以 C:要想本包中的类与其他包中的子类可以访问使用protected修饰 D:要想所有包中的所有类都可以访问使用public修饰。 注意:如果类用public修饰,则类名必须与文件名相同。一个文件中只能有一个public修饰的类。
成员内部类:
成员内部类的修饰符:
局部内部类:
Object : equals , toString
Object类中的equals:
编译期异常抛出,将来调用者必须处理。 运行期异常抛出,将来调用可以不用处理。
javac出来的异常就是编译时异常,就是说把源代码编译成字节码(class)文件时报的异常,一般如果用Eclispe,你敲完代码保存的时候就是编译的时候。
Java出来的异常就是运行时异常
/自定义异常固定的套路 //1.必须继承Exception或者RuntimeException //2.写两个构造,一个空参,一个带有异常信息的String类型参数 //throw new NoSuchAgeException(“年龄不合法的异常”);
能够辨别程序中异常(Exception)和错误(Error)的区别
当定义一个Animal类时,我们发现我们并没有写成员方法,但是能调用,这是因为它继承了Object类. Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。所有类在 创建对象的时候,最终找的父类就是Object。
equals方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较。Object类 中的equals方法内部使用的就是==比较运算符。
注意:在复写Object中的equals方法时,一定要注意public boolean equals(Object obj)的参数是Object类型 ,在调用对象的属性时,一定要进行类型转换,在转换之前必须进行类型判断。 友情提示:需要重写的时候可以利用eclipse提供的快捷键直接生成 alt+shift + s + h
1.toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。 2.在我们直接使用输出语句输出对象名的时候,其实通过该对象调用了其toString()方法. 但是toString返回值的地址 对我们来说没有实际价值的 3.由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的 字符串表现形式,因此也需要重写它。alt+shift + s + s
根类Throwable(异常): Error(错误类):程序很严重的问题,无法处理的异常,如果出现了,改代码. Exception(编译时异常类):如果出现了问题,自己处理. RuntimeExcetpion(运行时异常):
java中异常类的常见操作:
1.先要有异常,一般来说java的异常java自己常见对象,我们自己定义一个异常,我们自己常见对象
2.抛出异常(不管了)
3.捕获异常(自己处理)
对于顶级类(外部类)来说,只有两种修饰符:public和默认(default)。因为外部类的上一单元是包, 所以外部类只有两个作用域:同包,任何位置。因此,只需要两种控制权限 :包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default)。
既然你问的类使用了private修饰符,说明是个内部类。内部类的上一级是外部类,那么对应的有四 种访问控制修饰符:本类(private),同包(default),父子类(protected),任何位置(public)。 种访问控制修饰符:本类(private),同包(default),父子类(protected),任何位置(public)。 当一个内部类使用了private修饰后,只能在该类的外部类内部使用。
Object类中的equals:
程序的异常:(程序中出现的问题)
1.throw:抛出异常动作 *
//自定义异常固定的套路 //1.必须继承Exception或者RuntimeException //2.写两个构造,一个空参,一个带有异常信息的String类型参数 //throw new NoSuchAgeException(“年龄不合法的异常”);
public class TestDemo { public static void main(String[] args) { //一个try 多个catch
try{
System.out.println("try");
int[] arr = {1,2,3};
arr[10] = 10;//数组下标越界
System.out.println(10/0);//数学异常
String s = "abc";
char ch = s.charAt(10);//字符串下标越界
}catch(ArithmeticException ae){
System.out.println("数学异常");
}catch(ArrayIndexOutOfBoundsException aioe){
System.out.println("数组越界");
}catch(StringIndexOutOfBoundsException sioe){
System.out.println("字符串下标越界");
}finally {
}
}
}