Java学习笔记(六)面向对象编程(基础部分)

news2024/9/9 1:05:26

Hi i,m JinXiang


⭐ 前言 ⭐

本篇文章主要介绍Java面向对象编程(基础部分)类与对象、方法重载、作用域、构造器细节、this关键字、可变参数使用以及部分理论知识


🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁

🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言


目录

一、类与对象(oop)

1.1、类与对象概述

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

上图说明

1.3、面向对象快速入门(代码直接示例)

1.4、对象内存布局

1.5、属性 / 成员变量概念

基本介绍

属性使用注意细节

1.6、创建对象访问属性

如何创建对象

如何访问属性

1.7、对象分配机制(重)

1.8、对象创建过程

1.9、成员方法

成员方法基本介绍

成员方法快速入门

代码演示上方例题

方法的调用机制

方法调用小结

使用成员方法的好处

成员方法的定义

注意事项和使用细节

类定义的完善

方法传参机制

基本数据类型的传参机制

引用数据类型的传参机制

结果:

克隆对象

递归

基本介绍

递归能解决什么问题

打印问题

阶乘问题

递归重要规则

递归练习题

1、斐波那契

2、猴子吃桃

二、方法重载

基本介绍

重载的好处

重载的快速使用

注意事项和使用细节

课堂练习

练习1、判断题

练习2、代码题

可变参数

快速入门案例

可变参数注意事项和使用细节

可变参数练习

三、作用域

基本介绍

上述说明举例

注意事项和使用细节

四、构造方法/构造器

基本介绍

看问题需求

基本语法

思路说明

基本介绍(小结)

快速入门举例

注意事项和使用细节

对象创建流程分析(包构造器版)

练习

练习1

练习2

五、this关键字

基本介绍

​编辑this本质

this小结

this注意事项和使用细节

this课堂练习


一、类与对象(oop)

1.1、类与对象概述

 对象(属性,行为) 

类:自定义数据

int : Java提供的数据类型  

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

上图说明

  • 1、创建一个对象
  • 2、实例化一个对象
  • 3、把类实例化

1.3、面向对象快速入门(代码直接示例)

package com.example.han_severejava.面向对象;

public class 类与对象引出 {
    public static void main(String[] args) {
        /*
        张老太养了两只猫猫:一只名字叫小白,今年3岁,白色。
        还有一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,
        就显示该猫的名字,年龄, 颜色。 如果用户输入的小猫名错误,
        则显示张老太没有这只猫猫。
        */
        //1、创建一只猫new Cat()(猫对象)
        //2、Cat cat1 = new Cat() 把创建的猫赋给cat1
        //3、cat1就是一个对象
        Cat cat1 = new Cat();
        cat1.name = "小白";
        cat1.age = 3;
        cat1.color = "白色";
        //创建了第二只猫 并赋给cat2
        //cat2也是一个对象(猫对象)
        Cat cat2 = new Cat();
        cat2.name = "小花";
        cat2.age = 100;
        cat2.color = "花色";

        //怎么使用(如何访问对象)
        System.out.println("第1只猫的==》姓名:"+cat1.name+" 年龄:"+cat1.age+" 颜色:"+cat1.color);

        System.out.println("第2只猫的==》姓名:"+cat2.name+" 年龄:"+cat2.age+" 颜色:"+cat2.color);
    }
}

//自定义一个类
class Cat{
    //属性
    String name;
    int age;
    String color;
}

1.4、对象内存布局

1.5、属性 / 成员变量概念

基本介绍

  • 1、从概念或叫法上看: 成员变量 = 属性 = fieldr
    • (即成员变量是用来表示属性的,授课中,统一叫属性)
    • 案例演示: Car(name,age,color) ↑
  • 2、属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)。
    • 比如我们前面定义猫类的int age就是属性
       

属性使用注意细节

  • 1、属性的定义语法同变量,示例:
    • 访问修饰符(protected)
      • 控制属性的访问范围
      • 4种属性范围(public,protected,默认,private)
    • 属性类型 
    • 属性名
  • 2、属性的定义类型可以为任意类型,包含基本类型或引用类型
  • 3、属性如果不赋值,有默认值,规则和数组一致。
    • 对象的属性默认值,遵守数组规则:
    • int 0short 0,byte 0,long 0,
    • float 0.0,double 0.0char \u0000boolean falseString null

