继承是Java面向对象的三大特征之一,Java的继承是单继承的,每一个子类只有一个直接的父类;
在Java中使用extends关键字完成类的继承关系,操作格式:
class 父类{} // 定义父类
class 子类 extends 父类{} // 使用extends关键字实现继承
为什么叫子类,父类呢?我是这样理解的,父类就像人的祖先那样,那只猴,而现在的人就是猴的子类;
父类与子类用离散数学来讲就是一般和特殊的关系,(我认为)也可以说是特殊的“父类”;所以父类包含的范围比子类大的多;
写一个例子:
public class Dog{ public void eat(){ System.out.println("我会吃骨头"); } private void play(){ System.out.println("我在玩"); } } public RedDog extends Dog{ / /重写父类的eat()方法,方法重写 public void eat(){ System.out.println("RedDog 会吃骨头"); } }注意,父类中private的方法是对子类隐藏的,不能被子类继承重写。
总结类的格式: 类:属性+方法 class 类名称{ 属性; 方法([参数]){ 方法代码; } } 属性:数据类型 属性名称; 数据类型:基本数据类型 或者 引用数据类型 方法:访问修饰符 返回值数据类型 方法名称([参数]){方法体;} 访问修饰符:public protected private default 返回值数据类型: 有返回值:基本数据类型 或者 引用数据类型 方法代码中需要return 没有返回值:void修饰 参数:数据类型 参数名称 方法: --无返回值的方法 --有返回值的方法:返回的是基本 数据类型 返回引用数据类型 --无参数的方法 --有参数的方法 --方法的重载:同一个类中,方法名称相同,参数类型或者参数个数不同,实现不同功能 --特殊的方法:构造方法 --构造方法的名称与类名称一样,没有返回值,且不用void修饰 --作用:实例化对象+为类的属性初始化(属性赋值) --如果定义了一个类,那么系统会提供一个无参的什么都不做的隐藏的构造 但如果构造被重载,则提供的无参的什么都不做隐藏的构造就不存在了,除非人为显式保留 ==================================================================================== 1、Java面向对象的语言 --特征:封装性、继承性、多态性 2、封装性:就是让类的某些代码,在类的外部不可见,从而达到保护类代码安全的作用 --言外之意:不封装就会有不安全不合理的操作存在 --代码上如何实现?先要看代码不封装会存在什么问题? --如果类的属性外部可见,则会存在赋值不合理或者非法的情况,因此需要屏蔽-封装-关键字private修饰 --用关键字private修饰后,外部的确不可见了 --虽然对每个属性编写了对外的设置和取值方法后,外部可以见了,但是不合理赋值还是存在 --在相关的属性的设置和取值中加入验证,既保证外部可用,又保证属性赋值合理 3、所谓封装,其实就是用关键字private修饰属性,让属性外部不可见,之后提供属性的公共设置取值方法,在方法中加入验证 分步骤: --封装类的所有属性 -为被封装的属性提供对外的公共setter和getter方法 --在属性先关的setter和getter方法中加入验证代码,既保证外部可见属性,又保证属性赋值合理 以下就是封装的例子:
/** * @ClassName: EmployeeInfor.java * @Description: 该类的功能描述 *1、类名称必须有实际意义,可以明确描述出某一类实体,例如学生、教师等;类<属性、方法>的起名,顾名思义 *2、类中的所有属性必须使用private进行封装; *3、所有封装的属性必须提供setter和getter方法; *4、类中可以定义若干构造方法,但必须明确保留一个无参构造方法定义;构造为属性初始化,再保留无参构造 *5、类中不允许出现任何输出操作,所有的输出必须将数据返回给调用处输出;即类中提供一个可以取得对象完整信息的方法,方法名称暂定位getInfo(),提供给调用出调用输出对象完整信息;方法的返回值必须是一个具体返回值类型,不再用void修饰之后在方法中自己System.out.println() *6、编写测试类进行验证。 * @version: v1.0.0 * @date: 2019年10月11日 下午1:31:11 */ public class EmployeeInfor { public static void main(String[] args) { Employee employ = new Employee(); Scanner scan = new Scanner(System.in); System.out.println("请输入职工编号:"); int number = scan.nextInt(); employ.setEmpNo(number); System.out.println("请输入职工姓名:"); String name = scan.next(); employ.setEmpName(name);; System.out.println("请输入职位:"); String job = scan.next(); employ.setEmpJob(job); System.out.println("请输入工资:"); Float salay = scan.nextFloat(); employ.setEmpSal(salay); System.out.println(employ.getInfo()); } static class Employee{ private int empNo;//职工编号 private String empName;//职工姓名 private String empJob;//职位 private float empSal;//职工薪水 //无参构造方法 public Employee() { } /** * @param empNo * @param empName * @param empJob * @param empSal * 有参构造方法 */ public Employee(int empNo, String empName, String empJob, float empSal) { super(); this.empNo = empNo; this.empName = empName; this.empJob = empJob; this.empSal = empSal; } public int getEmpNo() { return empNo; } public void setEmpNo(int empNo) { this.empNo = empNo; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName; } public String getEmpJob() { return empJob; } public void setEmpJob(String empJob) { this.empJob = empJob; } public float getEmpSal() { return empSal; } public void setEmpSal(float empSal) { this.empSal = empSal; } public String getInfo(){ return "职工编号:"+getEmpNo()+";职工名:"+getEmpName() +";职位:"+getEmpJob()+";工资:"+getEmpSal(); } } } 最后一个是整一个继承和封装的实例; public class E { public static void main(String[] args) { Monkey m = new Monkey("小明的祖宗"); m.speak(); People2 p = new People2("小明"); p.speak(); p.think(); } } //父类 class Monkey{ public Monkey(String s){ super(); } public void speak(){ System.out.println("咿咿呀呀......"); } } class People2 extends Monkey{ public People2(String s) { super(s); } //方法覆写 public void speak(){ System.out.println("小样的,不错嘛!会说话了!"); } public void think(){ System.out.println("别说话!认真思考!"); } }方法重写和方法重载的区别:
每天进步一点点,离成功就不远了,一起加油!