Skip to content

day06.方法 面向对象

java
课前回顾:
 1.内存:运行内存
   a.栈:
     方法的运行会进栈运行
   b.堆:
     引用数据类型的值,new的对象
   c.方法区:
     所有代码的"预备区"
   d.本地方法栈:
     运行带native的方法
   e.寄存器:
     和CPU有关系
 2.二维数组:
   a.定义:
     数据类型[][] 数组名 = new 数据类型[m][n]
     数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2...}...}
   b.存元素:
     数组名[i][j] =
   c.取元素:
     数组名[i][j]
   d.遍历:嵌套循环

 3.方法:拥有功能性代码的代码块,将来一个功能就应该定义一个方法
   a.通用定义格式:
     修饰符 返回值类型 方法名(参数){
         方法体
         return 结果
     }

   b.无参无返回值方法:
     public static void 方法名(){
         方法体
     }

     直接调用:方法名()

   c.有参无返回值方法:
     public static void 方法名(形参){
         方法体
     }

     直接调用:方法名(实参)

   d.无参有返回值方法:
     public static 返回值类型 方法名(){
         方法体
         return 结果
     }

     赋值调用: 数据类型 变量名 = 方法名()

   e.有参有返回值方法:
     public static 返回值类型 方法名(形参){
         方法体
         return 结果
     }

     赋值调用:数据类型 变量名 = 方法名(实参)

   f.参数和返回值的使用时机:
     参数:想将一个方法中的数据传递到另外一个方法中,用参数传递
     返回值:调用方法之后需要用到这个方法的结果,此方法需要将自己的结果返回

   g.形参和实参:
     形参:在定义方法的时候形式上定义的参数,此时参数是么有值的
     实参:在调用方法的时候给形参传递的具体的值

   h.方法注意事项
     方法不调用不执行
     方法之间不能互相嵌套
     方法的执行顺序只和调用顺序有关
     void不能和return 结果共存,但是能和return共存
     main是jvm自动调用
     调用方法的时候要完全匹配
     一个方法不能连续写多个return


今天重点:
  1.能分清什么方法是重载方法
  2.知道什么是面向对象思想
  3.知道为啥要使用面向对象编程
  4.知道什么时候使用面向对象思想编程
  5.怎么使用面向对象思想编程
  6.会用代码去描述世间万物的分类
  7.会利用new对象的形式去调用别的类中的方法

第一章.方法练习

1.方法练习 1(判断奇偶性)

java
需求:
   键盘录入一个整数,将整数传递到另外一个方法中,在此方法中判断这个整数的奇偶性
   如果是偶数,方法返回"偶数"  否则返回"奇数"

参数:
方法名:
返回值:
java
public class Demo01Method {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int data = sc.nextInt();
        String result = method(data);
        System.out.println("result = " + result);
    }

    public static String method(int data){
        if (data%2==0){
            return "偶数";
        }else{
            return "奇数";
        }
    }
}

2.方法练习 2(1-100 的和)

java
需求 :  求出1-100的和,并将结果返回
参数:不要
返回值:
方法名:
java
public class Demo02Method {
    public static void main(String[] args) {
        int result = method();
        System.out.println("result = " + result);
    }

    public static int method(){
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum+=i;
        }
        return sum;
    }
}

3.方法练习 3(不定次数打印)

java
需求:
   定义一个方法,给这个方法传几,就让这个方法循环打印几次"我是一个有经验的JAVA开发工程师"
参数:
返回值:不要
方法名:
java
public class Demo03Method {
    public static void main(String[] args) {
        method(5);
    }
    public static void method(int n){
        for (int i = 0; i < n; i++) {
            System.out.println("我爱money");
        }
    }
}

4.方法练习 4(遍历数组)

java
需求:
  在main方法中定义一个数组,将数组传递到方法中,在此方法中遍历数组
java
1742347664616

参数传递的是数组,属于引用类型,所以我们传递的是地址值

