100天精通Java (基础篇) —面向对象编程1.0【Java分水岭】

目录

一、类与对象

1、养猫问题

2、使用之前学的技术解决

3、之前技术解决的缺点分析

4、代码

5、对象[属性,行为]

6、类与对象的关系示意图

 7、类与对象的区别和联系

8、对象在内存中存在形式(重点)

9、属性、成员变量、字段

二、创建对象

1、如何创建对象

 2、如何访问属性

 3、类和对象的内存分配机制

 4、成员方法


一、类与对象

1、养猫问题

张老太养了两只猫:一个名字叫小白,今年3岁,白色。还有一个叫小花,今年10岁,花色。编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名字错误,则显示:张老太没有这只猫。

2、使用之前学的技术解决

1)单独的定义变量解决

2)使用数组解决

3、之前技术解决的缺点分析

    不利于数据的管理

效率低

引出新知识点===》类与对象 (OOP)

4、代码

public class carOne {
    public static void main(String[] args) {
        Cat cat1 = new Cat();
        cat1.name = "小白";
        cat1.age = 3;
        cat1.color = "白色";

        Cat cat2 = new Cat();
        cat2.name = "小花";
        cat2.age = 10;
        cat2.color = "花色";

        System.out.println("第一只猫的信息:" + cat1.name + " " + cat1.age + " " + cat1.color);
        System.out.println("第二只猫的信息:" + cat2.name + " " + cat2.age + " " + cat2.color);

    }
}

class Cat {
    String name;
    int age;
    String color;
}

5、对象[属性,行为]

    一个程序就是一个世界,有很多事物

6、类与对象的关系示意图

 7、类与对象的区别和联系

1)类是抽象的,概念的,代表一类事物,比如人类,猫类。。。即它是数据类型。

2)对象是具体的,实际的,代表一个具体的事物,即实例。

3)类是对象的模板,对象是类的一个个个体, 对应一个实例

8、对象在内存中存在形式(重点)

9、属性、成员变量、字段

   基本介绍

1)从概念或叫法上看:  成员变量 = 属性 = 字段

即  成员变量是用来表示属性的

属性可以是基本数据类型,也可以是引用数据类型(对象,数组)

class Cat {
    String name;
    int age;
    String color;
    String[] master;
}

 2)属性是类的一个组成部分,一般是基本数据类型,也可以是引用数据类型(对象,数组)

## 注意事项和细节说明

  1)属性的定义语法同变量, 示例: 访问修饰符 属性类型 属性名;

有四种访问修饰符 public,protected,默认,private

  2)属性的定义类型可以为任意类型, 包含基本数据类型或引用数据类型

  3)属性如果不赋值,有默认值,规则和数组一样,具体说:int 0, short 0, byte 0, float 0.0, double 0.0, char \u0000, boolean false, String null

二、创建对象

1、如何创建对象

   1)先声明再创建   

Cat cat;//声明对象 cat

cat = new Cat();//创建

  2)直接创建

Cat cat = new Cat();

 2、如何访问属性

  1)基本语法

对象名.属性名;

案例演示赋值和输出

cat.name;
cat.age;
cat.color;

  2)类和对象的内存分配机制(重点)

看如下代码实例

Person p1 = new Person();
p1.age = 10;
p1.name = "小明";
Person p2 = p1;
System.out.println(p2.age);

p2.age输出多少?画出内存图

 3、类和对象的内存分配机制

## Java内存的结构分析

1)栈: 一般存放基本数据类型(局部变量)

2)堆: 存放对象、数组等

3)方法区: 常量池(常量,比如字符串),类加载信息

4)示意图 

## Java创建对象的流程简单分析

Person p = new Person();
p.name = "Jack";
p.age = 10;

1)先加载Person类信息(属性和方法信息,只会加载一次)

2)在堆中分配空间,进行默认初始化

3)把地址赋给 p, p 就指向对象

