给出两个类:老师和学生
这两个类分别有以下组成成员:
学生:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:getXxx()/setXxx()/eat()
老师:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:getXxx()/setXxx()/eat()
由此可得出:
//学生
class Student{
String name;
int age;
public Student(){}
//getXxx()/setXxx()
public void eat(){
Systm.out.println("吃饭");
}
}
//老师
class Teacher{
String name;
int age;
public teacher(){}
//getXxx()/setXxx()
public void eat(){
Systm.out.println("吃饭");
}
}
观察上面两个代码:
发现name,age成员变量,以及getXxx()/setXxx(),还有eat()等都是相同的,如果我们后来继续定义类,举例:供人类,军人来,他们也具备这些内容。那么,我们每一次定义这样的类的时候,都要把这些重复的内容都重新定义一遍。
改进:
把这些相同的内容给定义到一个独立的类中。然后,让这些类和这个独立的类产生一个关系,有了这个关系后,这个类就可以具备这个类的功能。
为了实现这个效果,Java就提供了一个技术:继承。
表示方法:
class Fu{}
class Zi extends Fu{
}
用继承技术修改上面的代码:
class Person{
String name;
int age;
public Person(){}
//getXxx()/setXxx()
public void eat(){
Systm.out.println("吃饭");
}
class Student extends Person{
public Student(){}
}
class Teacher extends Person{
public Teacher(){}
}
继承概述:
多个类中存相同属性和行为时,将这些内容抽取到单独的一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
通过extends关键字可以实现类与类的继承
class 子类名 extends 父类名{}
单独的这个子类称为父类,集类或者超类;这多个类可以称为子类或者派生类
有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上还可以定义自己的新成员。
继承的好处:
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性(如果功能的代码需要修改,修改一处即可)
让类与类之间产生了关系,是多态的前提(其实这也是继承的一个弊端:类的耦合性很强)
java中继承的特点:
Java只支持单继承,不支持多继承
一个类只能由一个父类,不可以有多个父类.class 例如:
SubDemo extends Demo{} //正确
class SubDemo extends Demo1,Demo2... //错误、
Java支持多层继承(继承体系)
例如:
class A{}
class B extends A{}
class C extends B{}
Java中继承的注意事项:
1.子类只能继承父类所有非私有的成员(成员方法和成员变量,其实这也是继承的另一个弊端:打破了封装性)
2.子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法
3.不要为了部分功能而去继承
super 关键字
super的用法和this很像
this代表本类对应的引用
super代表父类存储空间的表示(可以理解为父类引用)
用法(this和super均可如下使用)
访问成员变量
this成员变量 super成员变量
访问构造方法(子父类的构造方法问题)
this(。。。) super(。。。)
访问成员方法(子类的成员方法问题)
this成员方法() super成员方法()
下面是两个例题:
老师和学生
/*
学生:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:getXxx()/setXxx()
老师:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:getXxx()/setXxx()
相同:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:getXxx()/setXxx()
*/
//父类
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 void setAge(int age) {
this.age=age;
}
public int getAge() {
return age;
}
}
//子类
class Student1 extends Person{
public Student1() {}
//注意
public Student1(String name,int age) {
//不能使用
//this。name=name;
//this.age=age;
//因为使用这种方法,会默认执行super(),然后name,age都被初始化
super(name,age);
}
}
//子类
class Teacher1 extends Person{
public Teacher1() {}
public Teacher1(String name,int age) {
super(name,age);
}
}
public class JiCheng2 {
public static void main(String[] args) {
//学生1,成员方法
Student1 s1 = new Student1();
s1.setName("张三");
s1.setAge(21);
System.out.println("姓名:"+s1.getName()+"---年龄:"+s1.getAge());
System.out.println("-----------------------------------------");
//学生2,构造方法
Student1 s2 = new Student1("李四", 22);
//s2.Person();
System.out.println("姓名:"+s2.getName()+"---年龄:"+s2.getAge());
System.out.println("-----------------------------------------");
//老师1,成员方法
Teacher1 t1 = new Teacher1();
t1.setName("王五");
t1.setAge(22);
System.out.println("姓名:"+t1.getName()+"---年龄:"+t1.getAge());
System.out.println("-----------------------------------------");
//老师2,构造方法
//带参构造的使用需要注意
Teacher1 t2 = new Teacher1("刘二",25);
System.out.println("姓名:"+t2.getName()+"---年龄:"+t2.getAge());
}
}
猫和狗
/*
猫:
成员变量:姓名,年龄
成员构造:无参,带参
成员方法:getXxx()/setXxx()/eat()/palyball()
狗:
成员变量:姓名,年龄
成员构造:无参,带参
成员方法:getXxx()/setXxx()/eat()/lookDoor()
相同:
成员变量:姓名,年龄
成员构造:无参,带参
成员方法:getXxx()/setXxx()/eat()
不同:
猫:palyball()
狗:lookDoor()
*/
//父类
class Animal{
private String name;
private int age;
//无参构造,初始化数据
public Animal() {}
//带参构造,赋值
public Animal(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
public void setAge(int age) {
this.age=age;
}
public int getAge() {
return age;
}
public void eat() {
System.out.println("学习太容易饿了");
}
}
//子类
class Cat extends Animal{
public Cat() {}
public Cat(String name,int age) {
super(name,age);
}
public void playBall() {
System.out.println("我喜欢唱、跳、rap、篮球");
}
}
//子类
class Dog extends Animal{
public Dog() {}
public Dog(String name,int age) {
super(name,age);
}
public void lookDoor() {
System.out.println("熊人族用不为奴");
}
}
public class JiCheng3 {
public static void main(String[] aegs) {
//方法1,采用成员方法
//猫
Cat c1=new Cat();
c1.setAge(3);
c1.setName("昆昆");
System.out.println("姓名:"+c1.getName()+"---年龄:"+c1.getAge());
c1.eat();
c1.playBall();
System.out.println("----------------------------------------");
//狗
Dog d1=new Dog();
d1.setName("雷霆咆哮");
d1.setAge(10);
System.out.println("姓名:"+d1.getName()+"---年龄:"+d1.getAge());
d1.eat();
d1.lookDoor();
System.out.println("----------------------------------------");
//方法2,采用构造方法
//猫
Cat c2=new Cat("悠米",1);
System.out.println("姓名:"+c1.getName()+"---年龄:"+c1.getAge());
c1.eat();
c1.playBall();
System.out.println("----------------------------------------");
//狗
Dog d2=new Dog("内瑟斯",11);
System.out.println("姓名:"+d1.getName()+"---年龄:"+d1.getAge());
d1.eat();
d1.lookDoor();
}
}