1.6、创建对象访问属性

如何创建对象

  • 1、先声明再创建
    • Cat cat1;   //声明
    • cat1 = new Cat;  //创建
  • 2、直接创建
    • Cat cat2 = new Cat;

如何访问属性

  • 对象名.属性名
  • 如:cat1.name
  • cat1.age

1.7、对象分配机制(重)

  • 1、栈:一般存放基本数据类型(局部变量)
  • 2、堆:存放对象(Cat cat ,数组等)
  • 3、方法区:常量池(常量,比如字符串),类加载信息
  • 4、示意图[Cat (name, age, price)]

1.8、对象创建过程

  • 1、先加载Person类信息(属性和方法信息,只会加载一次)
  • 2、在堆中分配空间,进行默认初始化(看规则)
  • 3、把地址赋给p,p就指向对象
  • 4、进行指定初始化,比如:p.name = jack p.age = 10

1.9、成员方法

成员方法基本介绍

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

成员方法快速入门

  • 1)添加speak成员方法输出我是一只好人
  • 2)添加cal01成员方法,可以计算从1+..+ 1000的结果
  • 3)添加cal02成员方法,该方法可以接收一个数n,计算从1+..+ n的结果
  • 4)添加getSum成员方法可以计算两个数的和

代码演示上方例题

package com.example.han_severejava.面向对象;

import java.util.Scanner;

public class 成员方法快速入门 {
    public static void main(String[] args) {
        //方法使用
        //1、先创建对象
        Person person = new Person();

        //2、再调用方法
        person.speak();
        person.cal01();
        person.cal02();
    }
}

class Person{
    String name;
    String age;
    //方法
    //1)添加speak成员方法输出我是一只好人
    //解读:
    // 1. public表示方法是公开
    //2. void表示方法没有返回值
    //3.speak() : speak是 方法名,() 形参列表
    //4.{}方法体,可以写我们要执行的代码
    public void speak(){
        System.out.println("我是一个好人");
    }
    //2)添加cal01成员方法,可以计算从1+..+ 1000的结果
    public void cal01(){
        int count = 0;
        for (int i = 1; i <= 1000 ; i++) {
            count += i;
        }
        System.out.println("从1+...+到1000的结果是:"+count);
    }
    //3)添加cal02成员方法,该方法可以接收一个数n,计算从1+..+ n的结果
    public void cal02(){
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个数:");
        int number = input.nextInt();
        int count = 0;
        for (int i = 1; i <= number ; i++) {
            count += i;
        }
        System.out.println("从1开始+到"+number+"的结果是:"+count);
    }
    //4)添加getSum成员方法可以计算两个数的和
}

方法的调用机制

方法调用小结

  • 1.当程序执行到方法时,就会开辟一个独立的空间(栈空间)
  • 2.当方法执行完毕,或者执行到return语句时,就会返回,
  • 3.返回到调用方法的地方
  • 4.返回后,继续执行方法后面的代码
  • 5.当main方法(栈)执行完毕,整个程序退出

使用成员方法的好处

  • 1、提高代码的复用
  • 2、可以将实现的细节封装起来,然后供其他用户来调用即可

成员方法的定义

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

        语句;

        return  返回值;

}

  • 1)形参列表:表示成员方法输入cal(intn)getSum(intnum1,intnum2)
  • 2)返回数据类型:表示成员方法输出,void表示没有返回值
  • 3)方法主体:表示为了实现某一功能代码块
  • 4)return语句不是必须的。

