Java study(面向对象和封装)

文章目录

    • 1、面向对象
    • 2、面向对象的三个基本特征:封装、继承和多态
      • 2.1封装
      • 2.2继承
      • 2.3多态
    • 3、类和对象
      • 3.1什么是类
      • 3.2什么是对象
      • 3.3类和对象的关系
    • 4、类的定义
      • 4.1 事物与类的对比
      • 4.2 类的定义格式
    • 5、对象的创建及其使用
    • 6、一个对象的内存图
    • 7、两个对象使用同一个方法的内存图
    • 8、两个引用指向同一个对象的内存图
    • 9、使用对象类型作为方法的参数
    • 10、使用对象类型作为方法的返回值
    • 11、成员变量和局部变量的区别
    • 12、面向对象三大特征:封装性
    • 13、this关键字的作用
    • 14、构造方法
    • 15、定义一个标准类

1、面向对象

      面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节
      面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿。

import java.util.Arrays;

public class ArrayPrint01 {
    public static void main(String[] args) {
        int[] array = {10,20,30,40,50};
        //要求打印格式为[10,20,30,40,50]
        //使用面向对象过程,每一个步骤细节都要亲力亲为

        //System.out.println("hello world");
        System.out.print("[");
        for (int i = 0; i <array.length ; i++) {
            if(i == array.length-1){
                System.out.println(array[i]+"]");
            }else {
                System.out.print(array[i]+" ,");
            }
        }

        System.out.println("=================");
        //使用面向对象
        //找一个JDK给我们提供好的Arrays类
        //其中有一个toString方法,直接就能将数数组变成想要的格式的字符串
        System.out.println(Arrays.toString(array));
    }
}

2、面向对象的三个基本特征:封装、继承和多态

2.1封装

      封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

      在Java中类中成员的属性有:public, protected, < default >, private,这四个属性的访问权限依次降低。

2.2继承

      面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

  • 通过继承创建的新类称为“子类”或“派生类”。

  • 被继承的类称为“基类”、“父类”或“超类”。

2.3多态

      多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

      实现多态,有二种方式,覆盖,重载。

  • 覆盖,是指子类重新定义父类的虚函数的做法。

  • 重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

3、类和对象

3.1什么是类

      类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。

  • 属性:就是该事物的状态信息
  • 行为:就是该事物的能够做什么

3.2什么是对象

      对象:是一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。

3.3类和对象的关系

  • 类是对一类事物的描述,是抽象的。
  • 对象是一类事物的实例,是具体的。
  • 类是对象的模板,对象是类的实例。

4、类的定义

4.1 事物与类的对比

   现实世界的一类事物
      属性:事物的状态信息
      行为:事物能够做什么
  Java中用class描述事物也是如此
      成员变量:对应事物的属性
      成员方法:对应事物的行为

4.2 类的定义格式

   定义一个类,用来模拟“学生”事物。其中有两个组成部分
   属性(是什么):
         姓名
         年龄
   行为(能做什么)
         吃饭
          睡觉
          学习
对应到Java的类当中
   成员变量(属性):
         String name;//姓名
          int age;//年龄
    成员方法(行为):
          public void eat(){};//吃饭
          public void sleep(){};//睡觉
          public void study(){};//学习
注意事项:
      1.成员变量是直接定义在类当中的,在方法外边
      2.成员方法不要写static关键字

public class Student {

	String name;//姓名
    int age;//年龄
    //成员方法
    public void eat(){
        System.out.println("eat eat eat");
    }
    public void sleep(){
        System.out.println("sleep sleep sleep");
    }
    public void study(){
        System.out.println("study study study");
    }

}

5、对象的创建及其使用

      通常情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用。
      1.导包,也就是指出需要使用的类,在什么位置。
            import 包成名.类名称
            import demo1.Student;
      对于和当前类属于同一个包的情况,可以省略导包语句不写。
      2.创建,格式:
            类名称 对象名 = new 类名称();
            Student stu = new Student();
      3.使用,分两种情况
            使用成员变量:对象名.成员变量名
            使用成员方法:对象名.成员方法名(参数)
      (也就是说,想用谁,就用对象名点儿谁)
