面向对象的特征之一:封装性

面向对象的特征之一:封装性

目录

一、类和对象

二、面向对象的优点

三、设计类时遵循的原则

四、构造方法

五、方法重载

六、封装

七、访问修饰符

八、static关键字

九、使用static、final关键字定义常量

十、学习总结​


一、类和对象


1.什么是类,什么是对象?
  类是抽象的,对象是类的具体的实例
2.如何创建对象?
  语法:new 对象名称( ) 示例:new Dog( );
3.写出在Java程序中接收控制台输入的代码
​    1.导包:import java.util.Scanner;
​     2.创建扫描仪对象: Scanner input = new Scanner(System.in);
​     3.接收输入:String str = input.next( ); int num = input.nextInt( );
4.如何从现实世界中抽象出类?
​    1)发现类 public class ClassName{ }
​    2)发现类的特征(属性)
​    3)发现类的行为(方法)

5.构造方法的作用和特点是什么?
​     1.作用:初始化对象/实例化对象
​     2.特点:方法名与类名一致 无返回值 ③ 分有参构造和无参构造
6.什么是方法重载?
概念: ①在同一个类中,方法名相同,参数列表(参数个数/参数的类型)不同,与方法的返回值无关。
举例:

System.out.println();
    System.out.println(true);
    System.out.println(100);
    System.out.println("hello java oop");

二、面向对象的优点


 面向对象(Object Oriented)
   将构成问题的事物拆解成各个对象,建立对象的目的是为了描述每个事物在整个解决问题步骤中的行为。
   优点: 易扩展、代码复用率高、利于后期扩展和维护,提升开发效率
   不足: 一定程度上增加系统开销

三、设计类时遵循的原则


   1.属性和方法的设置是为了解决业务问题
   2.关注主要属性和方法
   3.如果没有必要,勿增加额外的类、属性与方法

四、构造方法


问题: 实现种植苹果树功能时,先通过new关键字创建对象,再给属性赋值,需要使用多条语句才能完成

 AppleTree appleTree = new AppleTree();
    appleTree.setBrand(“金帅”);


可否在创建对象的同时完成赋值操作?
分析:使用构造方法
构造方法 是一种特殊的方法,用于完成对象的初始化

定义示例:

private String brand;
    //无参
    public AppleTree() {
         this.brand = "金帅";//this关键字是对一个对象的默认引用,这里用以区分同名成员变量
    }
    //有参,一旦自定义构造方法,系统将不再提供默认无参构造方法 
    public AppleTree(String brand) {
            this.brand = brand;
    }
    //有参
    public AppleTree(String name,String brand,int growTime,int harvestTime,int numsOfFruits)  {
         this.name = name;
         this.brand = brand;
         this.growTime = growTime;
         this.harvestTime = harvestTime;
         this.numsOfFruits = numsOfFruits;
    }

调用示例:

AppleTree appleTree = new AppleTree();  //调用无参构造方法
    appleTree.print();     

    AppleTree fuji = new AppleTree("富士"); //调用带参构造方法
    fuji.print();
    
    AppleTree pinkLady = new AppleTree("苹果树","粉红佳人",12,3,80);
    pinkLady.print();

常见错误:
 当在类中定义了有参构造,无参构造将会被覆盖,从而导致引发编译错误
this关键字
    this是对一个对象的默认引用

调用成员变量
        调用成员方法
        调用已定义的构造方法

    因为 this 关键字是在对象内部指代自身的引用,所以它只能调用实例变量、实例方法和构造方法,不能调用类变量和类方法,也不能调用局部变量

五、方法重载


如下代码中AppleTree类的3个构造方法有什么共性特征

 public AppleTree() {
        //省略初始化代码
    }
    public AppleTree(String brand) {
        //省略初始化代码
    }
    public AppleTree(String name,String brand,int growTime)  {
       //省略初始化代码
    }


生活中方法重载案例

 public class Player {
        public void Play(歌曲) {  
            //演唱歌曲
        }
        public void Play(钢琴) {
            //弹奏钢琴
        }
        public void Play(剧本) {
            //根据剧本表演
        }
    }

模仿举例:
 榨汁机 榨汁方法 参数(苹果、梨子、西瓜) 果汁
 运动员 运动方法 参数(体育用品 篮球、乒乓球、橄榄球) 运动
结论:

1.在同一个类中
    ​    2.方法名称相同
    ​    3.参数列表不同(参数的个数和参数类型以及参数的顺序)

    构造方法也属于方法的重载

常见错误: 如下代码所示

 class CompSalary {
       public void Pay(SE se)  {
            float money = se.BasePay + se.MeritPay;
            System.out.println("程序员的薪水:" + money);
        }
        public String Pay(SE se)  {
            float money = se.BasePay + se.MeritPay;
            return money.ToString();
        }
        ……
     }

结论: 4.名称以及参数列表相同的方法,仅仅是返回值类型不同,不能称之为方法重载。

六、封装


