初学Java继承

给出两个类:老师和学生

这两个类分别有以下组成成员:

学生:
 成员变量:姓名,年龄
 构造方法:无参,带参
 成员方法: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();
	}
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值