注意:
       如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组规则一样。

public class Demo02Student {
    public static void main(String[] args) {
        Student stu = new Student();

        System.out.println(stu.age);
        System.out.println(stu.name);

        stu.name = "alex";
        stu.eat();
        stu.sleep();
        stu.study();
    }

}

6、一个对象的内存图

Java study(面向对象和封装)_第1张图片

  • 1.在方法区(method area)中存放着两个.class文件 Phone.class Demo01PhoneOne.class
          Phone.class:存放成员变量和成员方法
          Demo01PhoneOne.class:存放着主函数

  • 2.在栈中首先存放着主函数main(String[] args)
          执行 Phone one = new Phone(); 结果为new Phone();在堆中的地址0x666;
    上述语句执行后,在堆(heap)中会新建一个new Phone();其中它的成员变量则会默认初始化,成员方法则会初始化为方法区中的成员方法的地址0x333。
    执行System.out.println(one.brand) System.out.println(one.price) System.out.println(one.color)
    会根据one在堆中的地址0x66查找相应的变量

  • 3.执行System.out.println(one.call)
          首先会把call(String who) 进栈,然后根据one在堆中的地址0x666,查找成员方法,然后再根据成员方法在方法区中的地址0x333获得对应的成员方法。执行结束后,将此方法出栈。

  • 4.最后主函数执行完后也会出栈。

7、两个对象使用同一个方法的内存图

Java study(面向对象和封装)_第2张图片

8、两个引用指向同一个对象的内存图

Java study(面向对象和封装)_第3张图片

9、使用对象类型作为方法的参数

      注意:当一个对象作为参数,传递到方法当中时,实际上传递进去的是对象的地址值。

public class Phone {
    String brand;
    double price;
    String color;

    public void S(){

    }
}

public class Demo01Phone {
    public static void main(String[] args) {
        Phone one = new Phone();
        one.brand = "苹果";
        one.price = 1888.0;
        one.color = "土豪金";
        method(one);    //传递进去的参数其实就是地址值

    }
   public static void method(Phone param){
        System.out.println(param.brand);
        System.out.println(param.color);
        System.out.println(param.price);
    }
}

Java study(面向对象和封装)_第4张图片

10、使用对象类型作为方法的返回值

      注意:当使用一个对象类型作为方法的返回值时:返回值其实就是对象的地址值;

public class Demo02Phone {
    public static void main(String[] args) {
        Phone two = getPhone();
        System.out.println(two.price);
        System.out.println(two.color);
        System.out.println(two.brand);

    }
    public static Phone getPhone(){
       Phone one = new Phone();
       one.color = "玫瑰金";
       one.price = 8888.0;
       one.brand = "苹果";
       return one;
    }
}

Java study(面向对象和封装)_第5张图片

11、成员变量和局部变量的区别

  • 1.定义的位置不一样
          局部变量:在方法的内部
           成员变量:在方法的外部,直接写在类当中
  • 2.作用范围不一样
          局部变量:只有方法当中才可以使用,出了方法就不能再使用
          成员变量:整个类全都可以通用
  • 3.默认值不一样
          局部变量:没有默认值,如果要想使用,必须手动进行赋值
          成员变量:如果没有赋值,会有默认值,规则和数组一样
  • 4.内存的位置不一样
          局部变量:位于栈内存
          成员变量:位于堆内存
  • 5.生命周期不同
          局部变量:随着方法进栈而诞生,随着方法出栈而消失
          成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失
public class Demo01VariableDifference {

    String name;//成员变量;
    public void methodA(){
       int num = 20;//局部变量
       System.out.println(num); 
       System.out.println(name); 
    }
    
    public void methodB(int param){//方法的参数就是局部变量
        //参数在方法调用的时候,必然会被赋值的。
        System.out.println(param);
        
        int age;//局部变量
        System.out.println(age);//没有赋值,不能使用
        System.out.println(num);//num是局部变量。错误写法
        System.out.println(name);
    }

12、面向对象三大特征:封装性

