java继承中的构造方法使用

java继承中的构造方法

引入封装的基本概念

一、封装

1、什么是封装
******封装,就是隐藏对象的属性和实现细节把属性都隐藏,通过这些公有方法访问私有属性,其中public -> protected -> default -> private(开放程度由大到小,安全性由低到高)
2.属性封装的实现

  • 修改属性的可见性来限制对属性的访问
  • 为每个属性创建一对赋值(setter)方法和取值(getter) 方法,用于对这些属性的访问
  • 在setter(存的限制)和getter(取的限制)方法中,加入对属性的存取限制

3.代码封装的好处

  • 使用封装,增加了数据访问限制,增强了程序的可维护性
  • 将变化隔离
  • 便于使用(不用了解内部构造,就完成了操作。)
  • 提高重用性
  • 提高安全性

二、构造函数

1.构造方法的作用

  • 构造方法负责对象成员的初始化工作,为实例变量赋予合适的初始值
  • 要简化对象初始化的代码,可以通过构造方法来解决
  • 创建对象
  • 初始化成员变量

2.构造方法的语法规则

  • 方法名与类名相同
  • 没有返回类型
  • 使用new关键字调用构造方法

3.两种构造方法
(1)带参数的构造方法:
通过调用带参数的构造方法,简化对象初始化的代码
带参数的构造方法
(2)无参数的构造方法
无参的构造方法
注意:
(1)构造方法的调用时机:在new对象的时候,会调用构造方法
如果定义一个类,没有添加构造方法的话?
由jvm帮助我们添加一个无参的构造方法
如果有构造方法的话,不会添加无参的构造方法

在这个测试类中通过new创建了一个p1对象,其实引用了无参数的构造方法,是jvm帮我们在类中添加了无参的构造

创建new对象

类中的无参数的构造函数应如下所示:

在这里插入图片描述