5.方法练习 5(求数组最大值)

java
需求:
  在main方法中定义数组,传递到另外一个方法中,在此方法中实现获取数组最大值
java
自己做

6.方法练习 6(按照指定格式输出数组元素)

java
需求:
  1.定义一个数组 int[] arr = {1,2,3,4}
  2.遍历数组,输出元素按照[1,2,3,4]
java
自己做

7.练习 7

java
数组作为返回值返回
java
public class Demo05Method {
    public static void main(String[] args) {
        int[] arr2 = method();
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);
        }
    }

    public static int[] method() {
        int a = 10;
        int b = 20;
        int sum = a + b;
        int sub = a - b;

        int[] arr1 = {sum, sub};
        //返回的是int型数组
        return arr1;
    }
}
1742348401332

返回值是一个数组,数组属于引用类型,返回的是地址值

第二章.方法的重载(Overload)

java
1.需求:定义三个方法,分别求两个数的和,三个数的和,四个数的和
java
public class Demo06OverLoad {
    public static void main(String[] args) {
         sum(10,20);
         sum(10,20,30);
    }

    public static void sum(int a,int b){
        int sum = a+b;
        System.out.println("sum = " + sum);
    }

    public static void sum(int a,int b,int c){
        int sum = a+b+c;
        System.out.println("sum = " + sum);
    }

    public static void sum(int a,int b,int c,int d){
        int sum = a+b+c+d;
        System.out.println("sum = " + sum);
    }
}

按住 ctrl 不放,鼠标点击,变量名,方法名,对象名等,会跳到对应的位置 -> 可以快速知道我们使用的成员在什么位置上

java
1.概述:方法名相同,参数列表不同的方法->重载方法

2.什么叫做参数列表不同:
  a.参数个数不同
  b.参数类型不同
  c.参数类型顺序不同

3.和什么无关:
  a.和返回值无关
  b.和参数名无关
java
public class Demo07OverLoad {
    public static void main(String[] args) {
        method(10,20);
    }

    public static void method(){

    }

    public static void method(int a,int b){

    }
    /*public static void method(int x,int y){

    }*/

/*    public static int method(int x,int y){
        return 0;
    }*/

    public static void method(int a,double b){

    }

    public static void method(double a,int b){

    }
}
java
public static void open(){}
public static void open(int a){}
static void open(int a,int b){}
public static void open(double a,int b){}
public static void open(int a,double b){}
public void open(int i,double d){}
public static void OPEN(){}
public static void open(int i,int j){}
1742351469438
java
1.使用场景:
  功能一样,实现细节不一样,就可以定义重载的方法
1742351609029

第三章.类和对象

java
面向对象思想:  java的核心编程思想

1.面向对象的介绍

java
1.什么是面向对象思想:java的核心编程思想
2.为什么要使用面向对象思想编程:
  有很多功能别人都写好了我们直接创建这个对象,直接拿过来用我们的功能就能实现 ->
   -> 为了少写代码
3.什么时候要使用面向对象思想编程:
  在一个类中想使用别的类实现好的功能时,就需要使用面向对象思想编程了
4.怎么使用面向对象思想编程:
  a.new呀,点呀
  b.特殊:调用带static关键字的 -> 直接类名点
java
public class Demo01Object {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4};
       /* System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i== arr.length-1){
                System.out.print(arr[i]+"]");
            }else{
                System.out.print(arr[i]+",");
            }
        }*/

        System.out.println(Arrays.toString(arr));

        System.out.println("======================");
        Random rd = new Random();
        int i = rd.nextInt(100);
        System.out.println("i = " + i);
    }
}

2.类和对象

2.1 类(实体类)_class

java
1.类分为两种:
  a.实体类 -> 世间万物的分类
  b.测试类 -> 带main方法的类 -> 为了测试代码是否能跑通的类
java
1.类的概述:
  一类事物的抽象表示形式