注意事项和使用细节

  • 访问修饰符(作用是控制方法使用的范围)
    • 如果不写默认访问,[有四种:public,protected,默认,private],具体在后面说
  • 返回数据类型
    • 1)一个方法最多有一个返回值[思考,如何返回多个结果返回数组]
    • 2)返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
    • 3)如果方法要求有返回数据类型,则方法体中最后的执行语句必须为return;而且要求返回值类型必须和return的值类型一致或兼容
    • 4)如果方法是void,则方法体中可以没有return语句,或者只写return;
  • 方法名
    • 遵循驼峰命名法,最好见名知义,表达出该功能的意思即可,比如得到两个数的和getSum,开发中按照规范
  • 形参列表
    • 1.一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,比如getSum(int n1,int n2)
    • 2.参数类型可以为任意类型,包含基本类型或引用类型,比如printArr(intD[] map)
    • 3.调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数! [getSum]
    • 4.方法定义时的参数称为形式参数,简称形参;方法调用时的传入参数称为实际参数,简称实参,实参和形参的类型要一致或兼容、 个数、顺序必须致! [演示]
  • 方法体
  • 里面写完成功能的具体的语句,可以为输入、输出、变量、运算、分支、循环、方法调用,但里面不能再定义方法!即:方法不能嵌套定义。[演示]

类定义的完善

方法传参机制

基本数据类型的传参机制

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

引用数据类型的传参机制

B类中编写一个方法test100,可以接收一个数组, 在方法中修改该数组,看看原来的数组是否变化?
package com.example.han_severejava.面向对象;

public class 引用数据类型方法传参机制 {
    public static void main(String[] args) {
        Can_B b = new Can_B();
        int[] arr = {1, 2, 3};
        b.test100(arr);
        System.out.println("mian中的arr数组:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
        System.out.println();
    }
}

class Can_B{
    //B类中编写一个方法test100,可以接收一个数组, 在方法中修改该数组,看看原来的数组是否变化?
    public void test100 (int[] arr){
        arr[0] = 10;
        System.out.println("test100的arr数组:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
        System.out.println();
    }

}

结果:

引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!

克隆对象

package com.example.han_severejava.面向对象;

public class 克隆对象 {
    public static void main(String[] args) {
        Person_ p = new Person_();
        p.name = "张三";
        p.age = 18;

        MyTools tools = new MyTools();
        Person_ p2 = tools.copyPerson(p);

        //到此 p 和 p2 都是Person_对象,但是 是两个独立的对象 属性相同
        System.out.println("p的属性 age="+p.age+"名字="+p.name);
        System.out.println("p2的属性 age="+p2.age+"名字="+p2.name);
    }
}

class Person_ {
    String name;
    int age;
}

class MyTools{
    //编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象。克隆对象,
    //注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同
    //编写方法的思路
    //1. 方法的返回类型 Person
    //2.方法的名字copyPerson
    //3.方法的形参(Person p)
    //4.方法体,创建一个新对象,并复制属性,返回即可
    public Person_ copyPerson(Person_ p){
        //创建一个新对象
        Person_ p2 = new Person_();
        p2.name = p.name; //把原来的名字赋给p2.name
        p2.age = p.age;
        return p2;
    }

}

递归

基本介绍

简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决
复杂问题,同时可以让代码变得简洁
 

递归能解决什么问题

  • 各种数学问题如:
    • 8皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题(google编程大赛)[简单演示]
    • 各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.
    • 将用栈解决的问题-- >递归代码比较简洁
       
  • 列举两个小案例,来帮助大家理解递归调用机制
    • 1)打印问题
    • 2)阶乘问题
打印问题
package com.example.han_severejava.面向对象;

public class 递归打印问题 {
    public static void main(String[] args) {
        T t1 = new T();
        t1.test(4);
    }
}

class T{
    //分析
    public void test(int n){
        if (n>2){
            test(n -1);
        }
            System.out.println("n="+n);

    }
}

//结果为n=2,n=3,n=4

方法分析

阶乘问题
package com.example.han_severejava.面向对象;

public class 递归打印问题 {
    public static void main(String[] args) {
        int res = t1.factorial(5);
        System.out.println("res="+res);
    }
}

class T{
    //阶乘
    public int factorial(int n){
        if (n == 1){
            return 1;
        }else {
            return factorial(n - 1) * n;
        }
    }
}

//结果为:120 ,详细步骤看方法解析

方法分析

递归重要规则

  • 1、执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
  • 2、方法的局部变量是独立的,不会相互影响,比如n变量
  • 3、如果方法中使用的是引用类型变量(比如数组,对象),就会共享该引用类型的数据.
  • 4、递归必须向退出递归的条件逼近,否则就是无限递归,出现循环出不来,死龟了:)
  • 5、当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕

