------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
多态:一类事物具有的多种表现形式。函数的重载也是算多态的一种。多态的体现:父类的引用指向自己的子类对象;父类的引用也可以接受自己的子类对象。多态的优点是提高了程序的扩展性。前提是类与类之间有关系,即继承或实现,存在覆盖,否则无意义。虽然提高了扩展性,只是相对于父类的引用访问父类中的成员。在多态的引用中,子类得到了提升,向上转型,想要调用子类的方法,则需要强制将父类的引用转成子类。
Animal a=new cat(); //a 是父类指向子类的引用
a.eat;
Cat c=(cat)a;
c.catchMouse();
Animal a=new Animal();
Cat c=(cat)a;
上面这句是错误,因为不能将父类强制转化为子类类型。可以转化的是父类的引用指向子类,这样既可以提升,又可以强转。多态自始至终都是子类在变化。
instanceof 这个关键字用来判断某一类型引用指向的对象符合什么类型
多态中非静态成员函数的特点:在编译时期,参阅引用类型变量所属的类中是否有调用方法,有就成功,否则失败。在运行时期,参阅对象所属的类中是否有调用方法,编译时看引用的父类中是否有调用的方法,运行时就看子类的方法。
多态中的成员变量特点:无论编译与运行,都是看父类,参考左边,引用型变量所属的类,静态成员函数同样是这样的。因为静态方法在进入内存后,即被绑定到了所属类下面。 要考虑到对象建立过程中,内存加载的顺序与情况。
Object类:所有类的父类,因为父类都是从子类中抽出公有的功能,那么作为object 类它的方法是所有类都有的。
clone(),equals(),hashcode(),wait(),notify(),toString()。equals与==的区别在于equals比的是内容,类型。==比较的是内存的地方。用到对象里的特有数据时记得进行类型转化,因为比较返回的类型是object类。getClass(),这个方法今后是要用到发射中的。
内部类:将一个类中定义在另一个类的里面,这样的优点是可以直接访问外部类中的成员,包括私有。外部类要访问内部类,必须建立内部类。
外部类.内部类.名称=new 外部类 ().new 内部类()。
outer.inner in=new outer.new inner()
class outer
{
int x=0;
class inner
{
System.out.println( outer.this.x) //这个就是外部类可以访问内部类的原因
}
}
当内部类在成员位置上,可以被成员修饰符所修饰。private,static都可以修饰了。使用static修饰时,只能访问外部类中的静态成员,出现了访问局限,当内部类的方法操作数据都是非特有的数据时,可以用静态内部类了。访问非静态成员的格式:
new outer.inner().function();
访问静态成员时:
outer.inner().function();
内部类中定义静态成员,该类必须是static的。static修饰成员的。
当外部类总的静态方法访问内部类时,内部类必须是static的。
描述事物的时候,事物的内部还有事物。那么需要使用内部类来进行描述了。这个是使用内部类的原则。前面是在成员位置上时,当内部类定义在局部时,
1.不可以被成员修饰符修饰。
2.可以直接访问外部类中的成员,因为还有外部类中的引用,但是不可以访问它所在的局部中的变量,只能访问final修饰的局部变量。
匿名内部类:定义匿名类的前提:
1.内部类必须是继承一个类或者实现接口。
class outer
{
public void function()
{
new +父类()
{
复写的方法
}
}.function();
}
2.匿名内部类的本质是匿名子类对象,有些臃肿,因为带有内容的缘故。匿名对象只能调用一次方法。匿名内部类中定义的方法最好不要超过三个(含三个)。
public class test6
{
public static void main(String[] args)
{
test.function().method();
}
}
interface Inter
{
void method();
}
class test
{
static Inter function()
{
return new Inter()
{
public void method()
{
System.out.println(" ");
}
};
}
}
匿名内部类的范例,需要注意的地方是主函数中的调用模式决定了方法是静态的方法,返回的方式。最后的分号不要忘记。
异常:运行程序中出现的问题。对于出现的问题在java中分为两种:Error类与Exception两种。Error的出现一般不需要编码针对处理。Exception 则是我们需要针对处理的。虽然两者不同,但是有些共性的内容,比如原因,出现的情况。有了Throwable类,此类中有getCause(),获取原因。getMessage 获取throwable的详细消息字符串。printStackTrace()将此throwable及其追踪输出至标准错误流。toString() 返回此throwable的简短描述。常见的Exception:Arithmeticex。ception属于运算异常。—Exception作为问题异常的方法描述后缀,和Error一样。
异常处理的特有格式(某些步骤可以省略,除了try,剩余两个可以省略一个)
try
{
需要被检测的代码;
}
catch(异常类 变量)
{
处理的异常代码即处理方式;
}
finally
{
一定会执行的语句;
}
public static void main(String[] args)
{
try
{
rec r=new rec(3,-3);
r.getArea();
}
{
System.out.println(e.toString());
}
System.out.println(" p ");
}
}
interface Shape
{
void getArea();
}
class rec implements Shape
{
private int len,wid;
rec(int len,int wid) throws someException
{
if(len<0||wid<0)
throw new someException
this.len=len;
this.wid=wid;
}
public void getArea()
{
System.out.println(len*wid );
}
}
class someException extends RuntimeException
{
someException(String message)
{
super(message);
}
}
对于捕获的异常,我们常用的操作。前面有介绍过的一些方法,getMessage 获取异常信息。toString() 异常名称:异常信息;printStackTrace 打印异常信息,异常类直接调用即可。JVM默认的异常处理机制就是在调用printStackTrack的方法,调用完后,程序会停止运行,出问题下面语句不会执行到。 我们在功能上通过throw是 来抛出异常来说明此功能有可能在调用的过程出现问题,类上也是需要声明异常的throws 异常,解决异常的话不用声明。
int div (int a,int b) throws Exception
调用有可能异常的功能时,我们必须要处理,要么抛,要么try。
多异常的处理,步骤:
1.声明异常类时,声明的要具体些,这样处理会具体。否则,处理的时候不知道问题,那么不容易解决问题。
2.有几个异常,那就要对应几个catch,出现继承关系的catch代码块的时候,Exception应该放在最下面,否则,父类下面的catch不会执行到。建立并进行catch处理,一定要处理问题而不是简单地打印,因为异常机制的出现本质是为了解决问题而且不符合实际开发需求。
除了java定义的异常外,实际开发中还有一些未定义的异常,我们需要自定义异常。自定义异常类继承Exception,当函数内部出现抛出异常时,必须要给出处理。一般情况,函数内出现异常,函数上要声明出来---throws Exception。之所以要继承,是因为只有Throwable中才有抛出特性 throw throws。 throw使用在函数内,后面是异常对象,throws使用在函数上,后面是异常类,可以多个,逗号隔开。函数内抛出异常,函数上要声明,除了RuntimeException。函数上声明了该异常,调用者可以不用处理。原因是出现这类异常时,需要程序停止,需要用户再去处理了。catch 有否来判断有没有处理,没有处理就需要类上声明。
子类在覆盖父类时,如果父类方法抛出异常,那么子类在覆盖该方法时,只能抛出父类异常或此异常的子类 如果父类抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。原则是父类可以处理的异常,子类就可以抛出。 如果父类或接口都没有抛出异常,那么子类也不能抛出异常,子类方法有异常,只能try,绝对不能抛。
包:对类中的文件进行管理,可以理解为java中的文件夹概念。给类提供多层命名的空间,写在程序文件的第一行,类名的全称是 包名.类名运行java的时候类的书写是要符合以上全称的。包也是一种包装。
保存的时候,在Dos命令行里的格式是-d . 所在文件夹位置。包与包之间要访问的话,被访问的包中的类及类中的成员要被public修饰才行。继承的过程中被继承的类名使用的是全称。不同包中的子类可以访问父类中被protect保护的成员。包与包之间可以使用的权限只有两种,public protect。
为了 简化类名的书写,使用了一个关键字:import。