      封装性在java当中的体现:

  • 1.方法就是一种封装
  • 2.关键字private也是一种封装
    封装就是将一些细节信息隐藏起来,对于外界不可见。
public class Demo01Method {
    public static void main(String[] args) {
        int [] array = {5,15,63,1000,45,400};
        int max = getMax(array);
        System.out.println(max);
    }
    public static int getMax(int[] array){
        int max = array[0];
        for (int i = 1; i <array.length ; i++) {
            if(max < array[i]){
                max = array[i];
            }else {
                continue;
            }
        }
        return max;
    }
}
  • 3.使用private修饰时
          一旦使用了private进行修饰,那么本类当中仍然可以随意访问。但是,超出了本类范围之外就不能再直接访问了。
          间接访问private成员变量,就是定义一对getxxx/setxxx方法必须叫setxxx或者getxxx命名规则。对于getxxx来说,不能有参数,返回值类型和成员变量对应对应setxxx来说,不能有返回值,参数类型和成员变量对应
public class Person {
    String name;
    private int age;//私有成员变量

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void show(){
        System.out.println("我叫"+name+",年龄:"+age);
    }
}
  • 注意:对于基本类型当中的boolean值,getxxx方法一定要写成isxxx的形式,而setxxx规则不变。
public class Student {
    private String name;
    private int age;
    private boolean male;

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setMale(boolean male) {
        this.male = male;
    }

    public boolean isMale() {
        return male;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
public class Demo02Student {
    public static void main(String[] args) {
        Student stu = new Student();
        stu.setName("Alex");
        stu.setAge(18);
        stu.setMale(true);
        System.out.println("姓名:"+stu.getName());
        System.out.println("年龄:"+stu.getAge());
        System.out.println("姓名:"+stu.isMale());
    }
}

13、this关键字的作用

      当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量,如果需要访问本类当中的成员变量,需要使用格式:

  • this.成员变量名
  • 通过调用谁的方法,谁就是this
public class PersonThis {
    String name;
    public void sayHello(String name){
        System.out.println(name+",你好,我是"+ this.name);
    }
}

14、构造方法

      构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法。

  • 格式:
       public 类名(参数类型 参数名称){
          方法体
          }
  • 注意事项:
          1.构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样
          2.构造方法不要写返回值类型。连void都不写。
          3.构造方法不能return一个具体的返回值
          4.如果没有编写任何构造函数,那么编辑器将会默认一个构造函数,没有参数、方法体什么事情都不做
          5.一旦编写了至少一个构造方法,那么编辑器将不再赠送。
          6.构造方法也是可以进行重载的
          重载:方法名称相同,参数列表不同
public class GouZaoFunction {
    String name;
    int age;
    public GouZaoFunction(){
        System.out.println("构造方法执行了");
    }
    public GouZaoFunction(String name,int age){
        System.out.println("重构构造方法执行了");
        this.name = name;
        this.age = age;
    }
    public void setName(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

}

public class Demo01 {
    public static void main(String[] args) {
        GouZaoFunction gouZaoFunction1 = new GouZaoFunction();//无参构造函数执行
        GouZaoFunction gouZaoFunction2 = new GouZaoFunction("Alex",18); //有参构造函数执行
        System.out.println("姓名:"+gouZaoFunction2.getName()+",年龄:"+gouZaoFunction2.getAge());
        gouZaoFunction2.setAge(21);
        System.out.println("姓名:"+gouZaoFunction2.getName()+",年龄:"+gouZaoFunction2.getAge());
    }

}

15、定义一个标准类

   一个标准的类通常要拥有下面四个组成部分:

  • 1.所有的成员变量都要使用private关键字修饰
  • 2.为每一个成员变量编写一对getxxx/setxxx方法(boolean是isxxx/setxxx)
  • 3.编写一个无参数的构造方法
  • 4.编写一个全参数的构造方法

      注意:在IDEA有快捷方式创建构造函数和settr和getter方法。

Java study(面向对象和封装)_第6张图片
Java study(面向对象和封装)_第7张图片

public class Student {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

你可能感兴趣的:(java)