java面向对象编程进阶

一、包

1.1、看一个应用场景

现在有两个程序员共同开发一个java项目,程序员某东跟某阳都希望定义一个User类,怎么去解决这个问题呢

1.2、包的三大作用
  1. 区分相同名字的类
  2. 当类很多时候,可以很好的管理类
  3. 控制访问范围
1.3、包基本语法 

package com.包名

1、package  关键字 表示打包

2、com.包名 表示包名

包的本质 实际上介绍创建不同的文件夹/目录来保存类文件

1.4、包的命名规则

只能包含数字字母下划线小圆点.,但不能以数字开头,不能是关键字或保留字

一般是com.公司名.项目名.业务模块名

com.sina.crm.user //用户模块

com.sina.crm.order //订单模块

com.sina.crm.utils //工具类

 1.5、常用的包

一个包下 , 包含很多的类 ,java 中常用的包有 :  
  1.  java.lang.*   //lang 包是基本包,默认引入,不需要再引入.
  2.  java.util.*   //util 包,系统提供的工具包, 工具类,使用 Scanner
  3.  java.net.*   //网络包,网络开发
  4.  java.awt.* //是做 java 的界面开发,GUI
1.6、如何引入包 

语法:import 包;

比如 import java.util.Scanner;引入类Scanner

二、访问修饰符

2.1、基本介绍
java 提供四种访问控制修饰符号,用于控制方法和属性 ( 成员变量 ) 的访问权限(范围) :
  1. 公开级别:public 修饰,对外公开
  2. 受保护级别:protected 修饰,对子类和同一个包中的类公开
  3.  默认级别:没有修饰符号,向同一个包的类公开.
  4. 私有级别:private 修饰,只有类本身可以访问,不对外公开.
 2.2、种访问修饰符的访问范围

 2.3、使用的注意事项
  1. 修饰符可以用来修饰类中的属性,成员方法以及类。
  2. 成员方法的访问规则和属性完全一样
  3. 只有默认的和public才能修饰类!并且遵循上述访问权限的特点

三、面向对象编程三大特征(重要!!!!) 

3.1、基本介绍
面向对象编程有三大特征: 封装 继承多态 (!!!)
3.2、封装介绍

封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作[方法],才能对数据进行操作。

3.3、封装的实现步骤(三步) 

1)将属性进行私有化private 【不能直接修改属性】
2)提供一个公共的(public)set方法,用于对属性判断并赋值
        public void setXxx(类型 参数名){//Xxx表示某个属性
                //加入数据验证的业务逻辑
                属性 = 参数名;}

3)提供一个公共的(public)get方法。用于获取属性的值

        public 数据类型 getXxx(){

        return xx;

        }

四、面向对象编程-继承 

4.1、为什么需要继承

我们编写两个类,一个Pupil类(小学生),一个是Graduate(大学毕业生),

两个类的属性跟方法有很多相似,怎么办

继承代码的复用性

4.2、继承基本介绍和示意图

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

class 子类 extends 父类{

}

  1. 子类就会自动拥有父类定义的属性方法
  2. 父类又叫超类基类
  3. 子类又叫派生类
4.4、快速入门案例
package com.hspedu.extend_.improve_;
import com.hspedu.extend_.Graduate;
import com.hspedu.extend_.Pupil;
public class Extends01 {
public static void main(String[] args) {
    com.hspedu.extend_.Pupil pupil = new Pupil();
    pupil.name = "银角大王~";
    pupil.age = 11;
    pupil.testing();
    pupil.setScore(50);
    pupil.showInfo();
    System.out.println("=======");
    com.hspedu.extend_.Graduate graduate = new Graduate();
    graduate.name = "金角大王~";
    graduate.age = 23;
    graduate.testing();
    graduate.setScore(80);
    graduate.showInfo();
    }
}

package com.hspedu.extend_.improve_;
//父类,是 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);
    }
    }
package com.hspedu.extend_.improve_;
//让 Pupil 继承 Student 类
public class Pupil extends Student {
     public void testing() {
            System.out.println("小学生 " + name + " 正在考小学数学..");
    }
}
package com.hspedu.extend_.improve_;
public class Graduate extends Student {
    public void testing() {//和 Pupil 不一样
            System.out.println("大学生 " + name + " 正在考大学数学..");
    }
}
4.5、继承给编程带来的便利
  1. 代码的复用性提高了
  2. 代码的扩展性和维护性提高了
4.6、继承的深入讨论/细节问题 
  1.  子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问
  2. 子类必须调用父类的构造器, 完成父类的初始化
  3. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无
  4. 参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
  5. 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)。
  6. super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)。
  7. super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器。
  8. java 所有类都是 Object 类的子类, Object 是所有类的基类.
  9. 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object (顶级父类)。
  10. 子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。 

五、super 关键字 

5.1、基础介绍
super 代表父类的引用,用于 访问父类的属性、方法、构造
5.2、基本语法


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

1、调用父类的构造器的好处 (分工明确, 父类属性由父类初始化,子类的属性由子类初始化)
2、当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super、this、直接访问是一样的效果
3、super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super
去访问爷爷类的成员◇如果多个基类(上级类)中都有同名的成员,使用super访问遵循就近原则。A->B->C,当然也需要遵守访问权限的相关规则

5.4、super this 的比较 


六、方法重写/覆盖(override) 

6.1、基本介绍

简单的说:方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的方法

6.2、注意事项和使用细节

子类的方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样。子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类
父类 返回类型是Object,子类方法返回类型是String
oublic Object getInfo(){
public String getInfo(){
类方法不能缩小父类方法的访问权限  public > protected > 默认> private

6.3、方法的重写和重载做一个比较 


七、多态 

什么是多态呢?

        同一个对象,在不同时刻表现出来的不同形态

举例:猫

我们可以说猫是猫:猫 cat = new 猫();

我们也可以说猫是动物:动物 animal = new 猫();

这里猫在不同的时刻表现出来了不同的形态,这就是多态

多态的前提和体现

  • 有继承/实现关系.
  • 有方法重写.
  • 有父类引用指向子类对象.
7.2、多态的成员访问 
  • 构造方法:同继承一样,子类会通过 super 访问父类构造方法

  • 成员变量:编译看左边(父类),执行看左边(父类)

        1. 多态的格式调用变量 , 指的是使用父类类型调用变量

        2. 只去查找父类的变量 , 父类中没有我们要调用的变量 , 那么就会报错

  • 成员方法:编译看左边(父类),执行看右边(子类)

        1. 多态的格式调用方法,指的是使用父类型调用方法。

        2. 方法执行时,先执行子类重写的方法,如果子类没有重写,则动态的去父类查找

        3. 多态格式调用方法时,只能调用父类型中存在的方法,不能调用子类型中特有的方法(多态的弊端)

7.3、多态的优缺点
  • 多态的好处:提高了程序的扩展性,灵活性

        多态形式体现(使用方向):

              1 定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的任意子类对象

              2 定义方法的时候, 使用父类作为方法的返回值类型 , 该方法可以返回此父类任意子类对象

              3 定义变量时 , 用父类类型变量接收子类类型对象

  • 多态的弊端:不能使用子类的特有功能

感谢大家的观看,欢迎大佬点评

  • 31
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值