4)进行指定初始化 , 比如p.name = "Jack"  p.age = 10;

看如下代码,进行分析

Person a = new Perosn();
a.age = 10;
a.name = "小明";
Person b = new Person();
b = a;
System.out.println(b.name);//小明
b.age = 20;
b = null;
System.out.println(a.age);//20
System.out.println(b.age);//异常

 4、成员方法

1)基本介绍

    在某些情况下,我们需要定义成员方法(简称方法),比如人类:除了有一些属性外(年龄,姓名。。。),我们人类还有一些行为,比如:可以说话、跑步...,通过学习,还可以做算术题。这时就要用成员方法才能完成。

2)成员方法快速入门

   添加speak成员方法,输出“我是一个好人”

   添加cal01 成员方法,可以计算从1+...+1000的结果

   添加cal02 成员方法,该方法可以接收一个数 n, 计算从1+...+n的结果

   添加getSum 成员方法,可以计算两个数的和

代码: 

import java.util.Scanner;
public class Method01 {

    public static void main(String[] args) {
        Person p = new Person();
        p.speak();
        p.cal01();
        System.out.println("请输入需要进行叠加计算的数:");
        Scanner myScanner = new Scanner(System.in);
        int n = myScanner.nextInt();
        p.cal02(n);
        System.out.println("请输入要进行相加的两个数字:");
        Scanner myScanner1 = new Scanner(System.in);
        Scanner myScanner2 = new Scanner(System.in);
        int num1 = myScanner1.nextInt();
        int num2 = myScanner2.nextInt();
        int sum = p.getSum(num1,num2);
        System.out.println("两数之和为:"+ sum);
    }
}

class Person{
    String name;
    int age;

    public void speak(){
        System.out.println("我是一个好人!!!");
    }

    public void cal01(){
        int res = 0;
        for (int i =1; i < 1000; i++){
            res += i;
        }
        System.out.println("cal01方法 计算结果是" + res);
    }

    //(int n) 形参列表, 表示当前有一个形参 n ,可以接受用户的输入
    public void cal02(int n){
        int res = 0;
        for (int i = 1; i < n; i++){
            res += i;
        }
        System.out.println("cal02方法 计算结果是:" + res);
    }

    public int getSum(int num1,int num2){
        int sum = num1 + num2;
        return sum;
    }
}

 3)方法的调用机制原理:(重点-示意图)

4)为什么需要成员方法

  看一个需求:

请遍历一个数组,输出数组的各个元素值。

解决思路1:传统方法,使用单个for循环,将数组输出

解决思路2:定义一个类MyTools,然后写一个成员方法,调用方法实现

public class Method02 {
    public static void main(String[] args) {
        int[][] map = {{0,0,0},{1,1,1},{2,2,2}};
        Mytools a = new Mytools();
        a.printArr(map);
    }
}

class Mytools{
    public void printArr(int[][] map){
        for (int i = 0; i < map.length; i++){
            for (int j = 0; j <map[i].length; j++){
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }
}

5)成员方法的好处

  1、提高代码的复用性

  2、可以将实现的细节封装起来,然后供其他用户来调用

6)成员方法的定义

  访问修饰符 返回数据类型 方法名(形参列表...){//方法体

    语句;

    return 返回值;

}

3、形参列表:表示成员方法输入  cal(int n) ,  getSum(int num1,int num2)

4、返回数据类型:表示成员方法输出, void 表示没有返回值

5、方法主体:表示为了实现某一功能代码块

6、return  语句不是必须的

7)注意事项和使用细节

##访问修饰符:

    如果不写访问修饰符,默认访问   【具体有四种访问修饰符:public,protected,private,默认】

##返回值类型:

    1)一个方法最多有一个返回值(若需要返回多个返回值,则可以返回数组)

    2)返回类型可以为任意类型,包括基本数据类型和引用数据类型(数组、对象)

    3)如果方法要求有返回值类型,则方法主体最后要有 return 值,而且要求返回值类型必须和return 值类型一致或者兼容

    4)如果方法是void,可以没有return 语句 ,或者 只写 return;

