· 修饰类不能被继承
· 修饰方法不能被覆写
· 修饰的变量就是一个常量,全局常量(public static final)
2、抽象类和接口
· 抽象类:只包含一个抽象方法的类,抽象方法只需声明而不需要实现,必须有子类
· 接口:只包含抽象方法和全局常量的类——接口,也是必须有子类
2、instanceof关键字
3、Object类
为了清楚的阐述出概念,现在先使用普通类的继承关系。
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
public class Demo01
{
public static void main(String args[])
{
B b = new B();
A a = new A();
b.fun1();
a.fun2();
b.fun3();
}
}
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
public class Demo02
{
public static void main(String args[])
{
//声明一个父类对象
A a = null;
//new B()是子类对象向父类对象转换
a = new B();
a.fun1();
}
}
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
public class Demo02
{
public static void main(String args[])
{
//声明一个父类对象
A a = null;
//new B()是子类对象向父类对象转换
//子类对象向父类对象转型之后,所调用的方法一定是被覆写过的方法
a = new B();
a.fun1();
a.fun2();
}
}
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
public class Demo03
{
public static void main(String args[])
{
//声明一个父类对象
A a = null;
//new B()是子类对象向父类对象转换
//子类对象向父类对象转型之后,所调用的方法一定是被覆写过的方法
a = new B();
a.fun1();
a.fun2();
a.fun3();
}
}
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
public class Demo03
{
public static void main(String args[])
{
//声明一个父类对象
A a = null;
//new B()是子类对象向父类对象转换
//子类对象向父类对象转型之后,所调用的方法一定是被覆写过的方法
a = new B();
//可以进行向下转型,需要使用强制性手段哈~
B b = (B)a;
b.fun3();
}
}
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//现在我们不覆写A类中的fun1()方法
public void funX()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
public class Demo04
{
public static void main(String args[])
{
A a = new B();
a.fun1();
}
}
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
public class Demo04
{
public static void main(String args[])
{
A a = new A();
a.fun1();
}
}
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
public class Demo04
{
public static void main(String args[])
{
A a = new A();
//如果我们要调用fun3()方法呢?现在使用向下转型可以吗?
B b = (B)a;
b.fun3();
}
}
· NullPointerException:表示空指向异常,如果没有开辟堆内存空间,则出现此异常
· ClassCastException:表示类转换异常,两个不相关的类的对象进行向下转型操作。
在进行向下转型之前,两个对象必然先发生向上转型关系,这样好建立起关系,否则两个没有关系的对象是不能相互转型的。
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
class C extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("C类===>public void fun1()");
}
public void fun4()
{
System.out.println("C类===>public void fun4()");
}
}
public class Demo05
{
public static void main(String args[])
{
fun(new B());
fun(new C());
}
//现在要求定义几个方法,可以接收父类A的子类对象
//如果不知道多态性的时候应该使用以下的方式编写代码
public static void fun(B b)
{
b.fun2();
}
public static void fun(C c)
{
c.fun2();
}
}
· 如果现在A类有30个子类,则方法要重写30遍。
所以此时就可以利用对象的多态性完成,因为所有的子类对象都可以向父类对象转换。
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
class C extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("C类===>public void fun1()");
}
public void fun4()
{
System.out.println("C类===>public void fun4()");
}
}
public class Demo06
{
public static void main(String args[])
{
fun(new B());
fun(new C());
}
//现在要求定义几个方法,可以接收父类A的子类对象
//现在使用多态性编写代码
public static void fun(A a)
{
a.fun2();
}
}
如果传入的是B类的对象,则要求再调用fun3()方法,如果传入的是C类的对象,则要求再调用fun4()
方法。
如何去判断一个对象是否是某个类的实例呢?这就需要instanceof关键字支持哈。
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
class C extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("C类===>public void fun1()");
}
public void fun4()
{
System.out.println("C类===>public void fun4()");
}
}
public class Demo07
{
public static void main(String args[])
{
B b = new B();
System.out.println(b instanceof A);
}
}
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
class C extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("C类===>public void fun1()");
}
public void fun4()
{
System.out.println("C类===>public void fun4()");
}
}
public class Demo07
{
public static void main(String args[])
{
B b = new B();
System.out.println(b instanceof A);
System.out.println(b instanceof B);
}
}
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
class C extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("C类===>public void fun1()");
}
public void fun4()
{
System.out.println("C类===>public void fun4()");
}
}
public class Demo07
{
public static void main(String args[])
{
A a = new A();
System.out.println(a instanceof A);
System.out.println(a instanceof B);
}
}
{
public void fun1()
{
System.out.println("A类===>public void fun1()");
}
public void fun2()
{
//fun2方法调用的是fun1方法
this.fun1();
}
}
class B extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("B类===>public void fun1()");
}
public void fun3()
{
System.out.println("B类===>public void fun3()");
}
}
class C extends A
{
//覆写A类中的fun1()方法
public void fun1()
{
System.out.println("C类===>public void fun1()");
}
public void fun4()
{
System.out.println("C类===>public void fun4()");
}
}
public class Demo08
{
public static void main(String args[])
{
fun(new B());
System.out.println("#########################");
fun(new C());
}
public static void fun(A a)
{
a.fun2();
if (a instanceof B)
{
B b = (B)a;
b.fun3();
}
if (a instanceof C)
{
C c = (C)a;
c.fun4();
}
}
}
一般情况下都是在转型之前进行一下判断,这样就可以进行比较安全的转型操作。
· 如果一个好的类需要覆写Object类中的三个方法:
|- public String toString():对象输出时的操作
|- public boolean equals(Object obj):对象比较时的操作
|- public int hashCode(): 返回该对象的哈希码值。
{
private String name;
private int age;
public Student(String name,int age)
{
this.name = name;
this.age = age;
}
}
public class Demo09
{
public static void main(String args[])
{
System.out.println(new Student("王乾",27));
}
}
{
private String name;
private int age;
public Student(String name,int age)
{
this.name = name;
this.age = age;
}
}
public class Demo09
{
public static void main(String args[])
{
System.out.println(new Student("王乾",27).toString());
}
}
{
private String name;
private int age;
public Student(String name,int age)
{
this.name = name;
this.age = age;
}
public String toString()
{
return "Michael";
}
}
public class Demo09
{
public static void main(String args[])
{
System.out.println(new Student("王乾",27));
}
}
{
private String name;
private int age;
public Student(String name,int age)
{
this.name = name;
this.age = age;
}
public String toString()
{
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Demo09
{
public static void main(String args[])
{
System.out.println(new Student("王乾",27));
}
}
{
private String name;
private int age;
public Student(String name,int age)
{
this.name = name;
this.age = age;
}
public boolean equals(Object obj)
{
if(this==obj)
{
//内存地址的值相等,则肯定是同一个对象
return true;
}
Student stu = (Student)obj;
if (stu.name.equals(this.name)&&stu.age==this.age)
{
return true;
}
else
{
return false;
}
}
public String toString()
{
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Demo10
{
public static void main(String args[])
{
Student stu1 = new Student("王乾",27);
Student stu2 = new Student("王乾",27);
System.out.println(stu1.equals(stu2));
}
}
![image [零基础学JAVA]Java SE面向对象部分-16.面向对象高级(04)_Object_27](https://s6.51cto.com/attachment/200901/15/27212_1232031382ZiHJ.png)
· 因为equals方法接收的是Object类型,所以肯定可以接收任意的对象。
{
private String name;
private int age;
public Student(String name,int age)
{
this.name = name;
this.age = age;
}
public boolean equals(Object obj)
{
if(this==obj)
{
//内存地址的值相等,则肯定是同一个对象
return true;
}
Student stu = (Student)obj;
if (stu.name.equals(this.name)&&stu.age==this.age)
{
return true;
}
else
{
return false;
}
}
public String toString()
{
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Demo10
{
public static void main(String args[])
{
Student stu1 = new Student("王乾",27);
Student stu2 = new Student("王乾",27);
System.out.println(stu1.equals("51cto"));
}
}
{
private String name;
private int age;
public Student(String name,int age)
{
this.name = name;
this.age = age;
}
public boolean equals(Object obj)
{
if(this==obj)
{
//内存地址的值相等,则肯定是同一个对象
return true;
}
if (!(obj instanceof Student))
{
return false;
}
Student stu = (Student)obj;
if (stu.name.equals(this.name)&&stu.age==this.age)
{
return true;
}
else
{
return false;
}
}
public String toString()
{
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Demo10
{
public static void main(String args[])
{
Student stu1 = new Student("王乾",27);
Student stu2 = new Student("王乾",27);
System.out.println(stu1.equals("51cto"));
}
}
1、对象的多态性
· 向上自动转型
· 向下强制转型
2、instanceof关键字
3、Object类
在开发中很少去继承一个已经实现好的类,一般都会去继承一个抽象类或实现一个接口。
cgwlve 2013-03-15
weily51 回复了 cgwlve 2013-03-27
求学者 2010-07-24
求学者 2010-07-24