Java面向对象(五)
Java面向对象(五)
1.多态
概括:多态指不同类的对象在调用同一个方法时所呈现出的多种不同行为。通过多态消除了类之间的耦合关系,提高了程序的可拓展性和可维护性。Java的多态性是由类的继承、方法重写以及父类引用指向子类对象体现的。
举例:
abstract class Animal6{
abstract void shout();
}
class Cat6 extends Animal6{
public void shout(){
System.out.println("喵喵~");
}
}
class Dog6 extends Animal6{
public void shout(){
System.out.println("汪汪...");
}
}
public class Page121 {
public static void main(String[] args) {
Animal6 an1=new Cat6();
Animal6 an2=new Dog6();
an1.shout();
an2.shout();
}
}
2.对象的类型转换
概括:多态中涉及将子类对象当作父类类型使用的情况,在Java语言中称为“向上转型”。
Animal an1=new Cat(); //将Cat类对象当作Animal类型来使用
Animal an2=new Dog(); //将Dog类对象当作Animal类型来使用
注意:此时不能通过父类变量去调用子类中特有的方法
举例:
-
以下代码是错误的
interface Animal7{ void shout(); } class Cat7 implements Animal7{ public void shout(){ System.out.println("喵喵~"); } public void catchMouse(){ System.out.println("抓老鼠"); } } public class Page122 { public static void main(String[] args) { Animal7 an1=new Cat7(); an1.shout(); an1.catchMouse(); //子类特有方法 } }
-
但如果把主函数这样改就没问题了
Animal7 an1=new Cat7(); Cat7 cat=(Cat7)an1; cat.shout(); cat.catchMouse();
-
在向下转型时必须转换为本质类型,否则会出错,如下:
interface Animal7{ void shout(); } class Cat7 implements Animal7{ public void shout(){ System.out.println("喵喵~"); } public void catchMouse(){ System.out.println("抓老鼠"); } } class Dog7 implements Animal7{ public void shout(){ System.out.println("汪汪..."); } } public class Page122 { public static void main(String[] args) { Animal7 an1=new Dog7(); Cat7 cat=(Cat7)an1; cat.shout(); cat.catchMouse(); } }
-
为避免上面这种情况,Java提供了关键字instanceof,它可以判断一个对象是否为某个类(或接口)的实例或者子类实例
Animal7 an1=new Dog7(); if(an1 instanceof Cat7){ Cat7 cat=(Cat)an1; cat.shout(); cat.catchMouse(); }else{ System.out.println("该类型的对象不是Cat类型") }
3.内部类
类中也可以定义类
举例:
class Outer{
int m=0;
void test1(){
System.out.println("外部类成员方法");
}
class Inner{
int n=1;
void show1(){
System.out.println(m);
test1();
}
void show2(){
System.out.println("内部类成员方法");
}
}
void test2(){
Inner inner=new Inner();
System.out.println(inner.n);
inner.show2();
}
}
public class Page126 {
public static void main(String[] args) {
Outer outer=new Outer();
Outer.Inner inter=outer.new Inner();
inter.show1();
outer.test2();
}
}
注意:
- 类也可以定义在某方法中,称为局部类
- 静态内部类中只能访问外部类中的静态成员
匿名内部类直接上例子:
interface Animal{
void shout();
}
public class test{
public static void main(String[] args){
String name="小花";
animalShout(new Animal(){
public void shout(){
System.out.println(name+"喵喵~");
}
});
}
}
public static void animalShout(Animal an){
an.shout();
}