Xiao bailong

黑马程序员-面向对象

  • Java继承

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承可以理解为一个对象从另一个对象获取属性的过程。

如果类A是类B的父类,而类B是类C的父类,我们也称C是A的子类,类C是从类A继承而来的。在Java中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类。

继承通俗的理解就是新创建一个类如果继承了一个类,那么被继承的就是父类,而自己就是子类了。而这个子类可以可以实现并且调用父类的方法。在java中,所以的类都由java.lang.Object类继承而来。所以Object是所有类的父类。

通常继承一个类可以通过Extends关键字来申明这个类是否继承自某一个类。主要Exteds只可以继承Public的属性和方法

/*
 * 创建一个类。
 */
class Person
{
	public int age ;
	public String name;
}
/*
 * 继承一个Person。
 */
class zhulang extends Person
{
	//可以看到这里我们可以调用父类的方法。
	public zhulang()
	{
		this.name = "zhualng";
		this.age = 12;
	}
}	

 

还有一种方法可以是想继承。那么就用implements关键字。这个关键字,

Implements关键字使用在类继承接口的情况下, 这种情况不能使用关键字extends

说到接口我们得先学习一个概念就是抽象类

  • 抽象类

抽象定义:

  1. 抽象就是从多个事物中将共性的,本质的内容抽取出来。
  2. 例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。

抽象类:  Java中可以定义没有方法体的方法,该方法的具体实现由子类完 成,该方法称为抽象方法,包含抽象方法的类就是抽象类。

抽象方法的由来:

  1.  多个对象都具备相同的功能,但是功能具体内容有所不同,那么在 抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功 能声明,没有功能主体的方法称为抽象方法。
  2.  例如:狼和狗都有吼叫的方法,可是吼叫内容是不一样的。所以抽 象出来的犬科虽然有吼叫功能,但是并不明确吼叫的细节
  3. 抽象就是从多个事物中将共性的,本质的内容抽取出来。 
  4. 例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。

抽象类的特点

  1. 抽象类和抽象方法必须用abstract关键字来修饰。
  2. 抽象方法只有方法声明,没有方法体,定义在抽象类中。
    /*
     * 抽象类使用
     */
     abstract class absDemo
    {
    	 //声明抽象方法。
    //格式:修饰符abstract 返回值类型 函数名(参数列表) ;
    	public abstract String name();
    	
    }
  3. 抽象类不可以被实例化,也就是不可以用new创建对象。原因如 下:  抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实 例。
  4. 例如:犬科是一个抽象的概念,真正存在的是狼和狗。 而且抽象类即使创建了对象,调用抽象方法也没有意义。
  5. 抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象 方法后才可以创建对象,否则该子类也是抽象类。

  

说完抽象类。那么我们可以来学习一下接口。

 

  • Java 接口

为什么要有接口呢?Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

说到这里接口是一个抽象类。那么我么就会有问题,什么是抽象类呢?

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

接口与类相似点:

  • 一个接口可以有多个方法。
  • 接口文件保存在.java结尾的文件中,文件名使用接口名。
  • 接口的字节码文件保存在.class结尾的文件中。
  • 接口相应的字节码文件必须在与包名称相匹配的目录结构中。

接口与类的区别:

  • 接口不能用于实例化对象。
  • 接口没有构造方法。
  • 接口中所有的方法必须是抽象方法。
  • 接口不能包含成员变量,除了static和final变量。
  • 接口不是被类继承了,而是要被类实现。
  • 接口支持多重继承。

接口有以下特性:

  • 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
  • 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键子。
  • 接口中的方法都是公有的。

 

接口的声明和实现

当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。

类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

	public interface Imytefact
	{
		//任何类型 final, static 字段
		final String name="xuexi";
		static int Age =13;
		
		  //抽象方法
		 public void Show();
	}
	//实现上面的接口
	public class instr implements Imytefact
	{
		//必须实现接口里买的所有方法。
		public void Show()
		{
			//调用接口里面的静态字段。
			System.out.println(this.name);
		}
		
	}

  

重写接口中声明的方法时,需要注意以下规则:

  • 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
  • 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
  • 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。

在实现接口的时候,也要注意一些规则:

  • 一个类可以同时实现多个接口。
  • 一个类只能继承一个类,但是能实现多个接口。
  • 一个接口能继承另一个接口,这和类之间的继承比较相似。
  • Java 重写(Override)与重载(Overload)

函数覆盖(Override)

  1. 子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重 写或者复写。
  2. 父类中的私有方法不可以被覆盖。
  3. 在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名 获取。
  4. 覆盖注意事项: • 覆盖时,子类方法权限一定要大于等于父类方法权限 • 静态只能覆盖静态。
  5. 覆盖的应用: • 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写 父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内 容

函数覆盖的展示

//对象的重载
	
	public class Animal
	{
		public void move()
		{
			System.out.println("Animal可以移动");
		}
	}
	
	//重写父类的方法
	public class Mat extends Animal
	{
		//重写父类的方法
		public void move()
		{
			//调用父类的move()方法。
			super.move();
			//自己的move()方法
			System.out.println("Mat自己的移动方法");
		}
	}
	
	public static void main(String[] args)
	{
		Mat mat = new Mat();
		mat.move();
	}

重载(Overload)

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型呢?可以相同也可以不同。

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

重载规则

  • 被重载的方法必须改变参数列表;
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。

具体的代码练习我就不展示了。

public class Overloading {
 
	public int test(){
		System.out.println("test1");
		return 1;
	}
 
	public void test(int a){
		System.out.println("test2");
	}	
 
	//以下两个参数类型顺序不同
	public String test(int a,String s){
		System.out.println("test3");
		return "returntest3";
	}	
 
	public String test(String s,int a){
		System.out.println("test4");
		return "returntest4";
	}	
 
	public static void main(String[] args){
		Overloading o = new Overloading();
		System.out.println(o.test());
		o.test(1);
		System.out.println(o.test(1,"test3"));
		System.out.println(o.test("test4",1));
	}

  

结语:面向对象就这样看完了。觉得毕老师的课程说得还是不错的。只能说我们想的学习和实践能力有限。没有足够的了解。现在只能了解个一二。希望以后能够好好理解面向对象的真正强大之处。

posted @ 2015-06-15 13:13  小白龙on  阅读(171)  评论(0编辑  收藏  举报

QQ:846650266,电话:15117424475

© 白龙工作室 |隐私条款 |服务条款 |盘ICP备10000000号-1