递归练习题

1、斐波那契
package com.example.han_severejava.面向对象;

public class 递归斐波那契 {
    public static void main(String[] args) {
        T_ t1 = new T_();
        int number = 7; //输入的数字
        int fibonacci = t1.Fibonacci(number);//计算得出的斐波那契数
        if (fibonacci != -1){
            System.out.println("当n="+number+"的时候,对应的斐波那契数="+fibonacci);
        }
    }
}
class T_{
    public int Fibonacci(int n){
        //请使用递归的方式求出斐波那契数1:1 ,2,3,5,8, 3...给你一个整数n,求出它的值是多
        //思路分析
        //1.当n=1斐波那契数是1
        //2.当n=2斐波那契数是1
        //3.当n>=3斐波那契数是前两个数的和
        //4.这里就是一个递归的思路
        if (n >= 1){
            //如果n大于等于1的时候,执行下面操作
            if (n == 1 || n == 2){
                return 1;
            }else {
                return Fibonacci(n - 1) + Fibonacci(n - 2);
            }
        }else {
            System.out.println("要求输入的n是>=1的整数");
            return -1;
        }
    }
}
2、猴子吃桃

package com.example.han_severejava.面向对象;

public class 递归猴子吃桃 {
    public static void main(String[] args) {
        T__ t1 = new T__();
        int day = 9;
        int peachNum = t1.peach(day);
        if (peachNum != -1){
            System.out.println("第"+day+"天有"+peachNum+"个桃子");
        }
    }
}
class T__{
    //猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一 半,并再多吃了一个!以后
    //每天猴子都吃其中的一半,然后再多吃一个。当到第10天时,想再吃时(即还没吃)
    //发现只有1个桃子了。问题:最初共多少个桃子?

    //思路分析(逆推)
    //1.day=10时有1个桃子
    //2. day =时有(day10 +. 1)*2=4
    //3.day=8时有(day9+1)*2=10
    //4.规律就是前一天的桃子 = (后一天的桃子+ 1) * 2
    //5.递归
    public int peach(int day){
        if (day == 10){ //第10天,只有一个桃子
            return 1;
        }else if(day >=1 && day <=9){
            return (peach(day + 1) + 1) * 2;
        }else {
            System.out.println("day在1-10");
            return -1;
        }
    }
}

//结果:第9天有4个桃子

二、方法重载

基本介绍

  • java中允许同一个类中,多个同名方法的存在,但要求形参列表不致!
  • 比如: System.out.println(); out是PrintStream类型

重载的好处

  • 1)减轻了起名的麻烦
  • 2)减轻了记名的麻烦

重载的快速使用

package com.example.han_severejava.面向对象;

public class 方法重载快速入门 {
    public static void main(String[] args) {
        CZ1 cz = new CZ1();
        //如何使用重载
        //调用符合对象的名称
        System.out.println(cz.calculate(1, 1));
    }
}

class CZ1{
    //两个整数的和
    public int calculate(int n1,int n2){
        return n1 +n2;
    }
    //一个整数,一个double的和
    public double calculate(int n1,double n2){
        return n1 +n2;
    }
    //一个double,一个Int和
    public double calculate(double n2,int n1) {
        return n1 +n2;
    }
    //三个int的和
    public int calculate(int n1,int n2,int n3){
        return n1 +n2 + n3;
    }

}
//结果为:2

注意事项和使用细节

  • 1、方法名:必须相同
  • 2、参数列表:必须不同(参数类型或个数或顺序,至少有一样不同,参数名无要求)
  • 3、返回类型:无要求
     

课堂练习

练习1、判断题

与void show(int a,char b,double c){}构成重载的有: [ b c d e ]
a) void show(int x,char y,double z){} //不是
b) int show(int a,double c,char b){} //是
c) void show(int a,double c,char b){} //是
d) boolean show(int c,char b){} /是
e) void show(double c){} /是
f) double show(int x,char y,double z){} //不是
g) void shows(){} //不是
 

练习2、代码题

题目:编写程序,类Methods中定义 三个重载方法并调用。方法名为m。三个方法分
别接收一个int参数、两个int参数、 一个字符串参数。分别执行平方运算并输出
结果,相乘并输出结果,输出字符串信息。在主类的main ()方法中分别用参数
区别调用三个方法。

