代码整理:(马士兵)
/*范例名称:
* 原文件名称:
* 要点:
* 1. 面向对象
* 2.关键字:
* this--在类的方法中使用this表示使用该方法的对象的引用;
* super--当前对象父类的引用;可以认为子类对象中默认调用了super()方法来实例化一个父类对象;
* static--在类中声明变量时,为类的公用变量,在第一次使用时被初始化,仅此一份;
* 声明方法时,调用该方法时不会将对象的引用传递给他,不可访问非static成员;
* 非静态成员专属于某一个对象, 即必须通过实例化对象引用;
* 可以通过对象引用或者类名(不需要实例化)访问静态成员
* package/import--打包/引入包
* Java只支持单继承(C++可以多继承)
* 修饰对象成员的访问权限
* private--类内部
* default--类内部、同一个包
* protected--类内部、同一个包、子类
* public--类内部、同一个包、子类、任何地方
* (class的权限休书只可以用public跟default)
*
* instanceof--判断该引用型“指向”对象是否属于该类或者该类的子类
*
* abstract--抽象类/抽象方法; 相当于c++里边的virtual; 抽象类是用来被继承的(不能被实例化); 抽象方法只需要声明, 子类中需要重写相应的方法
* final--变量不能被修改, 方法不能被重写, 类不能被继承; 相当于c++里边的const
* inerface--接口, 是一种特殊的抽象类, 只包含常量和方法定义; 通过实现多接口实现"类多继承"
*/
public class ObjectTest {
private static int sid = 0;
private String name;
int id;
ObjectTest(String name) {
this.name = name;
id = sid++;
}
public void info() {
System.out.println("My object's name is " + name + " No. " + id);
}
public static void main(String[] args) {
// 测试一
System.out.println("***************");
System.out.println("测试一");
System.out.println("***************");
ObjectTest.sid = 100;
ObjectTest mimi = new ObjectTest("Mimi");
mimi.sid = 200;
ObjectTest papa = new ObjectTest("Papa");
mimi.info();
papa.info();
// 测试2
System.out.println("***************");
System.out.println("测试二:继承、重写、访问权限");
System.out.println("***************");
Student student = new Student();
student.setName("Jhon");
student.setAge(12);
student.setSchool("Stanford");
System.out.println("重写toString的结果: " + student);// 此处student相当于student.toString()
Student student2 = new Student();
student2.setName("Jhon");
student2.setAge(12);
student2.setSchool("Stanford");
System.out.println("student==student2? " + student.equals(student2));
// 测试3
System.out.println("***************");
System.out.println("测试三:动态绑定和多态");
System.out.println("***************");
Teacher teacher1 = new Teacher();
student.yingDa();
teacher1.yingDa();
Lady l1=new Lady("l1", teacher1);//这里比较有意思,体现 动态绑定
l1.ladyYingDa();//此处方法里边调用的yingDa()方法由运行时new的对象(Teacher)决定
//其实原理是因为,实例化子类对象时,其(包含)生成的父类对象的方法的指针由于子类重写的缘故被修改为指向子类的对应方法了
// 测试4
System.out.println("***************");
System.out.println("测试四:接口--与继承类似,接口与实现类之间存在多态性");
System.out.println("***************");
StudentSP SSP1=new StudentSP("StudentSP Li");
SSP1.sing();SSP1.sleep();SSP1.paint();
Singer singer1=new StudentSP("Singer Pan");
singer1.sing();singer1.sleep();
Painter painter1=new StudentSP("Painter Wei");
painter1.paint();
Painter painter2=(Painter)singer1;
painter2.paint();
}
}
//abstract class Person {
class Person {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void yingDa() { System.out.println("人应答……"); }
//public abstract void yingDa();
}
class Student extends Person {
private String school;
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
// 重写toString方法(Object)
public String toString() {
return (getName() + " " + getAge() + " " + getSchool());
}
// 重写equals方法(Object)
public boolean equals(Object obj) {
if (obj instanceof Student) {// 假如obj是Student对象
Student stuTemp = (Student) obj;
if (school == stuTemp.getSchool() && this.getName() == stuTemp.getName()
&& this.getAge() == stuTemp.getAge()) {
return true;
} else {
return false;
}
} else {
return false;
}
}
public void yingDa() {
System.out.println("学生应答……");
}
}
class Teacher extends Person {
public void yingDa() {
System.out.println("老师应答……");
}
}
class Lady{
private String name;
private Person per;
Lady(String name, Person per){
this.name=name;this.per=per;
}
public void ladyYingDa(){per.yingDa();}
}
// 接口1
interface Singer {
public void sing();
public void sleep();
}
//接口2
interface Painter{
public void paint();
}
class StudentSP implements Singer, Painter {
private String name;
StudentSP(String name) {
this.name = name;
}
public String getName() {
return name;
}
// 重写接口的所有方法
public void sing() {
System.out.println(getName() + " is singing");
}
public void sleep() {
System.out.println(getName() + " is sleeping");
}
public void paint(){
System.out.println(getName() + " is painting");
}
}
运行结果:
***************
测试一
***************
My object's name is Mimi No. 100
My object's name is Papa No. 200
***************
测试二:继承、重写、访问权限
***************
重写toString的结果: Jhon 12 Stanford
student==student2? true
***************
测试三:动态绑定和多态
***************
学生应答……
老师应答……
老师应答……
***************
测试四:接口--与继承类似,接口与实现类之间存在多态性
***************
StudentSP Li is singing
StudentSP Li is sleeping
StudentSP Li is painting
Singer Pan is singing
Singer Pan is sleeping
Painter Wei is painting
Singer Pan is painting
多态的内存图解
(http://blog.csdn.net/scliu12345/article/details/53738185)
(转自:http://blog.csdn.Net/u013905744/article/details/44346717)
【其实不是子类的的show()方法把父亲覆盖了;应该是 子类的父亲的show()指针被修改为指向子类的show()方法了, 通过指针的解释更合适点】
java基础之【继承--->多态】内存图
(
http://blog.csdn.net/hubiao_0618/article/details/38523281)
执行流程
总结:
1:多态=继承+重写+父类引用子类 如:
Fu ff = new Zi();
2:普通成员
变量:都参考左边,因为变量不存在重写,方法中调用变量采用就近原则。
方法:编译参考左边,运行参考右边。
3:静态成员
变量和方法:编译运行都参考左边; 因为静态与对象无关。成员加静态修饰的没加private,都可以被类直接调用,所以参考的都是左边。