2.实体类包含两部分:
  属性(这个分类有啥)-> 成员变量
    a.定义格式:  数据类型 变量名
    b.定义位置:  类中方法外
    c.成员变量有默认值:
      整数 0
      小数 0.0
      字符 '\u0000'
      布尔  false
      引用  null

  行为(这个分类能干啥,有什么功能) -> 成员方法
      将之前的方法干掉static关键字,其他的一样
java
public class Person {
    //属性 -> 成员变量
    String name;
    int age;

    //行为 -> 成员方法
    public void eat(){
        System.out.println("人要吃饭");
    }

    public void drink(){
        System.out.println("人要喝水");
    }

    public void la(){
        System.out.println("人要出恭");
    }

    public void sa(){
        System.out.println("人要嘘嘘");
    }
}

描述动物类

java
public class Animal {
    String brank;
    String age;
    String color;

    public void sleep(){
        System.out.println("动物要睡觉");
    }

    public void jiao(){
        System.out.println("动物会都嚎叫");
    }
}

描述手机类

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

    public void call(String name){
        System.out.println("给"+name+"打电话");
    }

    public String sendMessage(){
        return "半夜给金莲发短信";
    }
}

2.2.对象

java
1.概述:
  一类事物的具体体现
2.使用:
  a.导包:import 包名.类名
    如果两个类不在同一个包下,使用对方的成员就需要导包
    如果两个类在同一个包下,使用对方的成员就不需要导包

  b.创建对象:想要调用哪个类的成员,就new哪个类的对象
    类名 对象名 = new 类名()

  c.调用成员(成员方法,成员变量)
    对象名.成员变量名 = 值
    对象名.方法名()
java
public class Person {
    //属性 -> 成员变量
    String name;
    int age;

    //行为 -> 成员方法
    public void eat(){
        System.out.println("人要吃饭");
    }

    public void drink(){
        System.out.println("人要喝水");
    }

    public void la(){
        System.out.println("人要出恭");
    }

    public void sa(){
        System.out.println("人要嘘嘘");
    }
}
java
public class Demo02Object {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.name);
        System.out.println(person.age);

        person.name = "涛哥";
        person.age = 18;
        System.out.println(person.name);
        System.out.println(person.age);

        person.eat();
        person.drink();
        person.la();
        person.sa();
    }
}
java
public class Phone {
    String brand;
    double price;
    String color;

    public void call(String name){
        System.out.println("给"+name+"打电话");
    }

    public String sendMessage(){
        return "半夜给金莲发短信";
    }
}
java
public class Demo03Object {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.brand = "华为";
        phone.price = 8999;
        phone.color = "黑色";
        System.out.println(phone.brand);
        System.out.println(phone.price);
        System.out.println(phone.color);

        phone.call("柳岩");
        String mess = phone.sendMessage();
        System.out.println(mess);
    }
}
1742356577298

2.3.练习

java
需求:用代码去描述一个动物类,在测试类中为动物类中的属性赋值,并且调用动物类中的功能
java
自己做

3.匿名对象的使用

java
1.int i = 10
  int:数据类型
  i:变量名
  10:具体的值

2.Person p = new Person()
  Person:数据类型
  p:变量名
  new Person():具体的值->是一个Person对象
java
1.匿名对象:new对象的时候,没有等号左边,只有等号右边的new对象部分
  有名对象:Person p = new Person()
  匿名对象:new Person()

2.使用:
  new Person().成员名

3.优缺点:
  a.优点:好使用
  b.缺点大大的:对象不能循环使用,浪费内存

4.注意:
  a.如果我们想临时的调用一次方法,我们可以使用匿名对象
  b.但是如果涉及到赋值,千万不要使用
