继承是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("别说话!认真思考!");
}
}
方法重写和方法重载的区别:
每天进步一点点,离成功就不远了,一起加油!