张老太养了两只猫猫:一只名字叫小白,今年3岁,白色。还有一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示张老太没有这只猫猫。
1)单独的定义变量解决2)使用数组解决
//单独变量来解决=>平利于数据的管理//第1只猫信息Stringcat1Name="小白";intcat1Age=3;Stringcat1Color="白色";//第2只猫信息Stringcat2Name="小花";intcat2Age=100;Stringcat2Color="花色";//数组===>(1)数据类型体现不出来(2)只能通过[下标]获取信息,造成变量名字和内容//的对应关系不明确(3)不能体现猫的行为//第1只猫信息String[]cat1={"小白","3","白色"};String[]cat2={"小花","100","花色"};●现有技术解决的缺点分析
不利于数据的管理效率低===》引出我们的新知识点类与对象哲学,道家思想java设计者引入类与对象(OOP),根本原因就是现有的技术,不能完美的解决新的新的需求.
●类与对象的关系示意图
●上图说明注意:从猫类到对象,目前有几种说法:1.创建一个对象⒉.实例化一个对象3.把类实例化...当然:上面的猫也可是鱼、狗、人...java最大的特点就是面向对象。
publicclassHelloWorld{publicstaticvoidmain(String[]args){//1.newCat()创建一只猫//2.Catcat1=newCat();把创建的猫赋给cat1//3.cat1就是一个对象Catcat1=newCat();cat1.name="小白";cat1.age=3;cat1.color="白色";//创建了第二只猫,并赋给cat2//cat2也是一个对象(猫对象)Catcat2=newCat();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);}}//使用面向对象的方式来解决养猫问题////定义一个猫类Cat->自定义的数据类型classCat{//属性Stringname;//名字intage;//年龄Stringcolor;//颜色//行为}●类和对象的区别和联系
通过上面的案例和讲解我们可以看出:
属性/成员变量
基本介绍
●注意事项和细节说明
属性的定义语法同变量,示例:访问修饰符属性类型属性名;
属性的定义类型可以为任意类型,包含基本类型或引用类型
属性如果不赋值,有默认值,规则和数组一致。
●基本语法
对象名.属性名;
案例演示赋值和输出
cat.name;cat.age;cat.color;
●看一个思考题我们定义一个人类(Person)(包括名字,年龄)。
●Java内存的结构分析1.栈:一般存放基本数据类型(局部变量)2.堆:存放对象(Catcat,数组等)3.方法区:常量池(常量,比如字符串),类加载信息4.示意图[Cat(name,age,price)
●Java创建对象的流程简单分析
Personp=newPerson();p.name="jack”;p.age=101.先加载Person类信息(属性和方法信息,只会加载一次)2在堆中分配空间,进行默认初始化(看规则)3.把地址赋给p,p就指向对象4.进行指定初始化,比如p.name="jack"p.age=10
●看一个练习题,并分析画出内存布局图,进行分析
在某些情况下,我们要需要定义成员方法(简称方法)。比如人类:除了有一些属性外(年龄,姓名..),我们人类还有一些行为比如:可以说话、跑步..,通过学习,还可以做算术题。这时就要用成员方法才能完成。现在要求对Person类完善。
添加speak成员方法,输出我是一只好人
添加cal01成员方法,可以计算从1+...+1000的结果
添加cal02成员方法,该方法可以接收一个数n,计算从1+...+n的结果
添加getSum成员方法,可以计算两个数的和
●看一个需求:请遍历一个数组,输出数组的各个元素值。解决思路1,传统的方法,就是使用单个for循环,将数组输出,大家看看问题是什么解决思路2:定√义一个类MyTools,然后写一个成员方法,调用方法实现,看看效果又如何。
成员方法的好处
提高代码的复用性可以将实现的细节封装起来,然后供其他用户来调用即可.
访问修饰符返回数据类型方法名(形参列表..){//方法体语句;return返回值;}
●访问修饰符(作用是控制方法使用的范围)可选,[有四种:],具体在后面说
●返回类型
●方法名遵循驼峰命名法,最好见名知义,表达出该功能的意思即可,比如得到两个数的和getSum,开发中按照规范
●形参列表
●方法体里面写完成功能的具体的语句,可以为输入、输出、变量、运算、分支、循环、方法调用,但里面不能再定义方法!即:方法不能嵌套定义。[演示]
●方法调用细节说明
方法的传参机制对我们今后的编程非常重要,一定要搞的清清楚楚明明白白。我们通过案例来学习。
●基本数据类型的传参机制
publicclassHelloWorld{publicstaticvoidmain(String[]args){inta=10;intb=20;//创建AA对象名字objAAobj=newAA();obj.swap(a,b);//调用swapSystem.out.println("main方法a="+a+"b="+b);//a=10b=20}}classAA{//同一个类中的方法调用:直接调用即可//publicvoidswap(inta,intb){System.out.println("\na和b交换前的值\na="+a+"\tb="+b);//a=10b=20//完成了a和b的交换inttmp=a;a=b;b=tmp;System.out.println("\na和b交换后的值\na="+a+"\tb="+b);//a=20b=10}}//swap方法会创建不同的栈。其中的变量a,b所对应的地址也不同,因此不会改变。●引用数据类型的传参机制
递归能解决什么问题
●八皇后问题说明八皇后问题,是一个古老而著名的问题,,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
●重载的好处
●快速入门案例
publicclassHelloWorld{publicstaticvoidmain(String[]args){MyCalculatormc=newMyCalculator();System.out.println(mc.calculate(1,2));System.out.println(mc.calculate(1,2.1));}}classMyCalculator{//下面的四个calculate方法构成了重载//两个整数的和publicintcalculate(intn1,intn2){returnn1+n2;}//一个整数,一个double的和publicdoublecalculate(intn1,doublen2){returnn1+n2;}//一个double,一个工t和publicdoublecalculate(doublen1,intn2){returnn1+n2;}//三个int的和publicintcalculate(intn1,intn2,intn3){returnn1+n2+n2;}}●注意事项和使用细节
●基本概念java允许将同一个类中多个同名同功能但参数个数不同的方法,到装成一个方法。就可以通过可变参数实现
●基本语法访问修饰符返回类型方法名(数据类型...形参名){}
publicclassHelloWorld{publicstaticvoidmain(String[]args){HspMethodm=newHspMethod();intsum=m.sum(1,5,100);System.out.println(sum);}}classHspMethod{//1.int...表示接受的是可变参数,类型是int,即可以接收多个1nt(0-多)//2。使用可变参数时,可以当做数组来使用即nums可以当做数组publicintsum(int...nums){System.out.println("接收的参数个数="+nums.length);intres=0;for(inti=0;i //细节:可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后publicvoidf2(Stringstr,doubLe...nums){}//细节:一个形参列表中只能出现一个可变参数//下面的写法是错的·//publicvoidf3(int...nums1,double...nums2){}作用域●基本使用面向对象中,变量作用域是非常重要知识点,相对来说不是特别好理解,要求深刻掌握变量作用域。 注意事项和细节使用 classPerson{Stringname="jack";publicvoidsay(){//细节属性和局部变量可以重名,访问时遵循就近原则Stringname="king";System.out.println("say()name="+name);}publicvoidhi(){Stringaddress="北京";//Stringaddress=“上海";//错误,重复定义变量Stringname="hsp";}}作用域范围不同全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)局部变量;只能在本类中对应的方法中使用修饰符不同全局变量/属性可以加修饰符局部变量不可以加修饰符构造方法/构造器●看一个需求我们来看一个需求:前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,就直接指定这个对象的年龄和姓名,该怎么做这时就可以使用构造器。 ●基本语法[修饰符]方法名(形参列表){方法体;} 说明: 基本介绍构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。它有几个特点: 快速入门现在我们就用构造方法来完成刚才提出的问题:在创建人类的对象时,就直接指定这个对象的年龄和姓名 publicclassHelloWorld{publicstaticvoidmain(String[]args){//当我们new一个对象时,直接通过构造器指定名字和年龄Personp1=newPerson("smith",80);System.out.println("p1的信息如下");System.out.println("p1对象name="+p1.name);//smithSystem.out.println("p1对象age="+p1.age);//80}}//在创建人类的对象时,就直接指定这个对象的年龄和姓名//classPerson{Stringname;intage;//构造器//老韩解读//1。构造器没有返回值,也不能写void//2。构造器的名称和类Person—样//3.(StringpName,intpAge)是构造器形参列表,规则和成员方法―样publicPerson(StringpName,intpAge){System.out.println("构造器被调用~~完成对象的属性初始化");name=pName;age=pAge;}publicPerson(StringpName){System.out.println("构造器重载---");name=pName;}}●注意事项和使用细节 ●先看一段代码,并分析问题 publicclassHelloWorld{publicstaticvoidmain(String[]args){Dogdog1=newDog("大壮",3);dog1.info();}}classDog{//类Stringname;intage;//publicDog(StringdName,intdAge){//构造器//name=dName;//age=dAge;//}//如果我们构造器的形参,能够直接写成属性名,就更好了//但是出现了一个问题,根据变量的作用域原则//构造器的name是局部变量,而不是属性//构造器的age是局部变量,而不是属性//==>引出this关键字来解决publicDog(Stringname,intage){//构造器name=name;age=age;}publicvoidinfo(){//成员方法,输出属性×信息System.out.println(name+"\t"+age+"\t");}}●什么是this java虚拟机会给每个对象分配this,代表当前对象。 ●使用this解决前面变量命名问题 publicclassHelloWorld{publicstaticvoidmain(String[]args){Dogdog1=newDog("大壮",3);dog1.info();}}classDog{//类Stringname;intage;//publicDog(StringdName,intdAge){//构造器//name=dName;//age=dAge;//}//如果我们构造器的形参,能够直接写成属性名,就更好了//但是出现了一个问题,根据变量的作用域原则//构造器的name是局部变量,而不是属性//构造器的age是局部变量,而不是属性//==>引出this关键字来解决publicDog(Stringname,intage){//构造器//this.name就是当前对象的属性namethis.name=name;//this.age就是当前对象的属性agethis.age=age;}publicvoidinfo(){//成员方法,输出属性×信息System.out.println(name+"\t"+age+"\t");}}this小结:简单的说,哪个对象调用,this就代表哪个对象 this的注意事项和使用细节 this关键字可以用来访问本类的属性、方法、构造器 this用于区分当前类的属性和局部变量 classDog{//类Stringname;intage;publicDog(Stringname,intage){//构造器//this.name就是当前对象的属性namethis.name=name;//this.age就是当前对象的属性agethis.age=age;}}访问成员方法的语法:this.方法名(参数列表);注意:访问构造器语法:this(参数列表);必须放置第一条语句 /*细节:访问构造器语法:this(参数列表);注意只能在构造器中使用(即只能在构造器中访问另外一个构造器)注意:访问构造器语法:this(参数列表);必须放置第一条语句*/publicT(){this("jack",100);//这里去访问T(Stringname,intage) System.out.print1n("T()构造器");}publicT(Stringname,intage){System.out.println("T(Stringname,intage)构造器");}访问构造器语法:this(参数列表);注意只能在构造器中使用5.this不能在类定义的外部使用,只能在类定义的方法中使用。 ●this的课堂案例定义Person类,里面有name、age属性,并提供compareTo比较方法,用于判断是否和另一个人相等,提供测试类TestPerson用于测试名字和年龄完全一样,就返回true,否则返回false