java
public class Demo04Object {
    public static void main(String[] args) {
        //有名对象
        Person p = new Person();
        p.eat();
        p.drink();

        System.out.println("=================");

        //匿名对象
        new Person().eat();
        new Person().drink();
    }
}
java
public class Demo05Object {
    public static void main(String[] args) {
        //有名对象
        Person p = new Person();
        p.name="小明";
        System.out.println(p.name);
        System.out.println("=================");

        //匿名对象
        new Person().name="小红";
        System.out.println(new Person().name);
    }
}
1742366289424

4.一个对象的内存图

java
public class Phone {
    String brand;
    int price;

    public void call(){
        System.out.println("打电话");
    }
}
java
public class Demo01Object {
    public static void main(String[] args) {
        Phone phone1 = new Phone();
        System.out.println(phone1);//地址值
        System.out.println(phone1.brand);//默认值
        System.out.println(phone1.price);//默认值
        phone1.brand = "华为";
        phone1.price = 8999;
        System.out.println(phone1.brand);//华为
        System.out.println(phone1.price);//8999
        phone1.call();
    }
}
1742367554626

5.两个对象的内存图

1742369389189

new 了两次,开辟了两个不同的空间,修改一个空间中的数据,不会影响到另外一个空间的数据

6.两个对象指向同一片空间内存图

1742369689254

phone2 是 phone1 直接赋值的,所以会将 phone1 的地址值给 phone2,此时 phone1 和 phone2 地址值是一样的,操作的是同一片空间,所以操作一个对象的数据会影响另外一个对象的数据

第四章.成员变量和局部变量区别

java
1.定义位置不同:
  a.成员变量:类中方法外
  b.局部变量:方法内部,或者参数位置上
2.初始化值不同:
  a.成员变量:是有默认值的,不需要赋值就能直接使用
  b.局部变量:没有默认值的,必须先初始化才能使用
3.作用范围不同:
  a.成员变量:作用于整个类
  b.局部变量:只作用于自己所在的方法内部
4.内存位置不同:
  a.成员变量:在堆中,因为成员变量跟着对象走
  b.局部变量:在栈中,因为局部变量跟着方法走
5.生命周期不同:
  a.成员变量:随着对象的创建而创建,随着对象的消失而消失
  b.局部变量:随着方法的执行而创建,随着方法的弹栈而消失
java
public class Person {
    String name;//成员变量

    public void eat(){
        //局部变量
        int i = 10;
        System.out.println(i);

        int j;
        //System.out.println("j = " + j);

        System.out.println(name);
    }

    public void drink(){
        System.out.println(name);
        //System.out.println(i);
    }
}

第五章.练习

java
1.定义一个类MyDate,代表生日,类中定义三个属性,分别为 year  month  day,并为三个属性赋值
java
public class MyDate {
    int year;
    int month;
    int day;
}

public class Test01 {
    public static void main(String[] args) {
        MyDate myDate = new MyDate();
        myDate.year = 2008;
        myDate.month = 1;
        myDate.day = 1;

        System.out.println(myDate.year);
        System.out.println(myDate.month);
        System.out.println(myDate.day);
    }
}
java
2.定义一个公民类Citizen,类中定义三个属性,分别为cardId(String),name(String),MyDate(MyDate),并为三个属性赋值

  注意:如果属性为自定义的类型,赋值是需要new对象赋值,不然直接调用时会出现空指针异常
java
public class Citizen {
    String cardId;//身份证  null
    String name;//姓名   null

    /*
       自定义类型赋值,应该通过new对象赋值
     */
    MyDate myDate; //null
}
java
public class Test02 {
    public static void main(String[] args) {
        Citizen citizen = new Citizen();
        citizen.cardId = "1111111";
        citizen.name = "涛哥";
        MyDate birthday = citizen.myDate;
        birthday = new MyDate();
        birthday.year = 2008;
        birthday.month = 1;
        birthday.day = 1;

        System.out.println(citizen.cardId);
        System.out.println(citizen.name);
        System.out.println(birthday.year);
        System.out.println(birthday.month);
        System.out.println(birthday.day);

    }
}