package com.example.han_severejava.面向对象;

public class 方法重载课堂练习2 {
    public static void main(String[] args) {
        // 在主类的main ()方法中分别用参数区别调用三个方法
        CZ2 cz = new CZ2();
        cz.m(10);//100
        cz.m(10,20);//200
        cz.m("你好");
    }
}

class CZ2{
    //编写程序,类Methods中定义 三个重载方法并调用。方法名为m。
    // 三个方法分别接收一个int参数、两个int参数、 一个字符串参数。
    // 分别执行平方运算并输出,结果,相乘并输出结果,输出字符串信息。
    // 在主类的main ()方法中分别用参数区别调用三个方法。

    //分析
    //1 方法名 m
    //2 形参(int)
    //3 void
    public void m(int n){
        System.out.println("平方="+(n * n));
    }

    //1 方法名 m
    //2 形参(int,int)
    //3 void
    public void m(int n1,int n2){
        System.out.println("相乘="+(n1 * n2));
    }

    //1 方法名 m
    //2 形参(String)
    //3 void
    public void m(String n){
        System.out.println("传入的str="+n);
    }
}

可变参数

●基本概念

  • java允许将同一个类中多个同名同功能参数个数不同的方法,封装成一个方法。

基本语法

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

        

}

快速入门案例

题目:可以计算 2个数的和,3个数的和,4,5。。

package com.example.han_severejava.面向对象;

public class 可变参数快速入门 {
    public static void main(String[] args) {
        VariableParameter v = new VariableParameter();
        System.out.println(v.sum(5, 10, 11));
        System.out.println(v.sum(105, 1, 51));
    }
}
class VariableParameter{
    //思路分析
    //1. int... 表示接受的是可变参数,类型是int ,即可以接收多个int(0-多)
    //2. 使用可变参数时,可以当做数组来使用即nums 可以当做数组
    //3.遍历nums  求和即可
    int res =0;
    public int sum(int...nums){
        for (int i = 0; i < nums.length; i++) {
            res += nums[i];
        }
        return res;
    }
}

结果:26,183
 

可变参数注意事项和使用细节

  • 1)可变参数的实参可以为0个或任意多个。
  • 2)可变参数的实参可以为数组。
  • 3)可变参数的本质就是数组.
  • 4)可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
  • 5)一个形参列表中只能出现一个可变参数

可变参数练习

题目:有三个方法,分别实现返回姓名和两门课成绩(总分),返回姓名和三门课成绩(总
分),返回姓名和五门课成绩(总分)。封装成一个可变参数的方法

package com.example.han_severejava.面向对象;

public class 可变参数练习 {
    public static void main(String[] args) {
        CS cs = new CS();
        System.out.println(cs.exercises("张三",80.0,100.0));
        //System.out.println(cs.exercises("李四",80,100,1));
        //System.out.println(cs.exercises("王五",80,100,1,10,100));


    }
}

class CS{
    //有三个方法,分别实现
    // 返回姓名和两门课成绩(总分),
    // 返回姓名和三门课成绩(总分),
    // 返回姓名和五门课成绩(总分)。
    // 封装成一个可变参数的方法

    public String exercises(String name, double...sums) {
        int count = 0;
        for (int i = 0; i < sums.length; i++) {
            count += sums[i];
        }
        return name + "有" + sums.length + "科的成绩总分为:" + count;
    }
}

结果:张三有2科的成绩总分为:180

三、作用域

基本介绍

面向对象中,变量作用域是非常重要知识点,相对来说不是特别好理解,请大家注

意听,认真思考,要求深刻掌握变量作用域。

  • 1、在java编程中,主要的变量就是属性(成员变量)和局部变量。
  • 2、我们说的局部变量-般是指在成员方法中定义的变量。【举例 Cat类: cry】
  • 3、java中作用域的分类
    • 全局变量:也就是属性,作用域为整个类体Cat类: cry eat等方法使用属性
    • 局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块中!
  • 4、全局变量可以不赋值,直接使用,因为有默认值,局部变量必须赋值后,才能使用,因为没有默认值。

上述说明举例

