Java--带你深入了解封装、继承与方法重写。超多细节~不能错过哦

主要内容

  1.封装以及private关键字

  2.This关键字

  3.构造方法

  4.Static关键字

  5.继承

  6.super关键字

  7.访问权限修饰符

  8.方法重写

  9.final关键字

一、 封装以及private关键字

封装的引入

  我们知道类的作用是用来组织代码,封装数据的,那么封装数据到底是什么含义呢?我们先来看如下代码 :

classStudent{String name;intage;}publicclassPrivateDemo01{publicstaticvoidmain(String[] args){// 创建学生对象Student s =newStudent();s.name ="小红";      s.age =-100;}}

通过上述代码可以发现以下两个问题

1.我们能够在外界直接访问学生对象的姓名和年龄,但是在实际开发当中有一些数据是不能够外界能够直接访问的,是对象所私有的。

  2.我们也能够直接在外界修改用户的年龄为负数,年龄是不可能出现负数的,所以我们同时也希望在给成员变量修改值之前能够做数据校验

针对以上两个问题,我们可以使用封装来解决,需要使用到一个访问权限修饰符 private

封装概述

隐藏对象的属性和功能实现,仅对外提供公共访问方式

封装的步骤

  1.给成员加上private关键字

  2.对外提供公共的访问方式 (get/set方法)

  3.在get/set方法里面添加相应的逻辑业务代码或者数据校验代码

封装的好处

1.提高了代码的复用性。

2.提高了程序安全性

加入封装后代码如下:

classStudent{privateString name;privateintage;privatebooleanisMarried;publicStringgetName(){returnname;}publicvoidsetName(String name){this.name = name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age = age;}publicbooleanisMarried(){returnisMarried;}publicvoidsetMarried(booleanisMarried){this.isMarried = isMarried;}}

代码示例

封装一个书本类

classBook{privateString bookName;privateString author;privatedoubleprice;publicvoidshow(){System.out.println("Book [bookName="+this.bookName +", author="+ author +", price="+ price +"]");}publicStringgetBookName(){returnbookName;}publicvoidsetBookName(String bookName){this.bookName = bookName;}publicStringgetAuthor(){returnauthor;}publicvoidsetAuthor(String author){this.author = author;}publicdoublegetPrice(){returnprice;}publicvoidsetPrice(doubleprice){this.price = price;}}

二、 This关键字

This的引入

   当成员变量和局部变量重名的时候使用 this

This概述

   this代指当前对象,本质就是一个地址,变量,和当前对象指向同一个堆区的空间

this的特点:

  1.每次new一个对象,都会创建一个变量 this指向同一堆区的空间

  2.this代指当前对象,谁new或者谁调用方法,this就代指谁

  3.this只能够出现类的内部类

  4.static上下文中不能够出现this或者super(后面讲解 static和继承 的时候详细讲解)

  5.默认在类的内部访问成员默认可以省略this

应用场景:

   1.当局部变量和成员变量重名

   2.当需要在类的内部访问类的成员

   3.访问本类构造方法的时候可以使用this (后面讲解构造方法的时候详细讲解)

代码示例

代码书写一个苹果手机类

class AppleMobile {privateStringbrand;privateStringcolor;privatedoubleprice;publicStringgetBrand() {returnbrand;}publicvoidsetBrand(Stringbrand) {this.brand = brand;}publicStringgetColor() {returncolor;}publicvoidsetColor(Stringcolor) {this.color=color;}publicdoublegetPrice() {returnprice;}publicvoidsetPrice(doubleprice) {this.price = price;}}

三、构造方法

构造方法的引入

   通过一个一个初始化成员变量非常麻烦,Java可以使用构造方法

构造方法的格式:

[访问权限修饰符] 方法名(参数列表) {

方法体 // 帮助我们快速初始化成员

}

构造方法的特点

  1.构造方法的方法名必须和类名保持一致,连void都没有

  2.构造方法也可以方法重载

  3.构造方法不能够递归

  4.如果我们自己没有编写构造方法,那么系统会帮我们书写一个无参构造方法

  5.一旦我们写了一个带参构造方法,那么就会覆盖系统的无参构造方法,如果这个时候使用无参构造方法,那么编译会报错

  6.习惯: 一般建议写上无参构造方法

如果没有无参构造方法,很多框架会在运行的时候报错

框架很多时候都是利用反射技术,反射技术可以动态创建对象,动态创建对象都是调用无参构造方法

7.构造方法除了可以初始化成员,还可以结合 this super new 关键字使用

目前初始化成员的方法有几种:

1.set方法

2.构造方法

3.普通方法

代码示例

  创建Employee类

   属性:姓名,年龄,性别,工资。

   方法:显示对象的属性值,工作。work

   要求:属性要封装

     创建3个对象

     构造函数重载

classEmployee{privateString name;privateintage;privateString gender;privatedoublesalary;publicEmployee(){}publicEmployee(String name,intage){this.name = name;this.age = age;}publicEmployee(String name,intage, String gender,doublesalary){this.name = name;this.age = age;this.gender = gender;this.salary = salary;}publicvoidshowInfo(){System.out.println("Employee [name="+ name +", age="+ age +", gender="+ gender +", salary="+ salary +"]");}publicvoidwork(){System.out.println("Emoloyee.work()");}publicStringgetName(){returnname;}publicvoidsetName(String name){this.name = name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age = age;}publicStringgetGender(){returngender;}publicvoidsetGender(String gender){this.gender = gender;}publicdoublegetSalary(){returnsalary;}publicvoidsetSalary(doublesalary){this.salary = salary;}}

四、Staic关键字

static关键字的引入

  为什么需要学习static关键字?

   多个对象共享同一分数据,可以使用static修饰

static的特点:

  1.静态变量属于类的,不属于具体的对象

  2.访问静态成员的方式:

     The static field Student.nationality should be accessed in a static way

    a.通过对象访问静态成员 (不建议)

    b.通过类访问 (推荐)

  3. 静态变量又称为 类变量,不使用static修饰的变量成为非静态变量

  4. 静态即可以修饰成员变量,还可以修饰方法

    static 修饰方法的好处 可以方便外界在不创建对象的情况下直接调用方法,执行功能

    static 修饰方法常用来编写工具类 Utils Objects Arrays

工具类的编写步骤:

a. 构造方法私有

b. 所有成员方法添加 static 关键字

  5. 静态环境下不能够访问非静态变量,非静态环境下可以访问静态变量

     Cannot make a static reference to the non-static field name

  6. 静态修饰的变量在类加载的时候加载到方法区的静态区

  7. static还可以修饰 代码块 和 类(内部类)

五、 继承

继承的引入

  例如:有三个学生小明,小红,小李都有姓名,年龄,身高,体重,都会吃,睡,学习等等,我们可以将这些属性和行为抽象出来成为一个类,也就是学生类。

  假设多个类存在相同属性和行为时,我们同样可以将这些内容抽取到单独的一个类中,那么这多个类没有必要再定义这些属性和行为,只需要继承这个单独的类就好了,这就是继承。

  例如:小学生,中学生,大学生,他们都有姓名,年龄,学号的属性,交学费的行为,我们可以把这些相同的属性和行为抽取出来放到单独的一个学生类中,小学生,中学生,大学生只需要继承学生类就好了,这样大大减少了代码量。

  总结:类是对一批对象的抽象,继承是对某一批类的抽象。

继承概述

  继承的本质: 类是对一批对象的抽象,继承是对一批类的抽象,继承本质就是抽取多个类共性代码.

继承的格式

class 子类 / 派生类 extends 父类/基类/超类 {

}

通过extends关键字可以实现类与类的继承

被继承的这个类称为父类,基类或者超类

继承的这个类称为子类或者派生类

继承的好处

1.简化了代码

2.提高了扩展性和可维护性

3.继承是多态的必要条件 (后面讲解多态的时候详细讲解)

继承的缺点

  建立了类与类之间的关系,违背高内聚,低耦合的设计原则,如果父类方法发生了修改,那么子类也会被影响, 牵一发动全身,继承的缺点是无法弥补的。

  所以继承要慎用,尽量利用继承的优点。

继承的注意事项

  1.继承不支持多继承,但是支持多层继承

  2.如果一个父类的属性使用private修饰,那么该属性对子类不可见

  3.如果子类集成了父类的属性和方法,那么子类还可以有自己的属性和方法

  4.如果子类属性覆盖了父类属性,那么子类优先

  5.子类不能够继承父类的构造方法

如何来使用继承

  1.先写子类

  2.观察多个子类之间是否存在共性代码

  3.定义父类保存多个子类的共性代码,将子类继承父类

  4.将子类共性代码删除

  5.验证 : 检查子类和父类之间是否满足 is a 的关系

继承的应用场景

  1.抽取共性代码

  2.当设计一个非常复杂的类的时候可以考虑使用继承

  3.当使用多态的时候必不可少地需要用到继承

代码示例:

classStudent{publicStringname;public int age;publicStringgetName() {returnname;}public void setName(Stringname) {this.name = name;}public int getAge() {returnage;}public void setAge(int age) {this.age = age;}public void study() {System.out.println("Good Good Study! Day Day Up!");}}classPrimaryStudentextendsStudent{}classMiddleStudentextendsStudent{}classCollegeStudentextendsStudent{}

六、super关键字

super关键字的引入

  能够帮助子类 初始化 父类继承下来的成员,从而简化代码

super概述

   this代表当前对象,创建任何一个对象,都会创建一个this引用和该对象指向同一个堆区的空间,this就是一个地址。

   super代表父类存储空间的标识,super可以通过这个标识访问父类的成员,super可以理解为父类对象.

  如何来理解super仅仅是一个标识,而非一个对象?

  super关键字在java中的作用是使被屏蔽的成员变量或者成员方法变为可见,或者说用来引用被屏蔽的成员变量或成员方法,super只是记录在对象内部的父类特征(属性和方法)的一个引用。什么叫被屏蔽的成员变量或成员方法?就是被子类重写了的方法和定义了跟父类相同的成员变量,由于不能被继承,所以就称作被屏蔽。

super的特点:

  1.为什么访问子类构造方法之前会访问父类构造方法? – 访问父类无参构造方法导致所有的父类的静态成员和静态代码块被加载,最终根类Object类的注册方法也会被加载

  2.访问子类构造方法会访问父类构造方法,那么会不会创建子类对象的同时创建父类对象? 不会 使用super/this方法构造方法就相当于调用普通方法,需要创建对象访问构造方法必须结合 new 关键字。

  3.任何一个构造方法第一句都会先访问父类无参构造方法。

  4.this super 访问构造方法必须出现第一句。

  5.this 和 super 访问构造方法不能够共存。

  6.super可以访问父类的成员变量和成员方法。

  7.static上下文不能够出现this super。

应用场景:

  1.访问父类成员变量,成员方法,构造方法

  2.能够帮助子类 初始化 父类继承下来的成员,从而简化代码

代码示例

publicclassSuperDemo02{publicstaticvoidmain(String[] args){Son son =newSon();son.show();}}classFather{intnum =30;publicvoidshow(){intnum =40;System.out.println(num);}}classSonextendsFather{intnum =20;publicvoidshow(){intnum =10;// 希望打印结果是 10System.out.println(____);// 希望打印结果是 20System.out.println(____);// 希望打印结果是 30System.out.println(____);// 希望打印结果是 40____}}

以下程序的输出结果是: C

A.10         B. 20

C. 编译报错      D. 0

publicclassSuperDemo03{publicstaticvoidmain(String[] args) {Zi zi =newZi();System.out.println(zi.num);}}classFu{intnum=10;public Fu(intnum) {this.num=num;}}classZiextendsFu{intnum=20;    }

七、访问权限修饰符

访问权限修饰符的引入

   为了提高类成员的安全性,Java提供了访问权限修饰符来让开发者更加方便地对权限进行控制。

访问权限修饰符的概述

   本质就是对类成员访问权限的控制,主要分为四个权限:

     public default protected private

访问级别如下图所示

访问权限修饰符的特点

  1.public 对所有类可见 (项目可见性)

  2.protected 对同包下以及同包下的子类可见 (子类可见性)

  3.default 对同包下可见 (包可见性)

  4.private 仅对本类可见 (类可见性)

  5.访问权限修饰符 可以修饰 成员变量 成员方法 构造方法, 也可以修饰类,只有 public default 可以,但是内部类可以使用 private protected 修饰

  6.访问权限修饰符的 宽严 关系

       public > protected > default > private

  7.我们经常提到的封装就是通过 访问权限修饰符 来实现的

八、方法重写

方法重写的引入

     父类的功能的实现无法满足子类的需求,需要方法重写

方法重写的特点

  1.发生在具有子父类两个关系的类中

  2.方法名称相同

  3.参数的列表完全相同

  4.返回值类型可以相同也可以是其子类

  5.访问权限修饰符不能够严于父类

  6.重写是多态的必要条件

  7.抛出的异常不能比父类的异常更大

  8.私有修饰的方法不能够被继承,就更不可能被重写

九、final关键字

概述

   用来修饰变量、方法、类,表示最终的、最后的。

final的特点

  1.final修饰类不能够被子类继承

  2.final修饰的变量表示常量

     常量不能够被二次赋值

   final修饰

成员变量

因为成员变量默认值是0,不能够被二次赋值

因为常量是在常量池中,不在堆区,所以没有默认值

局部变量

局部变量没有给默认值,所以不能被二次赋值

  3.final修饰成员方法不能够被子类重写

   4. 常用的final类有哪些? String Math

你可能感兴趣的:(Java--带你深入了解封装、继承与方法重写。超多细节~不能错过哦)