黑马程序员——java面向对象(二)继承、抽象、接口

来源:互联网 发布:ftp需要开放的端口 编辑:程序博客网 时间:2024/05/16 08:48
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、继承

1.继承概述

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
通过extends关键字可以实现类与类的继承
class 子类名 extends 父类名 {} 
单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。
有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。

2.继承的好处
提高了代码的复用性
多个类相同的成员可以放到同一个类中
提高了代码的维护性
如果功能的代码需要修改,修改一处即可
让类与类之间产生了关系,是多态的前提
其实这也是继承的一个弊端:类的耦合性很强

3.java中继承的特点

Java只支持单继承,不支持多继承。
一个类只能有一个父类,不可以有多个父类。
class SubDemo extends Demo{} //ok
class SubDemo extends Demo1,Demo2...//error
Java支持多层继承(继承体系)
class A{}
class B extends A{}
class C extends B{}

4.java中继承的注意事项

子类只能继承父类所有非私有的成员(成员方法和成员变量)
其实这也体现了继承的另一个弊端:打破了封装性
子类不能继承父类的构造方法,但是可以通过super(后面讲)关键字去访问父类构造方法。
不要为了部分功能而去继承
我们到底在什么时候使用继承呢?
继承中类之间体现的是:”is a”的关系。

//定义动物类class Animal {//姓名private String name;//年龄private int age;//颜色private String color;public Animal() {}public Animal(String name,int age,String color) {this.name = name;this.age = age;this.color = color;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public void eat() {System.out.println("不要睡了,该吃饭了");}}//定义猫类class Cat extends Animal {public Cat() {}public Cat(String name,int age,String color) {super(name,age,color);}public void playGame() {System.out.println("猫玩英雄联盟");}}//定义狗类class Dog extends Animal {public Dog() {}public Dog(String name,int age,String color) {super(name,age,color);}public void lookDoor() {System.out.println("狗看家");}}//测试类class ExtendsTest5 {public static void main(String[] args) {//测试猫//方式1Cat c1 = new Cat();c1.setName("Tom");c1.setAge(3);c1.setColor("白色");System.out.println("猫的名字是:"+c1.getName()+";年龄是:"+c1.getAge()+";颜色是:"+c1.getColor());c1.eat();c1.playGame();System.out.println("---------------");//方式2Cat c2 = new Cat("杰瑞",5,"土豪金");System.out.println("猫的名字是:"+c2.getName()+";年龄是:"+c2.getAge()+";颜色是:"+c2.getColor());c2.eat();c2.playGame();}}

父类到子类是从一般到特殊的关系。

                  泛化:将不同子类中的共性抽象成父类的过程。

                  特化:在原有父类的基础上加入一些个性的过程。

                  原则:父类放共性,子类放个性。


二、super关键字

super的用法和this很像
this代表本类对应的引用。
super代表父类存储空间的标识(可以理解为父类引用)
用法(this和super均可如下使用)
访问成员变量
this.成员变量 super.成员变量
访问构造方法(子父类的构造方法问题讲)
this(…) super(…)
访问成员方法(子父类的成员方法问题讲)
this.成员方法() super.成员方法()

三、方法重写:

                  方法名:相同

                  参数表:相同

                  访问限制符:相同或者更宽

                  返回值类型:相同或者子类返回的类型是父类返回的类型的子类(在JDK5.0以后)

                  抛出的异常:不能比父类更宽。

    

            super关键字:

                  super()表示调用父类的构造器

                  super()也和this()一样必须放在方法的第一句

                  super()和this()不能同时出现        

                  super可以屏蔽子类属性和父类属性重名时带来的属性遮盖,super. 表示调用父类的方法或属性

                  在子类的构造器中如果没有指定调用父类的哪一个构造器,那么就会调用父类的无参构造器,即super()

                 

         注意:

                  父类的构造器不能被子类继承

                  方法和属性可以被继承,权限不限制能否继承过来,限制的是能否直接访问

即私有继承,虽然子类不能直接访问,但子类依旧拥有。

                  先构造父类,后构造子类,先this后super

                  

四、抽象类
抽象类概述:在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
抽象类特点
抽象类和抽象方法必须用abstract关键字修饰
格式
abstract class 类名 {}
public abstract void eat();
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类不能实例化
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
抽象类的子类
要么是抽象类
要么重写抽象类中的所有抽象方法
抽象类的成员特点
成员变量
可以是变量
也可以是常量
构造方法
有构造方法,但是不能实例化
用于子类访问父类数据的初始化
成员方法
可以有抽象方法 限定子类必须完成某些动作
也可以有非抽象方法 提高代码服用性