如果一个无参的构造方法被私有(private),那不会创建对象,因为 private不会出本类
![测试类](https://img-blog.csdnimg.cn/20200723195959129.png
主类测试类
可以看出,当我们把功能类(Person)中的public改为private后,测试类所创建的对象不能够成功,因为检测不到Person类中对象的存在。

三、继承

1.继承的作用
使用继承提高代码的复用性
使用多态提高代码的可扩展性及可维护性

  • 1.提高代码的复用性
  • 2.正是因为有了继承,才有了后面的多态

2.如何实现继承
(1)子类的构造方法中,通过super关键字调用父类的构造方法
(2)通过调用父类的构造方法,完成对属性值的初始化
(3)方法重写后,通过super关键字调用父类的方法
java中一切的类引入从根源来说,全都来源于Object(一切类的祖先)

3.子类与父类
(1)is-a,父类更通用、子类更具体
(2)子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性
(3)super:当前对象的直接父类的引用
(4)父类:被重写方法 子类:重写方法

四、两个实例,面向继承中的构造方法

实例一(教师类)

/**
*Teacher.java(以下JavaTeacher.java和DotNetTeacher.java的父类)
*模拟上课的状态
*/
package extendyes;

public class Teacher {
	//隶属中心
	private String school;
	//姓名
	private String name;
	/**
	 * 创建对象并初始化成员变量
	 * @param school 要设置的中心
	 * @param name 要设置的姓名
	 */
	public Teacher(String school,String name){
		this.school=school;
		this.name=name;
	}
	/**
	 * 自我介绍
	 */
	public void introduction(){
		System.out.println("大家好!我是来自于"+this.school+"中心的"+this.name+"老师");
	}
	/**
	 * 授课
	 */
	public void giveLesson(){
		System.out.println("实施理论课教授...");
	}
}

/**
*JavaTeacher.java(java老师的信息)
*/
package extendyes;

/**
 * JavaTeacher 继承于 Teacher
 * super:当前对象的直接父类的引用
 * @author Administrator
 *
 */
public class JavaTeacher extends Teacher {
	
	/**
	 * 初始化隶属中心和姓名两个属性
	 * @param school 要设置的隶属中心
	 * @param name 要设置的姓名
	 */
	public JavaTeacher(String school, String name) {
		//调用父类的构造方法,来完成我的初始化工作
		super(school, name);
	}
	/**
	 * 授课   父类:被重写方法 子类:重写方法
	 * 两者应保持一致
	 */
	public void giveLesson(){
		System.out.println("打开Eclipse...");
		//调用父类的授课方法
		super.giveLesson();
	}
}

/**
*DotNetTeacher.java
*/
package extendyes;

public class DotNetTeacher extends Teacher {
	/**
	 * 初始化成员变量
	 * @param school 要设置的隶属中心
	 * @param name 要设置的姓名
	 */
	public DotNetTeacher(String school,String name){
		//调用父类的方法完成初始化
		super(school,name);
	}
	public void giveLesson(){
		System.out.println("打开VS2015...");
		//调用父类的授课方法
		super.giveLesson();
	}
}

/**
*TestTeacher.java(测试类)
*/
package extendyes;

/**
 * 继承的作用:
 * 1.提高代码的复用性
 * 2.正是因为有了继承,才有了后面的多态
 * @author Administrator
 *
 */
public class TestTeacher {

	public static void main(String[] args) {
		//创建一名java老师
		JavaTeacher jt = new JavaTeacher("北京", "令狐冲");
		//自我介绍
		jt.introduction();
		//授课
		jt.giveLesson();
		//创建一名DotNet老师
		DotNetTeacher dt = new DotNetTeacher("西安", "东方不败");
		//自我介绍
		dt.introduction();
		//授课
		dt.giveLesson();
	}
}

效果如下:

测试类

实例二(工人类)

/**
*Person.java(以下Worker.java的父类)
*/
package extendyes;

public class Person {
	//姓名
	private String name;
	//年龄
	private int age;
	/**
	 * 获取姓名
	 * @return 姓名
	 */
	public String getName(){
		return this.name;
	}
	/**
	 * 构造方法,初始化成员变量
	 * @param name 要设置的姓名
	 * @param age 要设置的年龄
	 */
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "姓名:"+this.name+"\n年龄:"+this.age;
	}
}

/**
*Worker.java(创建一名工人类,输出他的基本信息和薪水)
*其中,成员变量salary(薪水)并不继承于父类
*/
package extendyes;

public class Worker extends Person{
	//薪水
	private double salary;
	/**
	 * 初始化姓名和年龄
	 * @param name 要设置的姓名
	 * @param age 要设置的年龄
	 */
	public Worker(String name,int age){
		super(name,age);
	}
	/**
	 * 初始化姓名和年龄,薪水
	 * @param name 要设置的姓名
	 * @param age 要设置的年龄
	 * @param salary 要设置的薪水
	 */
	public Worker(String name,int age,double salary){
		//调用本类的构造方法
		this(name,age);
		//设置薪水
		this.salary=salary;
	}
	/**
	 * 上班
	 */
	public void working(){
		System.out.println(this.getName()+"正在兢兢业业地上班...");
	}
	@Override
	public String toString() {
		return "我是一名工人;"+super.toString()+"\n薪水:"+this.salary;
	}
}

/**
*TestPerson.java(测试类)
*其中对象p1表示普通人(成员变量全部来源于父类)
*对象w1表示工人,基本姓名、年龄基本信息来源于父类,薪水这个成员变量是
子类的特有属性
*/
package extendyes;

public class TestPerson {

	public static void main(String[] args) {
		//创建一个人
		Person p1 = new Person("张无忌", 28);
		//说明一下
		System.out.println(p1);
		//创建一名工人
		Worker w1 = new Worker("任盈盈", 18,8000);
		//w1说明一下
		System.out.println(w1);
		//上班
		w1.working();
	}
}

效果如下:

测试工人类

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值