package com.example.han_severejava.面向对象;

public class 作用域快速入门 {
    public static void main(String[] args) {

    }
}

class Cat1{
    //全局变量:也就是属性,作用域为整个类体Cat类: cry eat等方法使用属性
    //属性在定义时 ,可以直接赋值
    //age的作用域就是在全局中(在全局中都可以使用)
    int age =18; //age就是

    public void cry() {
        //1.局部变量-般是指在成员方法中定义的变量。
        //2.n 和 name 就是局部变量
        //3.n 和 name 的作用域就是在cry方法中
        int n = 18;
        String name = "jack";
    }
}

注意事项和使用细节

  • 1、属性和局部变量可以重名,访问时遵循就近原则。
  • 2、在同一个作用域中,比如在同一一个成员方法中,两个局部变量,不能重名。[举例]
  • 3、属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。局部变量,生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁。即在一次方法调用过程中。
  • 4.、作用域范围不同
    • 全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
    • 局部变量:只能在本类中对应的方法中使用
  • 5、修饰符不同
    • 全局变量/属性可以加修饰符
    • 局部变量不可以加修饰符

四、构造方法/构造器

基本介绍

看问题需求

我们来看一个需求:前面我们在创建人类的对象时,是先把一个对象创建好后,再给
他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,就直接指定这个
对象的年龄和姓名,该怎么做?这时就可以使用构造器。

基本语法

[修饰符] 方法名 ( 形参列表 ) {
        方法体;
}

思路说明

  • 1)构造器的修饰符可以默认
  • 2)构造器没有返回值
  • 3)方法名和类名字必须样
  • 4)参数列表和成员方法一样的规则
  • 5)构造器的调用系统完成

基本介绍(小结)

构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。它有几个特点:

  • 1)方法名和类名相同
  • 2)没有返回值
  • 3)在创建对象时,系统会自动的调用该类的构造器完成对对象的初始化
     

快速入门举例

package com.example.han_severejava.面向对象;

public class 构造器快速入门 {
    public static void main(String[] args) {
        //当我们new 一个对象时,直接通过构造器指定名字和年龄
        Person_GZQ p1 = new Person_GZQ("Smith", 80);
        System.out.println("p1的属性如下:");
        System.out.println("对象姓名:"+p1.name); //Smith
        System.out.println("对象年龄:"+p1.age); //80
    }
}


//在创建人类的对象时,就直接指定这个对象的年龄和姓名
class Person_GZQ{
    String name;
    int age;
    //构造器
    //思路分析
    //1、构造器没有返回值
    //2、构造器的名称和Person_GZQ类名必须一样
    //3、(String pName,int pAge)是构造器形参列表,规则和成员方法-样
    public Person_GZQ(String pName,int pAge){
        System.out.println("构造器被调用~~完成对象的属性初始化");
        name = pName;
        age = pAge;
    }
}

注意事项和使用细节

  • 1. 一个类可以定义多个不同的构造器,即构造器重载
    • 比如:我们可以再给Person类定义一个构造器,用来创建对象的时候,只指定人名,不需要指定年龄
  • 2.构造器名和类名要相同
  • 3.构造器没有返回值
  • 4.构造器是完成对象的初始化,并不是创建对象
  • 5.在创建对象时,系统自动的调用该类的构造方法
  • 6.如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器(也叫默认构造器),比如Dog (){}, 使用javap指令反编译看看
  • 7.一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式的定义一下,即: Dog){} 写(这点很重要)

对象创建流程分析(包构造器版)

学习完构造器后 , 我们类的定义就应该更加完善了

练习

练习1

题目:在前面定义的Person类中添加两个构造器:

第一个无参构造器:利用构造器设置所有人的age属性初始值都为18

结果:

练习2

题目:第二个带pName和pAge两个参数的构造器:使得每次创建Person对象的同
时初始化对象的age属性值和name属性值。分别使用不同的构造器,创建对
象.

结果:

五、this关键字

基本介绍

java虚拟机会给每个对象分配this,代表当前对象。坦白的讲,要明白this不是件容易的事,我给大家打一个比方。[上帝创世界小故事]


this本质

this小结

