Java笔记(继承和多态 -1) 边走边聊

今天复习一下继承和多态呀,小汪汪,就是书上的第11章呀!这个很基础也很重要的呀!要对比C++的继承和多态来学习呀!

继承与多态感觉内容比较多呀,我们分几次复习一下呀!

关于继承和多态,如果除去实现细节,仅从理解的角度来看,我们以前整理的内容已经感觉不错了,现在再贴一遍呀,小汪汪,下次忘了就可以过来看一下,不需要乱找了:

1、多态:既是同一个接口,不同的行为; 多态分为编译时多态和运行时多态两种:
   编译时多态:即“早绑定”,编译器和链接器会确定每一个调用函数的地址;实例有:函数的重载,运算符的重载。
   运行时多态:即“晚绑定”,除非程序执行起来,否则无法确定程序将要调用哪一个函数;实例有:动态绑定。

2、动态绑定:即指向父类的指针或者引用,用子类的对象的地址对其进行赋值;其具体调用哪一个虚函数由子类决定;
   虚函数是实现动态绑定的关键,具体如何知道调用哪一个虚函数,是根据虚函数表来确定的,虚函数表是如何构成的自己有时间要了解一下,自己动手画一下。
   还有一类虚函数叫纯虚函数,注意它的写法:即在函数声明前加上关键字virtual,构成虚函数,结束后令其等于0,即“= 0”;
   包含纯虚函数的类叫做抽象类,这种类不可以声明实例,用于封装共有的行为,用来被子类继承。

(上面这些是C++中的多态和动态绑定的内容)

今天的复习是第一次,就说一些简单的,跟Java中实现类的继承有关的东东和细节呀:

继承其实就是从一个类再派生出一个新的类,这个派生出的类叫子类,前者就是父类,C++的写法就是声明一个类之后再加一个冒号:,然后C++还需要使用public、private、protected关键字限定继承方式,而Java就是使用extends后跟一个父类的名字就OK了,Java中的继承就是相当于C++中的public方式,这样子类中不会改变继承自父类的函数与属性的访问权限(访问权限的改变参看C++ Primer 的15.2.5节,对继承保护这一部分不是太熟的一定要把这个15.2.5节再学一遍呀,知识就是一点一滴的呀;我也再看了一遍呢^_^)。这里总结一下吧:

对类所继承的成员的访问由基类中的成员访问级别和派生类派生列表中使用的访问标号共同控制:

1、如果成员在基类中是private的:那么只有基类和基类的友元可以访问该成员。派生类不可以访问基类的私有成员,也不能使自己的用户能够访问那些私有的成员;如果子类想要访问父类中的私有的数据成员,那么应该在基类中定义一个返回该值的public或者protected的函数返回该值,然后子类以public或者protected权限继承父类;

那么以public、protected、private权限继承父类,子类对父类中的public、protected访问级别的成员的访问权限是什么呢?

2、如果是公共继承(public):父类中的public、protected成员在子类中仍然是public和protected的;

3、如果是受保护继承(protected):父类中的public、protected成员在子类中都是protected的;

4、如果是私有继承(private):父类中的public、protected成员在子类中都是private的;

上面这4条规则是要记住的呀!细心一点也是不难记住的,有没有呀?

怎么样?这样看来Java是不是要简单很多,Java只需要考虑子类从父类以public方式继承;就是需要我们记住上面的1和2两条呀!


这样的话,我们就来动手写一个类呀,来验证一下我们刚的学习的规则,并且包含一些其他的注意点(比如:super方法、与java.lang.Object类的关系等等):

上代码呀:

class animal
{
	public String name;
	protected double weight;
	private int age;
	
	animal(String Name,double Weight,int Age)
	{
		name = Name;
		weight = Weight;
		age = Age;
	}
	
	public void print_name()
	{
		System.out.println(this.name);
	}
	
	protected void print_weight()
	{
		System.out.println(this.weight);
	}
	
	private void print_age()
	{
		System.out.println(this.age);
	}
	
	public void set_age(int Age)
	{
		age = Age;
	}
	
	public int get_age()
	{
		return age; 
	}
	
	public String toString()
	{
		return "My name is "+name+", I'm about "+weight+" KG!";
	}
	
	void print_info()
	{
		System.out.println("这是animal的默认函数成员print_info!");
	}
}

final class person extends animal
{
	public int EQ;  //想了半天人与动物的区别呀,容易吗呀我,小汪汪加油呀!
	
	person(String Name,double Weight,int Age,int eq)
	{
		super(Name,Weight,Age);
		EQ = eq;
		print_info();
	}
	
	public void print_age()
	{
		System.out.println(this.get_age());
	}
}

public class showExample
{
	public static void main(String []args)
	{
		animal Tiger = new animal("tiger",40,5);
		person Person = new person("xiaosu.wang",75,25,100000);
		
		System.out.println("对java.lang.Object中的toString()函数的覆盖");
		System.out.println(Tiger.toString());
		System.out.println(Person.toString());
		
		System.out.println("公共的函数的继承");
		Tiger.print_name();
		Person.print_name();
		
		System.out.println("受保护的函数的继承");
		Tiger.print_weight();
		Person.print_weight();
		
		System.out.println("私有成员的使用");
		System.out.println(Tiger.get_age());
		Person.print_age();
		
		System.out.println("下面就是动态绑定的东西呀!");
		Object O = new animal("wolf",20,4);
		System.out.println(O.toString());
		
		System.out.println("关于默认函数成员!");
		Person.print_info();
	}
}

运行效果如下呀:



这个代码中出现的一些语法现象总结一下呀:

1、一个java文件中只可以有一个public权限的类呀,就如上面的代码中的类showExample,其他的类声明使用的是缺省的默认呀,这里对类的声明要么是public,要么就是缺省的(默认);

2、一个类,如果没有指明它派生自哪一个父类,那么它就是默认的派生自java.lang.Object类,Java中的类均派生自该类;所以像上面的animal、showExample类均派生自Object类;

3、animal类中覆盖了java.lang.Object类中的toString()函数,而person类又覆盖了animal类中的print_age()函数;

4、除了3中覆盖的情况,person类继承了animal中的其他函数;

5、this指所在类自己,super指所在类的父类的构造函数;

6、这里person以类似与C++中的public权限继承animal中的成员,对animal中成员的成员可见性参考上面总结的的呀:

      private是不可见的,即在person类中不可以直接使用animal的私有成员;

      public成员在person那中仍是public的

      protected成员在person中仍是protected的

     (default)成员在子类中是不可见的,即如果animal类中有某个成员是没有声明访问权限的,那么就是默认的(default),那么该成员在person类中是不可见的,即不可以使用,但是我们这里person类和animal 类在同一个包中,所以访问时可以的,这样看来,这里多了一个默认的似乎也要多小心一些呀,而且Java比C++多了包这么一说,在不在同一个包里访问权限是有区别的,但是类比一下C++有友元这么个概念,而Java没有,所以比较一下,Java中的包就类似与C++中的友元呀...关于包,我们下一次就来学习一下呀。

上面的访问权限有一个具体的表格列了出来在《Java语言程序设计》第11章,11.13节,P319,具体的再参考一下那里呀!这里只是结合写的代码把代码中涉及到的情况总结了一下。

7、关于多态,看一下代码的第91行,O是java.lang.Object类的引用,但是给它赋的是animal类的对象,O.toString()调用的是animal类中重载的toString()函数,这就是指向父类的指针(Java中没有指针)或者引用,用子类的地址赋值,该引用的实际类型由子类决定。

8、代码第50行中的final:是声明该person类不可以扩展,也就是表明final类是终极的,不能作为父类的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值