## 方法名

    遵循驼峰命名法,最好见明知义,表达出该功能的意思

##形参列表

    1)一个方法可以有零个形参,也可以有多个形参,中间用逗号隔开  例如:public void getSum(int num1, int num2)

    2)形参类型可以为任意数据类型,包括基本数据类型和引用数据类型(对象,数组)

    3)调用带参数的方法时,要对应传入相同类型或者兼容类型的参数

    4)方法定义时的参数称为形式参数,简称形参;方法调用时的参数称为实际参数,简称实参,形参和实参的类型要一致或者兼容,个数,顺序也必须一致。

##方法体

   里面写实现功能的具体的语句,可以为输入、输出、变量、运算、分支、循环、方法调用、但方法里不能再定义方法,即方法不能嵌套定义    

##方法调用小细节说明

   1)同一类的方法可以直接调用

   2)跨类中的方法A类调用B类中的方法,需要通过对象名调用,比如:对象名.方法名(参数)

   3)特别说明:跨类调用方法时和方法的访问修饰符有关

##练习题:

  1) 编写类 AA , 有一个方法: 判断一个数是奇数 odd 还是偶数, 返回 boolean

import java.util.Scanner;
public class Exercise01 {
    public static void main(String[] args) {
        //1) 编写类 AA , 有一个方法: 判断一个数是奇数还是偶数,
        // 返回 boolean
        Scanner myScanner = new Scanner(System.in);
        System.out.println("请输入要判断奇偶的数字:");
        int n = myScanner.nextInt();

        AA a = new AA();
        if (a.judgeParity(n)){
            System.out.println("该数字为偶数");
        }else {
            System.out.println("该数字为奇数");
        }
    }
}

class AA{
    public boolean judgeParity(int n){
        if (n % 2 == 0){
            return true;
        }else{
            return false;
        }
    }
}


  2) 根据行、 列、 字符打印 对应行数和列数的字符, 比如: 行: 4, 列: 4, 字符#,则打印相应的效果

import java.util.Scanner;
public class Exercise01 {
    public static void main(String[] args) {
//2) 根据行、 列、 字符打印 对应行数和列数的字符,
 比如: 行: 4, 列: 4, 字符#,则打印相应的效果
        

        System.out.println("请输入一个字符: ");
        char n = myScanner.next().charAt(args.length);
        System.out.println("请输入行数:");
        int row = myScanner.nextInt();
        System.out.println("请输入列数:");
        int col = myScanner.nextInt();

        AA b = new AA();
        b.print(row, col, n);
    }
}

class AA{
    public boolean judgeParity(int n){
        if (n % 2 == 0){
            return true;
        }else{
            return false;
        }
    }
    public void print(int row, int col, char n){
        for (int i = 1; i < row; i++){
            for(int j = 1; j < col; j++){
                System.out.print(n);
            }
            System.out.println();
        }
    }
}

4)成员方法传参机制(重点)
   

    1)基本数据类型的传参机制

    基本数据类型,传递的是值,(值拷贝),形参的任何改变不影响实参

    2)引用数据类型的传参机制

    应用类型传递的是地址(传递的也是值,但只是地址),可以通过形参改变实参

5)成员方法的返回值是引用类型

    克隆对象

public class CopyPerson {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "Jack";
        p1.age = 10;
        MyTools Tool = new MyTools();
        Person p2 = Tool.copyPerson(p1);
        System.out.println(p2.age+" "+p2.name);
    }
}

class Person{
    String name;
    int age;
}

class MyTools{
    public Person copyPerson(Person p1){
        Person p2 = new Person();
        p2.age = p1.age;
        p2.name = p1.name;
        return p2;
    }
}

    未完......

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹本实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值