this注意事项和使用细节

  • 1)this关键字可以用来访问本类的属性、方法、构造器
  • 2)this用于区分当前类的属性和局部变量
  • 3)访问成员方法的语法:this.方法名(参数列表);
  • 4) 访问构造器语法: this( 参数列表 ); 注意只能在构造器中使用 ( 即只能在构造器中访问另外一个构造器 ,必须放在第一条语句)
  • 5)this不能在类定义的外部使用,只能在类定义的方法中使用。

this课堂练习

定义Person类,里面有namege属性,并提供compareTo比较方法,用于判断是否和另一个人相等,提供测试类TestPerson用于测试,名字和年龄完全一样,就返回true,否则返回false

总结不易,希望宝宝们不要吝啬亲爱的👍哟(^U^)ノ~YO!如有问题,欢迎评论区批评指正😁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 12 新增功能实操!

前言 今天咱们一起来探索并实践 C# 12 引入的全新功能&#xff01; C#/.NET该如何自学入门&#xff1f; 注意&#xff1a;使用这些功能需要使用最新的 Visual Studio 2022 版本或安装 .NET 8 SDK 。 主构造函数 主构造函数允许你直接在类定义中声明构造函数参数&#xff0c;…

停车共享小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;停车场管理&#xff0c;停车预约管理&#xff0c;停车缴费管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;停车场&#xff0c;我的 开发系统&…

主图趋势交易九稳量化系统 期货指标公式大全 最准的期货指标源码 看期货涨跌最简单的方法文华财经指标公式源码

交易的动机必须来自于内心&#xff0c;一种解决问题的执着。在整个交易生涯的漫长岁月里&#xff0c;无法始终保持这种热忱。除非亲身体验&#xff0c;否则很难理解这种疯狂的热忱。这是一种高度的专注&#xff0c;其他一切好像都不存在&#xff0c;视野之内没有其他的东西。这…

【STL】之 vector 使用方法及模拟实现

前言&#xff1a; 本文主要讲在C STL库中vector容器的使用方法和底层的模拟实现~ 成员变量的定义&#xff1a; 对于vector容器&#xff0c;我们首先采用三个成员变量去进行定义&#xff0c;分别是&#xff1a; private:iterator _start; // 指向数据块的开始iterator _finish…

论文解读(10)-图神经网络

加油&#xff0c;继续看论文。 这次学图神经网络&#xff0c;这个概念经常在其他论文里出现&#xff0c;所以我想先学习一下这方面的知识。 参考&#xff1a; 【图神经网络综述】一文道尽GNN原理、框架和应用-CSDN博客 【图神经网络】10分钟掌握图神经网络及其经典模型_图神经…

网络爬虫必备工具:代理IP科普指南

文章目录 1. 网络爬虫简介1.1 什么是网络爬虫&#xff1f;1.2 网络爬虫的应用领域1.3 网络爬虫面临的主要挑战 2. 代理IP&#xff1a;爬虫的得力助手2.1 代理IP的定义和工作原理2.2 为什么爬虫需要代理IP&#xff1f;2.3 代理IP如何解决爬虫的常见问题&#xff1f; 3. 代理IP的…

shapeit填充

使用shapeit软件进行填充 一&#xff0c;安装 下载地址&#xff0c; 官网里面写得很详细。 https://mathgen.stats.ox.ac.uk/genetics_software/shapeit/shapeit.html 二&#xff0c;步骤 官网里面每一个参数都很详细 1.拆分染色体 for chr in {1..24}; do plink --vcf /…

基于dcm4chee搭建的PACS系统讲解(三)服务端使用Rest API获取study等数据

文章目录 DICOMWeb Support模块主要数据结构ER查询信息基本信息metadata信息统计信息 实践查询API及参数解析API返回的json数组定义VRObjectNodeObjectMapper解析显示指定tag并解析 后记 前期预研的PACS系统&#xff0c;近期要在项目中上线了。因为PACS系统采用无权限认证&…

Embeddings 赋能 - AI智能匹配,呈现精准内容

&#x1f680;前言 在当今的 AI 时代,传统的相关内容推荐和搜索功能已经显得相对简单和低效。借助 AI 技术,我们可以实现更加智能化和个性化的内容发现体验。 本文将为大家介绍如何利用 OpenAI 的 Embedding 技术,打造出智能、高效的相关内容推荐和搜索功能。 &#x1f680;…

