黑马程序员-面向对象
- 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。
说到接口我们得先学习一个概念就是抽象类
- 抽象类
抽象定义:
- 抽象就是从多个事物中将共性的,本质的内容抽取出来。
- 例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。
抽象类: Java中可以定义没有方法体的方法,该方法的具体实现由子类完 成,该方法称为抽象方法,包含抽象方法的类就是抽象类。
抽象方法的由来:
- 多个对象都具备相同的功能,但是功能具体内容有所不同,那么在 抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功 能声明,没有功能主体的方法称为抽象方法。
- 例如:狼和狗都有吼叫的方法,可是吼叫内容是不一样的。所以抽 象出来的犬科虽然有吼叫功能,但是并不明确吼叫的细节
- 抽象就是从多个事物中将共性的,本质的内容抽取出来。
- 例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。
抽象类的特点
- 抽象类和抽象方法必须用abstract关键字来修饰。
- 抽象方法只有方法声明,没有方法体,定义在抽象类中。
/* * 抽象类使用 */ abstract class absDemo { //声明抽象方法。 //格式:修饰符abstract 返回值类型 函数名(参数列表) ; public abstract String name(); }
- 抽象类不可以被实例化,也就是不可以用new创建对象。原因如 下: 抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实 例。
- 例如:犬科是一个抽象的概念,真正存在的是狼和狗。 而且抽象类即使创建了对象,调用抽象方法也没有意义。
- 抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象 方法后才可以创建对象,否则该子类也是抽象类。
说完抽象类。那么我们可以来学习一下接口。
-
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)
- 子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重 写或者复写。
- 父类中的私有方法不可以被覆盖。
- 在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名 获取。
- 覆盖注意事项: • 覆盖时,子类方法权限一定要大于等于父类方法权限 • 静态只能覆盖静态。
- 覆盖的应用: • 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写 父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内 容
函数覆盖的展示
//对象的重载 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)); }
结语:面向对象就这样看完了。觉得毕老师的课程说得还是不错的。只能说我们想的学习和实践能力有限。没有足够的了解。现在只能了解个一二。希望以后能够好好理解面向对象的真正强大之处。