5、继承和多态

1、在Java中,所有的类都直接或间接地继承了java.lang.Object类;
   在Java中使用extends作为其扩展父类的关键词。

2、当扩展某个类时,该类的所有public成员都可以在派生类中被调用,
   而private成员则不可以直接在派生类中被调用使用,如果想要与父类的private成员沟通,
   就只能通过父类中继承下来的public()方法成员,如getX()何getY()
   
3、在扩展某个类时,可以一并初始化父类的构造函数,这可以使用super()方法达到,它表示调用父类的构造函数。

4、若只想基类中的某些成员被子类对象所使用,而不希望这些成员被其他外部对象直接调用,
   可以使用protected关键词修饰。

5、类是对象的定义书,如果父类中定义并不符合需求,那么可以在扩展的同时重写。
   可以重写方法的实现内容、成员的存取权限,或是成员的返回值类型。
   重写时必须注意:可以增大父类中的方法权限,但不能缩小权限。
   重写返回值类型有条件限制,重写的返回值类型必须是父类中同一方法返回类型的子类!
   如果在定义方法成员时使用final,则表示该方法无法被子类重写。
   如果在定义雷辉加上final,则表示要终止被扩展,无法被其他类继承。
 
6、super() 和 super
   如果在派生类中调用基类的构造函数,可以使用super()方法;
   若要在派生类中调用基类方法,则可以使用super.methodName()。
   
   但是两者都是有条件的,即父类中的方法或构造函数不能使private。
   
7、多态实现指的是使用同一个实现接口,以实现不同的对象实例,主要是为了降低对实现接口的依赖程度。

   现在假设Class1上定义了doSomething()方法,Class2上也定义了doSomething()方法,但我们定义了
   两个execute()方法来分别实现Class1和Class2的实例:
public void execute(Class c1)
{
c1.doSomething();
}
public void execute(Class c2)
{
c2.doSomething();
}
很显然,程序中execute()分别依赖于Class1和Class2两个类。
与其依赖两个类,不如定义一个父类ParentClass类,其中定义有doSomething(),并让Class1和Class2都集成ParentClass类
并重写自己的doSomething()方法,这样就可以将程序汇中的execute()改成:
public void execute(ParentClass c)
{
c.doSomething();
}
这样就让程序对个别对象的依赖程度降低了。

8、实际上在设计类时并不依赖于具体类,而是依赖于抽象,java在实现多态时,可以让程序依赖于抽象类或是接口。

9、在Java中定义类时,可以仅声明方法名称而不操作其中的逻辑,即抽象方法;
   如果一个类中包含了抽象方法,则该类称为抽象类,
   抽象类是拥有未实现方法的类,所以它不能被用来生成对象,只能被继承扩展,并实现抽象方法。
 
10、接口可以想象成一个完全没有任何方法被实现的抽象类。
    要注意的是:接口只能声明,不能实例化,只能有类继承接口才能实例化!!!
    实现某接口的类必须实现该接口所定义的所有方法,一个对象可以实现多个接口,但只能单继承。
 
11、接口的声明是使用interface关键词,声明方式如下:
    [public] interface 接口名称
{
  权限设定 返回类型 方法(参数列);
  权限设定 返回类型 方法(参数列);
  //...
}
在声明接口时方法上的权限设定可以省略,如果省略,默认是public。

下面是一个范例:
【IRequest.java】
public interface IRequest
{
	public void execute();
}
 
    【HelloRequest.java】
public class HelloRequest implements IRequest
{
	private String name;


	public HelloRequest(String name)
	{
		this.name = name;
	}


	public void execute()
	{
		System.out.println("Hello, " + name);
	}
}
    【WelcomeRequest.java】
public class WelcomeRequest implements IRequest
{
	private String place;


	public WelcomeRequest(String place)
	{
		this.place = place;
	}


	public void execute()
	{
		System.out.println("Welcome to " + place);
	}
}
   虽然HelloRequest和WelcomeRequest是两种不同的类型,但都实现了IRequest,所以设计一个doRequest()方法,
   只要知道IRequest定义了什么方法,就可以实现HelloRequest和WelcomeRequest的实例,而不用知道传入的对象到底是什么类的实例。
   示范如下:
public class RequestDemo
{
	public static void main(String[] args)
	{
		for(int i = 0; i < 10; i++)
		{
			//random()返回大于等于 0.0 且小于 1.0 的伪随机 double 值
			int n = (int)(Math.random() * 10) % 2;
			switch(n)
			{
				case 0:
					doRequest(new HelloRequest("Freedom"));
				break;


				case 1:
					doRequest(new WelcomeRequest("Wiki Website"));
				break;
			}
		}
	}


    //接口类似多态?
	public static void doRequest(IRequest request)
	{
		request.execute();
	}
}


12、在Java中可以一次实现多个接口,实现多个接口的方式如下:

    public class 类名称 implements 接口1, 接口2, 接口3
{
  //接口实现
}
    当实现多个接口时,记得必须实现每一个接口中所定义的方法。

接口也可以进行继承,同样是使用extends关键词来继承父接口。例如:
public interface 名称 extends 接口1,接口2
{
  //...
}
不同于类一次只能继承一个父类,一个接口可以同时继承多个父接口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值