UCOS-III 互斥锁接口详解

在实时操作系统uC/OS-III中&#xff0c;互斥锁&#xff08;Mutex&#xff09;是一种用于管理对共享资源的访问的同步机制。互斥锁通过保证在任何时刻只有一个任务可以持有锁&#xff0c;从而防止资源竞争问题。同时&#xff0c;uC/OS-III还实现了递归锁定和优先级继承机制&…

七款公司常用的加密软件推荐|2024年公司办公加密软件推荐

在现代企业中&#xff0c;加密软件是保护敏感信息、防止数据泄露和确保通信安全的关键工具。加密软件能够对数据进行加密&#xff0c;使其在未经授权的情况下无法被读取或篡改&#xff0c;本文分享七款加密软件&#xff0c;它们各具特色&#xff0c;能够满足不同的安全需求。 1…

狂赚又吸金 身心灵赛道AI玩法全解析

想必很多初入AI的小白们&#xff0c;小白的不能在小白了&#xff0c;因为在他们眼中&#xff0c;确实对AI一无所知。 基于他们平时刷抖音、刷视频号的习惯&#xff0c;有的时候会发一些传统剪辑的作品&#xff0c;问AI怎么做&#xff1f;很多人认为AI所见的视频&#xff0c;AI…

GeoServer发布MongoDB中的shp数据全流程梳理

目录 前言1.shp转geojson2.shp导入MongoDB3.创建空间索引4.GeoServer安装MongoDB插件5.发布6.注意事项6.1 geojson要去掉头尾6.2 MongoDB4.4以上的mongoimport工具需要额外安装6.3 空间索引是必须项 7.总结 前言 网上搜到的GeoServer发布MongoDB中的矢量数据或shp数据的文章比较…

http协议与nginx

动态页面与静态页面的差别&#xff1a; &#xff08;1&#xff09;URL不同 静态⻚⾯链接⾥没有“?” 动态⻚⾯链接⾥包含“&#xff1f;” &#xff08;2&#xff09;后缀不同 (开发语⾔不同) 静态⻚⾯⼀般以 .html .htm .xml 为后缀 动态⻚⾯⼀般以 .php .jsp .py等为后…

我国工业大模型发展中的四个反差现象

以大模型为代表的新一代人工智能技术正加速推进新型工业化的变革进程。2024年1月&#xff0c;国务院常务会议研究部署推动人工智能赋能新型工业化有关工作&#xff0c;强调以人工智能和制造业深度融合为主线&#xff0c;以智能制造为主攻方向&#xff0c;以场景应用为牵引&…

【Git从入门到精通】——知识概述及Git安装

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

Google Test的使用

Google Test支持的操作系统包含下面这些&#xff1a; 1、Linux 2、Mac OS X 3、Windows 4、Cygwin 5、MinGW 6、Windows Mobile 7、Symbian一、google test的基本使用步骤 1、包含gtest/gtest.h头文件 2、使用TEST()宏定义测试case 3、在测试体中使用gooletest断言进行值检查…

Java从入门到精通(十四) ~ 多线程

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 一、多线程是什么&#xff1f; Java中的多线程 二、使用步骤 1.创建方式 1.1 Thread 线程 1.2 Runnable 任务 1.…

视创云展:重塑线上会议体验,六大核心引领数字空间新纪元

视创云展以其革命性的“数字活动”解决方案为核心&#xff0c;精心构建了一个超越想象的未来数字世界。通过整合六大前沿技术模块&#xff0c;它不仅为参会者打造了一个身临其境的线上会议环境&#xff0c;更让每一位参与者都能跨越物理界限&#xff0c;深刻感受会议的每一个瞬…

2024经济师考试报名『注册流程』图解!

⏰报名时间&#xff1a;8月12日—9月11日 ☑️报名注册流程 1、经济师考试报名注册网站&#xff1a;中国人事考试网. 2、点击考生登录栏目中的【新用户注册】按钮&#xff0c;进行注册。 3、进入用户注册界面&#xff0c;填写注册信息。 4、填写完毕确认无误后点击【提交】&…