面向对象编程-中级(二)-封装、继承、super

一、面向对象编程三大特征

1.1 基本介绍

面向对象编程有三大特征:封装、继承和多态。

二、面向对象编程-封装

2.1 封装介绍

在这里插入图片描述

2.2 封装的理解和好处

在这里插入图片描述

2.3封装的实现步骤 (三步)

在这里插入图片描述

2.4 快速入门案例

class Person {
	public String name; //名字公开 
	private int age; //age 私有化 
	private double salary; //..
	
	//构造器 alt+insert
	public Person() {
	}

	//自己写 setXxx 和 getXxx 太慢,我们使用快捷键 alt+insert
	//然后根据要求来完善我们的代码.
	public String getName() {
		return name; 
	}
	public void setName(String name) { 
		//加入对数据的校验,相当于增加了业务逻辑 
		if(name.length() >= 2 && name.length() <=6 ) {
			this.name = name; 
		}else {
			System.out.println("名字的长度不对,需要(2-6)个字符,默认名字");
			this.name = "无名人"; 
		}
	}
	public int getAge() { 
		return age;
	}
	public void setAge(int age) {	
		//判断
		if(age >= 1 && age <= 120) {
			//如果是合理范围
			this.age = age; 
		} else {
			System.out.println("你设置年龄不对,需要在 (1-120), 给默认年龄 18 ");
		this.age = 18;//给一个默认年龄 
		}
	}
	public double getSalary() { 
		//可以这里增加对当前对象的权限判断 
		return salary;
   }
   public void setSalary(double salary) { 
   		this.salary = salary;
   }
   

三、面向对象编程-继承

3.1 为什么需要继承

在这里插入图片描述

提高代码复用性。

3.2 继承基本介绍和示意图

继承可以解决代码复用,让我们的编程更加靠近人类思维.**当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,**在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来声明继承父类即可。
在这里插入图片描述

3.3 继承的基本语法

在这里插入图片描述

3.4 快速入门案例

//父类,是 Pupil 和 Graduate 的父类 
public class Student {
	//共有属性
	public String name;
	public int age;
	//私有属性
	private double score;//成绩 
	
	//共有的方法
	public void setScore(double score) {
		this.score = score; 
	}
	public void showInfo() {
		System.out.println("学生名 " + name + " 年龄 " + age + " 成绩 " + score);
	} 
}

//子类
public class Pupil extends Student { 
	public void testing() {
		System.out.println("小学生 " + name + "正在考小学数学..");
	} 
}
//子类
public class Graduate extends Student {
	public void testing() {//和 Pupil 不一样
		System.out.println("大学生 " + name + " 正在考大学数学..");
	} 
}

3.5 继承给编程带来的便利

  1. 代码的复用性提高了
  2. 代码的扩展性和维护性提高了

3.6 继承的深入讨论/细节问题

  1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问。
  2. 子类必须调用父类的构造器, 完成父类的初始化。
  3. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
public Sub() {
	//无参构造器
	super(); //默认调用父类的无参构造器,可以不写
	System.out.println("子类 Sub()构造器被调用....");
}
  1. 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)。
//当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器 ,如果要修改使用super指定
public Sub(String name) {
	super("tom", 30);//调用父类两个参数的构造器
	//do nothing...
	System.out.println("子类 Sub(String name)构造器被调用....");
}
  1. super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)。
  2. super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器。
  3. java 所有类都是 Object 类的子类, Object 是所有类的基类。
  4. 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)。
  5. 子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。
    思考:如何让A类继承B类和C类? 【A 继承 B, B继承C】
  6. 不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系。

3.7 继承的本质分析(重要)

在这里插入图片描述

/**
* 讲解继承的本质 
*/
public class ExtendsTheory {
	public static void main(String[] args) {
		Son son = new Son();
		//内存的布局
		//?-> 这时请大家注意,要按照查找关系来返回信息
		//(1) 首先看子类是否有该属性
		//(2) 如果子类有这个属性,并且可以访问,则返回信息
		//(3) 如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息..) 
		//(4) 如果父类没有就按照(3)的规则,继续找上级父类,直到 Object... 
		System.out.println(son.name);//返回就是大头儿子
		//System.out.println(son.age);//返回的就是 39
		//System.out.println(son.getAge());//返回的就是 39
		System.out.println(son.hobby);//返回的就是旅游
	} 
}

class GrandPa { //爷类
	String name = "大头爷爷";
	String hobby = "旅游"; 
}
class Father extends GrandPa {//父类 
	String name = "大头爸爸"; 
	private int age = 39;
	public int getAge() { 
		return age;
	} 
}
class Son extends Father { //子类 
	String name = "大头儿子";
}

在这里插入图片描述

四 super 关键字

4.1 基本介绍

super 代表父类的引用,用于访问父类的属性、方法、构造器

4.2 基本语法

在这里插入图片描述

//super 的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用 super 去访问爷爷类的成员; 
// 如果多个基类(上级类)中都有同名的成员,使用 super 访问遵循就近原则。A->B->C

4.3super 给编程带来的便利/细节

在这里插入图片描述

4.4super 和 this 的比较

在这里插入图片描述
本博客引用韩顺平老师Java课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值