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

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.namep2.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);//100cz.m(10,20);//200cz.m("你好");}
}class CZ2{//编写程序,类Methods中定义 三个重载方法并调用。方法名为m。// 三个方法分别接收一个int参数、两个int参数、 一个字符串参数。// 分别执行平方运算并输出,结果,相乘并输出结果,输出字符串信息。// 在主类的main ()方法中分别用参数区别调用三个方法。//分析//1 方法名 m//2 形参(int)//3 voidpublic void m(int n){System.out.println("平方="+(n * n));}//1 方法名 m//2 形参(int,int)//3 voidpublic void m(int n1,int n2){System.out.println("相乘="+(n1 * n2));}//1 方法名 m//2 形参(String)//3 voidpublic 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); //SmithSystem.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.xdnf.cn/news/1488937.html

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

相关文章

零食商城管理系统

目录 一、项目背景与目标 1.1 项目背景 1.2 项目意义 1.3 国内外研究现状 1.4 开发工具介绍 二、项目内容与分工 三、 时间表与进度 1. 需求分析阶段&#xff1a; 2. 系统设计阶段&#xff1a; 3. 系统开发阶段&#xff1a; 4. 系统测试阶段&#xff1a; 5. 部署与上…

python项目通过docker部署到Linux系统并实现远程访问

背景需求&#xff1a;在Windows系统编写了简单的python代码&#xff0c;希望能通过docker打包到Linux Ubuntu系统中&#xff0c;并运行起来&#xff0c;并且希望在本地Windows系统中能通过postman访问。 目录 一、原本的python代码 二、创建一个简单的Flask应用程序 三、创…

虚拟机centos9搭建wordpress

目录 1. 更换yum源更新系统软件包&#xff1a; 1.1备份yum源 1.1.1创建备份目录&#xff1a; 1.1.2移动现有仓库配置文件到备份目录&#xff1a; 1.1.3验证备份&#xff1a; 1.2更换yum源 1.2.1添加yum源 1.2.2删除和建立yum缓存 1.3更新系统软件包 1.4 yum与dnf介绍…

FPGA:流水灯设计

本次基于FPGA实现流水灯&#xff0c;即让LED[0:7]从左到右依次电量&#xff0c;每个LED灯频闪周期为1s钟&#xff0c;在这里&#xff0c;给出下面三种实现思路&#xff1a; 1、实验思路 1、使用位运算符 在复位时令LED灯为LED8’b0000_0001&#xff0c;然后每过一秒钟&#x…

磁盘管理与磁盘卷--红帽Linux操作系统<>

分区的两种格式 1、MBR分区 MBR(Master Boot Record&#xff0c;主引导记录)是传统的分区机制&#xff0c;使用BI0S引导PC设备&#xff0c;寻址空间只有32bit长。 分区空间最大支持2.2TB 支持的分区数量:4个主分区或者3个主分区1个扩展分区 为什么MBR最多只能有4个主分区?…

深入剖析:GaussDB与MySQL在COUNT查询中的并行化技术

引言 数据库查询性能优化是数据库管理和开发中的一个重要议题。在处理大数据量的COUNT查询时&#xff0c;传统的单线程处理方式可能无法满足现代应用的性能需求。GaussDB(for MySQL)和MySQL作为流行的数据库系统&#xff0c;它们在并行查询优化方面有着各自的策略和技术。本文…

嵌入式中什么是三次握手

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c;点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 在网络数据传输中&#xf…

第2章 编译SDK

安装编译依赖 sudo apt-get update sudo apt-get install clang-format astyle libncurses5-dev build-essential python-configparser sconssudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool \ expect g patchelf chrpath gawk texinfo chrpath diffstat …

数据结构(Java):Map集合Set集合哈希表

目录 1、介绍 1.1 Map和Set 1.2 模型 2、Map集合 2.1 Map集合说明 2.2 Map.Entry<K&#xff0c;V> 2.3 Map常用方法 2.4 Map注意事项及实现类 3、Set集合 3.1 Set集合说明 3.2 Set常用方法 3.3 Set注意事项及其实现类 4、TreeMap&TreeSet 4.1 集合类TreeM…

盛元广通实验室自动化生物样本库质量控制管理系统

随着我国生物医学研究的不断深入和精准医疗的快速发展&#xff0c;对高质量生物样本的需求日益增长。近年来&#xff0c;我国生物样本库建设取得了显著进展。各级政府、高校和医院纷纷投入资源建设生物样本库&#xff0c;推动了生物样本资源的有效整合和利用。生物样本库的质量…

【C++】初识C++基础篇·一(命名空间,函数重载,缺省参数,引用);

文章目录 前言1.输入与输出输出输入cin和scanf的对比 2.命名空间2.1namespace存在的意义2.2namespace的使用3.缺省参数4.函数重载重载函数的调用规则 5.引用 前言 我们先通过一段简单的代码来拉开C的序幕&#xff1b; //text.cpp #include<iostream> #include<stdio…

钡铼网关实时数据互联,加速IEC104与MQTT云平台对接

随着工业4.0时代的到来&#xff0c;电力系统中的数据采集、监控与远程控制需求日益增长。IEC 104&#xff08;IEC 60870-5-104&#xff09;作为国际电工委员会&#xff08;IEC&#xff09;制定的电力自动化通信协议&#xff0c;广泛应用于电力系统的状态监测、数据采集和设备控…

【推研小灶】复旦与南大之间:一次独特的计算机保研之旅

写在前面 上午10点填完志愿等待复试通知&#xff0c;利用这段时间记录一下我简短的夏令营和预推免。今年变为线下之后&#xff0c;部分学校的入营情况、考核方式有明显变化。加上CS方向保研名额总体变多&#xff0c;形势有点小乱&#xff0c;甚至填报系统都在9.29中秋节当天&a…

如何优化 Nginx 处理特定 MIME 类型的性能?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 如何优化 Nginx 处理特定 MIME 类型的性能&#xff1f;一、了解 MIME 类型二、分析性能瓶颈三、优化配置1. 开启 Gzip 压缩2. 调整缓存策略3. 优化服务器资源分配…

【C++进阶学习】第九弹——哈希的原理与实现——开放寻址法的讲解

前言&#xff1a; 在前面&#xff0c;我们已经学习了很多存储机构&#xff0c;包括线性存储、树性存储等&#xff0c;并学习了多种拓展结构&#xff0c;效率也越来越高&#xff0c;但是是否有一种存储结构可以在大部分问题中都一次找到目标值呢&#xff1f;哈希可能能实现 目录…

el-tree树添加向下移动按钮,前端界面调整顺序

需求&#xff1a;树上添加向下按钮&#xff0c;再不调用接口的情况下&#xff0c;调整树的顺序结构 遇到的问题&#xff1a;第一次点击更新的&#xff0c;数据和视图是调整好的&#xff0c;再次点击页面调整顺序&#xff0c;只有数据被调整了&#xff0c;视图没有发生改变。 &…

我澄清下,大数据界面虽然有点花,但对趋势的判断还是很准的!

我澄清下&#xff0c;大数据界面虽然有点花&#xff0c;但对趋势的判断还是很准的&#xff01; 艾斯视觉的观点认为&#xff1a;在这个充满不确定性的世界里&#xff0c;大数据就像一位智者&#xff0c;透过那些令人眼花缭乱的界面&#xff0c;总能以它独到的洞察力&#xff0…

链路聚合加单臂路由

一、实验目的及拓扑 实验目的&#xff1a;在路由器及交换机之间建立链接聚合&#xff0c;交换机接入两台主机并通过路由器子接口自动分配IP地址&#xff0c;通过单臂路由实现两台主机互联 二、基本配置 1、交换机配置 [S1]vlan batch 10 20 [S1-Eth-Trunk1]dis th # interf…

eclipse ui bug

eclipse ui bug界面缺陷&#xff0c;可能项目过多&#xff0c;特别maven项目过多&#xff0c;下载&#xff0c;自动编译&#xff0c;加载更新界面异常 所有窗口死活Restore不回去了 1&#xff09;尝试创建项目&#xff0c;还原界面&#xff0c;失败 2&#xff09;关闭所有窗口&…

mysql面试(六)

前言 本章节详细讲解了一下mysql执行计划相关的属性释义&#xff0c;以及不同sql所出现的不同效果 执行计划 一条查询语句经过mysql查询优化器的各种基于成本和各种规则优化之后&#xff0c;会生成一个所谓的 执行计划&#xff0c;这个执行计划展示了这条查询语句具体查询方…