//定义员工类abstract class Employee {//姓名、工号以及工资private String name;private String id;private int salary;public Employee() {}public Employee(String name,String id,int salary) {this.name = name;this.id = id;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}//工作public abstract void work();}//普通员工类class Programmer extends Employee {public Programmer(){}public Programmer(String name,String id,int salary) {super(name,id,salary);}public void work() {System.out.println("按照需求写代码");}}//经理类class Manager extends Employee {//奖金private int money; //bonus 奖金public Manager(){}public Manager(String name,String id,int salary,int money) {super(name,id,salary);this.money = money;}public void work() {System.out.println("跟客户谈需求");}public int getMoney() {return money;}public void setMoney(int money) {this.money = money;}}class AbstractTest4 {public static void main(String[] args) {//测试普通员工Employee emp = new Programmer();emp.setName("张三");emp.setId("czbk001");emp.setSalary(18000);System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());emp.work();System.out.println("-------------");emp = new Programmer("张三","czbk001",18000);System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());emp.work();System.out.println("-------------");/*emp = new Manager();emp.setName("李四");emp.setId("czbk002");emp.setSalary(8000);emp.setMoney(2000);*///由于子类有特有的内容,所以我们用子类来测试Manager m = new Manager();m.setName("李四");m.setId("czbk002");m.setSalary(8000);m.setMoney(2000);System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());m.work();System.out.println("-------------");//通过构造方法赋值m = new Manager("李四","czbk002",8000,2000);System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());m.work();}}


五、final关键字
final关键字是最终的意思,可以修饰类,成员变量,成员方法。
修饰类,类不能被继承
修饰变量,变量就变成了常量,只能被赋值一次
修饰方法,方法不能被重写

六、接口
接口概述:
Java中就提供了接口来定义这些额外功能,并不给出具体实现。
接口特点
接口用关键字interface表示
格式:interface 接口名 {}
类实现接口用implements表示
格式:class 类名 implements 接口名 {}
接口不能实例化
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,接口多态。
接口的子类
要么是抽象类
要么重写接口中的所有抽象方法
成员变量
只能是常量
默认修饰符 public static final
构造方法
没有,因为接口主要是扩展功能的,而没有具体存在
成员方法
只能是抽象方法
默认修饰符 public abstract
类与类,类与接口以及接口与接口的关系
类与类
继承关系,只能单继承,但是可以多层继承
类与接口
实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口
接口与接口
继承关系,可以单继承,也可以多继承
抽象类和接口的区别
成员区别
抽象类 变量,常量;有抽象方法;抽象方法,非抽象方法
接口 常量;抽象方法
关系区别
类与类 继承,单继承
类与接口 实现,单实现,多实现
接口与接口 继承,单继承,多继承
设计理念区别
抽象类 被继承体现的是:”is a”的关系。共性功能
接口 被实现体现的是:”like a”的关系。扩展功能

//定义抽烟接口interface Smoking {//抽烟的抽象方法public abstract void smoke();}//定义抽象人类abstract class Person {//姓名private String name;//年龄private int age;public Person() {}public Person(String name,int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//吃饭();public abstract void eat();//睡觉(){}public void sleep() {System.out.println("睡觉觉了");}}//具体老师类class Teacher extends Person {public Teacher() {}public Teacher(String name,int age) {super(name,age);}public void eat() {System.out.println("吃大白菜");}}//具体学生类class Student extends Person {public Student() {}public Student(String name,int age) {super(name,age);}public void eat() {System.out.println("吃红烧肉");}}//抽烟的老师class SmokingTeacher extends Teacher implements Smoking {public SmokingTeacher() {}public SmokingTeacher(String name,int age) {super(name,age);}public void smoke() {System.out.println("抽烟的老师");}}//抽烟的学生class SmokingStudent extends Student implements Smoking {public SmokingStudent() {}public SmokingStudent(String name,int age) {super(name,age);}public void smoke() {System.out.println("抽烟的学生");}}class InterfaceTest2 {public static void main(String[] args) {//测试学生SmokingStudent ss = new SmokingStudent();ss.setName("张三");ss.setAge(27);System.out.println(ss.getName()+"---"+ss.getAge());ss.eat();ss.sleep();ss.smoke();System.out.println("-------------------");SmokingStudent ss2 = new SmokingStudent("李四",30);System.out.println(ss2.getName()+"---"+ss2.getAge());ss2.eat();ss2.sleep();ss2.smoke();}}






0 0
原创粉丝点击