问题:下面代码有什么缺陷?如何解决设计的缺陷?

  AppleTree appleTree = new AppleTree();
    appleTree.name = "西瓜";//

方案:使用封装
面向对象三大特征之一 :封装
将类的某些信息隐藏在类内部,不允许外部程序直接访问
而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装的好处:

封装的步骤:
   1.修改属性的可见性——>设为private
   2.为每个属性创建公有的getter/setter方法——>getter:可读/setter:可写
   3.在getter/setter方法加入属性读写时的控制语句——>判断属性值的合法性

七、访问修饰符


  问题: Java中,如何限制和制约类之间的访问关系?
   . 包
   .访问修饰符
   .类的访问修饰符

修饰符/作用域同一包中  非同一包中
 public    可以使用可以使用
默认修饰符可以使用  不可以使用

类成员的访问修饰符

修饰符/作用域 同一类中同一包中子类中外部包
private 可以使用不可以使用 不可以使用不可以使用
默认修饰符 可以使用可以使用可以使用不可以使用
protected  可以使用 可以使用可以使用不可以使用
public  可以使用可以使用可以使用可以使用

八、static关键字


   问题: Java中,是否可以通过类名直接访问类的成员?
   方案: 使用static关键字可以实现,用 static 修饰的属性、方法和代码块属于它所在的类,由这个类创建的所有对象可以共用同一个static成员。

public static void main(String[] args) {
       Hello.sayHi();
    }

    public class Hello{
      //静态方法
      public static void sayHi(){
         System.out.println("Hello World!");
      }  
    }

调用静态成员的语法: 可直接调用类的成员,不需再消耗资源反复创建对象。

 类名.成员变量名
 类名.成员方法名();

  使用static 修饰的属性称为静态变量或类变量
  没有使用 static 修饰的属性称为实例变量
  static: 静态,可用于修饰 属性、方法、内部类
  使用static关键字修饰类变量、代码块

package com.aiden;
    
    /**
    * @author Aiden
    */
    public class StaticExample {
    public static int i;         //静态变量
    public static int j = 10; //静态变量
    public int k;                 //实例变量
    //静态代码块
    static {  
        System.out.println("*******执行静态代码块*********");
        i = 20;
        System.out.println("初始化k的值为" + i);
        System.out.println("初始化j的值为" + j);
    }
    //构造函数
    public StaticExample() {
       System.out.println("*******执行构造方法创建对象*******");
       k = 30;
       System.out.println("初始化k的值为:" + k);
    }
    
    /**
     *测试方法
     *@param args
     */
      public static void main(String[] args) {
      StaticExample se = new StaticExample();
      System.out.println("*******main()方法中修改变量值*******");
      se.k++;             //引用实例变量
      StaticExample.j++;  //引用静态变量
      System.out.println("当前的i的值为:" + StaticExample.i);
      System.out.println("当前的j的值为:" + StaticExample.j);
      System.out.println("当前的k的值为:" + se.k);
      }
    }

输出结果:

注意事项:
   1.方法里,不可以定义static变量,即:类变量不能是局部变量
   2.static代码块在JVM初始化阶段执行,只会执行一次,一般情况下, 使用static代码块对static变量进行初始化。
使用static关键字修饰类方法

Java方法分类
   静态方法(又称类方法):使用 static 关键字修饰的方法
   实例方法:未使用 static 关键字修饰的方法

public class StaticExample {
       public static int i;
       public static int j = 10;
       public int k;

    //省略静态代码块、构造方法
    public static void staticMethod(){
        System.out.println("*******执行静态方法*******");
        //先创建对象,再通过对象访问其成员变量k
        StaticExample se = new StaticExample();
        se.k = 25;//这里k为非静态属性
        System.out.println("k的值为"+se.k);
      }
    }

静态方法的调用: 用类名直接调用静态方法

public static void main(String[] args) {
       //省略其他调用代码……
       StaticExample.staticMethod(); 
    }

下面代码是否正确?
使用static修饰与非static修饰的类成员的区别

static、非private修饰 非static、private修饰
属性  类属性、类变量    实例属性、实例变量
方法  类方法   实例方法
调用  类名.属性 类名.方法() 对象.属性 对象.方法()对象.属性 对象.方法()
归属  类     单个对象

九、使用static、final关键字定义常量


   问题: 以农场游戏为例,在生长过程中,作物生长状态值:生长期、采摘期和已死亡,不会发生变化,如何定义这样的变量?
   方案: 通常使用static final关键字定义类的常量

//定义常量类保存作物的生长状态
    public class Constants {
       public static final String GROW = “生长期”;
       public static final String MATURE = "采摘期";
       public static final String DEAD = "已死亡";
    }

测试调用:

public class ApplyTree {
       // … …省略部分代码
       public AppleTree(String brand){
           this.brand = brand;
           this.status = Constants.GROW;//使用静态常量
       }
    }

注意事项:

1.常量名一般由大写字母组成
    2.声明常量时一定要赋初值
    3.定义常量时要求见名知意,便于阅读,易于代码修改和维护

十、学习总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值