第5章:继承与接口
java不支持多重继承(子类只能有一个父类)。
继承使用关键字extends。如果没有使用extends关键字,这个类被系统默认是Object的子类。
当子类与父类在同一个包中的时候子类还会继承父类的友好变量和友好方法。
java中关于protected的进一步说明:(A是父类,D继承于A)
用D类在D本身中创建了一个对象,那么该对象可以直接访问继承的或自己定义的protected变量和protected方法。
如果在另外一个类中如E类中用D类创建一个对象object,该对象能否访问protected变量和protected方法如下两种情况:
(1)对于D类声明的protected成员变量和方法,如果E类和D类在一个包中,那么object就可以访问。
(2)对于D类中从A类继承的protected成员变量和方法,如果E类和A类在一个包中,那么object就可以访问。
再重写父类方法时,不可以降低方法的访问级别
java访问级别如下:
public < protected < 友好的 < private
用abstract修饰抽象类。abstract方法(抽象方法)如C++中的虚方法。
抽象类不能实例化(new),但是可以声明抽象类对象变量。
final关键字修饰的类不能被继承。
final关键字修饰的方法不允许子类重写,即不允许子类隐藏可以继承的final方法。
final关键字修饰的成员变量或者局部变量为常量,在声明时必须初始化。
用子类创建一个对象,并把该对象的引用放到父类的对象中。称这个父类对象是子类对象的上转型对象。
上转型对象不能操作子类新增的成变量和方法,但是可以操作子类继承或隐藏的成员变量,也可以使用子类继承或重写的成员方法。可以将上转型对象再强制转换为一个子类对象,这时,该子类对象有具备了子类所有的属性和功能。
不能将父类创建的对象的引用赋值给子类声明的对象。
子类如果要使用被隐藏的方法或变量,必须使用关键字super关键字。
当子类创建一个对象时,除了子类声明的成员变量和继承的成员变量要分配内存外,被隐藏的成员变量也要分配内存,但该内存单元不属于任何对象,这些内存单元必须用super调用。同样的,当子类创建对象时,除了子类声明的方法和继承的方法要分配入口地址外,被隐藏的方法也要分配入口地址,但该入口地址只对super可见,必须由super来调用。
interface声明接口,类要使用接口用implements关键字。接口中的方法一定是public abstract方法,接口中的常量一定是public static常量。所以编写接口时可以省略常量前面的public,final,static关键字和方法前面的public,abstract关键字。
正因为接口中的方法一定都是public abstract的,所以类中实现接口方法时访问权限一定要用public修饰。
加public修饰的接口可以被任何一个类声明实现,不加public修饰的接口称友好接口,可以被同一包中的类声明实现。接口也用extends关键字实现继承。如果一个类声明实现一个接口但没有实现接口中的所有方法,则该类必须是abstract类。
接口回调:把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口中的方法。
abstract类与接口的比较:
(1)abstract类与接口都可以有abstract方法。
(2)接口中只能有常量不可以有变量,而abstract类中即可以有常量也可以有变量。
(3)abstract类中可以有非abstract方法,而接口不可以。
第6章:内部类与异常类
java支持在一个类中声明另一个类,这样的类成为内部类,而包含内部类的类成为内部类的外嵌类。一个类把内部类当作自己的成员,内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。
内部类的类体中不可以声明类变量和类方法(static),外嵌类类体中可以用内部类声明对象。
匿名类:一个类的子类去掉类声明后的类体。匿名类就是一个字类,因为无名字可用,所以不能用匿名类声明对象,但是可以直接用匿名类创建一个对象(用关键字new 父类名(){匿名类体})
匿名类可以继承父类的方法也可以重写父类的方法,用户使用匿名类时,必然是在某个类中直接用匿名类创建对象,因此,匿名类一定是个内部类,匿名类可以访问外嵌类中的成员变量和方法,但是匿名类体中不可以声明static成员变量和static方法。
因为匿名类没有类名,所以,在用匿名类创建对象时,要直接使用父类的构造方法。
java允许直接用接口名/abstract类名和一个类体创建一个匿名对象。
java中,用户可以扩展Exception类定义自己的异常类,然后规定在哪些方法产生这样的异常。如:
class IntegerException extends Exception
{
IntegerException(int m)
{
...
}
}
class People
{
public void setAge(int age) throws IntegerException
{
if(age>=160 || age<=0)
throw new IntegerException(age);
...
}
}
throws关键字用于声明要产生的若干个异常。
throw关键字是用于抛出异常。
断言:断言语句一般用于程序不准备通过捕获异常来处理的错误。
断言有两种格式:
assert booleanExpression;
assert booleanExpression : messageException
当booleanExpression值为false时,程序从断言语句处停止执行。如用第2种语句还会输出messageException字符串表达式值。
注意:当用java解释器直接运行应用程序时,默认是关闭断言语句的。在调试程序时可以使用-ea启动断言。如
java -ea mainClass
Class类:Class是java.lang包中的类,该类的实例用类封装对象运行时的状态。
当一个类被加载并创建对象时,和该类相关的一个类型为Class的对象会自动创建。Class类本身不提供构造方法,因此,不能用new运算符和构造方法显式地创建一个Class对象。
任何对象调用getClass()方法都可以获取和该对象相关的一个Class对象,这个Class对象调用如下方法可以获取创建对象的类的有关信息,如类名,类中的方法名,成员变量名等。
String getName(); //返回类名
Constructor[] getDeclaredConstructors(); //返回类的全部构造方法
Field[] getDeclaredFields(); //返回类的全部成员变量
Method[] getDeclaredMethods(); //返回类的全部方法
使用Class实例化一个对象:创建对象(new 类构造方法)实际上可以用Class对象得到一个类的实例。
如下,先得到一个和该类相关的Class对象,使用Class类方法:
public static Class forName(String className) throws ClassNotFoundException
就可以返回一个和参数className指定的类相关的Class对象,再用这个Class对象调用如下方法:
public Object newInstance() throws InstantiationException,IllegalAccessException
就可以得到一个className类对象。
class Rect{}
public class Example
{
Class cs = Class.forName("Rect");
Rect rect = (Rect)cs.newInstance();
}
阅读(1221) | 评论(0) | 转发(0) |