面向对象编程(基础部分)

类与对象

01:

public class ObjectWorkDemo
{public static void main(String[] args){Cat cat1 = new Cat();cat1.name = "Tom";cat1.age = 3;cat1.color = "white";Cat cat2 = new Cat();cat2.name = "xiaohua";cat2.age = 100;cat2.color = "flower";}
}class Cat
{String name;int age;String color;
}

对象内存布局

属性/成员变量

注意事项和细节说明

01:

public class PropertiesDetail
{public static void main(String[] args){Person p1 = new Person();//p1 对象引用   Person() 才是真正的数据空间(真正的对象)}
}class Person
{int age;String name;double sal;boolean isPass;
}

创建对象

创建过程

小练习

成员方法

public class PersonWorkDemo
{public static void main(String [] args){Person p1 = new Person();p1.speak();p1.cal01();p1.cal02(5);int res = p1.getSum(10,5);System.out.println(res);}
}class Person{String name;int age;public void speak(){System.out.println("I am good person");}public void cal01(){int res = 0;for (int i = 1;i<=1000;i++){res+=i;}System.out.println(res);}public void cal02(int n){int res = 0;for (int i = 1;i<=n;i++){res+=i;}System.out.println(res);}public int getSum(int a,int b){return a+b;}}

方法调用机制

成员方法的好处

  • 提高代码的复用性

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

成员方法的定义

注意事项和使用细节

小练习

01:

public class TestWork
{public static void main(String [] args){AA a = new AA();boolean b = a.isOdd(1);if (b) System.out.println("yes");else System.out.println("no");}
}class AA
{public boolean isOdd(int num){if num%2!=0?true:false;}public void print(int row,int col,char c){for (int i = 0;i<row;i++){for (int j = 0;j<col;j++){System.out.print(c);}System.out.println();}}
}

成员方法传参机制

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

01:

public class MethodParameter01
{public static void main(String[] args){int a = 10;int b = 20;AA object = new AA();object.swap(a,b);System.out.println("a = "+a+" b = "+b);//a = 10 b = 20}
}class AA
{public void swap(int a,int b){System.out.println("a = "+a+" b = "+b);//a = 10 b = 20int tmp = a;a = b;b = tmp;System.out.println("Later a = "+a+" b = "+b);//a = 20 b = 10}
}

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

02:

public class MethodParameter02
{public static void main(String[] args){B b = new B(); int [] arr = {1,2,3};b.test100(arr);System.out.println("main:");for (int i = 0;i<arr.length;i++){System.out.print(arr[i]+"\t");//200 2 3}System.out.println();Person p = new Person();p.name = "Tom";p.age = 10;b.test200(p);System.out.println("main age =  "+p.age);//1000}
}class Person
{String name;int age;
}class B
{public void test200(Person p){p.age = 1000;}public void test100(int [] arr){arr[0] = 200;for (int i = 0;i<arr.length;i++){System.out.print(arr[i]+"\t");//200 2 3}System.out.println();}
}

这里的"tom"p会被当做垃圾销毁掉

小练习

public class TestDemo
{public static void main(String[] args){Person p = new Person();p.name = "Jack";p.age = 30;MyTools myT = new MyTools();Person p2 = myT.copyPerson(p);System.out.println(p==p2);//false}
}class Person
{String name;int age;
}class MyTools
{public Person copyPerson (Person p){Person p2 = new Person();p2.name = p.name;p2.age = p.age;return p2;}
}

如果此时修改p2.name,并不会改变p.name,p2.name会指向一个新地址

方法递归调用

递归举例

01:

public class Recursion01
{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

02:

public class Recursion01
{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);}else{System.out.println("n = "+n);}}
}//n = 2

03:

public class Recursion01
{public static void main(String [] args){T t1 = new T();int res = t1.factorial(5);System.out.println(res);//120}
}class T
{public int factorial(int n){if (n==1){return 1;}else{return factorial(n-1)*n;}}
}

递归重要规则

小练习

01:

class T
{public int fab(int n){if (n>=1){if (n==1 || n==2){return 1;}else{return fab(n-1)+fab(n-2);}}else{System.out.println("Input Error");return -1;}}
}

02:

class T
{public int peach(int day){if (day==10){return 1;}else if (day >= 1 && day <= 9){return (peach(day+1)+1)*2;}else{System.out.println("day在1-10");return -1;}}
}

老鼠出迷宫

03:

略!

汉诺塔

八皇后

略!

方法重载

案例

01:

class MyCalculator
{public int calculate(int n1,int n2){return n1+n2;}public double calculate(int n1,double n2){return n1+n2;}public double calculate(double n2,int n1){return n1+n2;}public int calculate(double n1,int n2,int n3){return n1+n2+n3;}
}

注意事项和使用细节

小练习

01:

01:

public class Test
{public static void main(String[] args){Methods obj = new Methods();obj.m(8);obj.m(8,6);obj.m("dadas");}
}class Methods
{public void m(int n){System.out.println(n*n);}public void m(int n1,int n2){System.out.println(n1*n2);}public void m(String str){System.out.println(str);}
}

02:

public class Test
{public static void main(String[] args){Methods obj = new Methods();}
}class Methods
{public int findMax(int n1,int n2){return n1>n2?n1:n2;}public double findMax(double n1,double n2){return n1>n2?n1:n2;}public double findMax(double n1,double n2,double n3){double max1 = n1>n2?n1:n2;double  max2 = max1>n3?max1:n3;return max2;}
}

可变参数

案例

01:

public VariableParameter01
{public static void main(String[] args){HspMethod obj = new HspMethod;int res = obj.sum(1,5,100);System.out.println(res);//106}
}class HspMethod
{public int sum(int... nums){int sum =0 ;for (int i = 0;i<nums.length;i++){sum+=nums[i];}return sum;}
}

注意事项和使用细节

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wXf9jxM-1634262458757)(C:\Users\Tom\AppData\Roaming\Typora\typora-user-images\image-20210912133042199.png)]

  • 可变参数的实参可以为数组

01:

public class VariableParameterDetail
{public static void(String[] args){int[] arr = {1,2,3};T t1 = new T();t1.f1(arr);}
}class T
{public void f1(int... nums){System.out.println(nums.length);//3}
}
  • 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后

01:

class T
{public void f2(double str,double...nums){}
}
  • 一个形参列表中只能出现一个可变参数
public int sum(String str,int... nums01,String... nums02);//Error

小练习

01:

public class HspMethod
{public String showScore(String name,double... scores){double totalScore = 0;for (int i = 0;i<scores.length;i++){totalScore+=scores[i];}return name+scores.length+totalScore;}
}

作用域

注意事项和使用细节

  • 属性和局部变量可以重名,访问时遵循就近原则

01:

public class ScopeDemo
{public static void main(String[] args){}
}class Person
{String name = "Tom";public void say(){String name = "king";System.out.println("say() name = "+name);//say() name = king}
}

02:

public class ScopeDemo
{public static void main(String[] args){}
}class Person
{String name = "Tom";public void say(){//  String name = "king";System.out.println("say() name = "+name);//say() name = Tom}
}
  • 在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名

01:

public class ScopeDemo
{public static void main(String[] args){}
}class Person
{String address = "beijin";//String address = "guanzhou";//Error  重复定义String name = "hsp";}

01:

public class ScopeDemo
{public static void main(String[] args){Person p1 = new Person();p1.say();//当执行say()方法时,say方法的局部变量比如name会创建,当say执行完毕后,name局部变量销毁,但是属性(全局变量)仍然可以使用}
}class Person
{String name = "Tom";public void say(){String name = "king";System.out.println("say() name = "+name);}
}
  • 作用域范围不同
class T
{public void test(){Person p1 = new Person();System.out.println(p1.name);}public void test02(Person p){System.out.println(p.name);}
}class Person
{String name = "jack";
}

构造方法/构造器

  • 案例

01:

public class Constructor01
{public static void main(String[] args){Person p1 = new Person("jack",80);System.out.println(p1.name+" "+p1.age);}
}class Person
{String name;int age;public Person(String pName,int pAge){name = pName;age = pAge;}
}

注意事项和使用细节

小练习

01:

public class Constructor01
{public static void main(String[] args){}
}class Person
{String name;int age;public Person(){age = 18;}public Person(String pName,int pAge){name = pName;age = pAge;}
}

对象创建的流程分析

javap

  • P243

this关键字

01:

public class This01
{public static void main(String[] args){Dog dog1 = new Dog("大壮",3);dog1.info();}
}class Dog
{String name;int age;//  public Dog(String dName,int dAge)// {//     name = dName;//     age = dAge;// }public Dog(String name,int age){this.name = name;this.age = age;}public void info(){System.out.println(name+" "+age+" ");}
}

public class This01
{public static void main(String[] args){Dog dog1 = new Dog("大壮",3);System.out.println("dog1的hashcode = "+dog1.hashCode());dog1.info();Dog dog2 = new Dog("小东",7);System.out.println("dog1的hashcode = "+dog2.hashCode());dog2.info();}
}class Dog
{String name;int age;//  public Dog(String dName,int dAge)// {//     name = dName;//     age = dAge;// }public Dog(String name,int age){this.name = name;this.age = age;System.out.println("this.hashCode = "+this.hashCode());}public void info(){System.out.println(name+" "+age+" ");}
}

this使用细节

01:

class T
{public void f1(){System.out.println("f1ok");}public void f2(){System.out.println("f2ok");f1();this.f1();}
}

02:

class T
{public T(){this("jack",100);System.out.println("T() 构造器");//在这里访问T(String name,int age)//this("jack",100);//ERROR 注意:如果有this(参数列表);必须放在第一条语句}public T(String name,int age){System.out.println("T(String name,int age)构造器");}}

案例

01:

public class TestPerson
{public static void main(String[] args){}
}class Person
{String name;int age;public Person(String name,int age){this.name = name;this.age = age;}public boolean compareTo(Person p){return this.name.equals(p.name) && this.age==p.age;}
});System.out.println("dog1的hashcode = "+dog2.hashCode());dog2.info();}
}

Java面向对象编程(基础部分)相关推荐

  1. java面向对象编程基础

    java面向对象编程基础 前言:什么是java 是咖啡飘香的清晨 - 是斯坦福校园意浓情深 - 是James的思想睿智 是剁手党双十一挥舞的利刃 是大数据云计算驰骋的平台 - 是ATM上吐出的钞票 - ...

  2. java面向对象编程基础实验报告_20155313 实验三《Java面向对象程序设计》实验报告...

    一.实验内容 XP基础 XP核心实践 相关工具 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器>课程 2.完成实验.撰写实验报 ...

  3. [Java入门笔记] 面向对象编程基础(二):方法详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...

  4. java 168转换成861_java实验-java语言面向对象编程基础

    java实验-java语言面向对象编程基础 (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 8.90 积分 广州大学学生实验报告广州大学学生实验报告 ...

  5. java面向对象程序_面向对象编程基础(java)

    面向对象编程基础 1.1 面向对象概述 在程序开发初期,大家使用的是结构化开发语言,也就是面向过程(opp),但随着市场需求剧增,软件的规模也越来越大,结构化语言的弊端也暴露出来. 开发周期无休止的拖 ...

  6. matlab面向对象排序,matlab面向对象编程基础

    matlab面向对象编程基础 觉得有用的话,欢迎一起讨论相互学习~ Matlab面向对象大体结构 类定义的普通模板 代码清单2.1.1 classdef className properties pr ...

  7. Day08 - 面向对象编程基础

    面向对象编程基础 活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编程",我们先来看看比较正式的说法. 把一组数 ...

  8. JAVA面向对象的基础知识快速通过---自学笔记(一)

    网上的教学很多,看视频非常浪费时间,看文字快点,快速捡起知识点,我只根据我学到的,集各种教学学习,把精华提取出来,把主要概念通俗的展示出来,基本常识就不介绍了,其他的资料谁看了都能看懂,只是java特 ...

  9. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

最新文章

  1. 为 ASP.NET Datagrid 创建自定义列
  2. python paperclip_Python pyplot.sca方法代码示例
  3. WCF部署到IIS异常(详细: 不能加载类型System.ServiceModel.Activation.HttpModule )
  4. mysql数据库5.7配置文件_MySQL 5.7配置文件参考
  5. 英特尔AMD竞相为笔记本处理器添加图形功能
  6. Javascript插入排序
  7. 从零实现深度学习框架——过拟合与欠拟合
  8. 关于 Unix 用户权限及进程权限及 Saved set-user-id
  9. 1106 Lowest Price in Supply Chain (25 分) 静态树vector+DFS
  10. 计算QPSK/16QAM/64QAM信号OFDM调制后PAPR
  11. Linux服务器(CentOS7)基础信息设置之满足等保三级测评要求
  12. 三倍快乐!推荐跨Win/Mac/Linux平台免费优质软件
  13. Ubuntu 18.04缺少libstdc++.so.6共享库解决方案
  14. 2021中国开源码力榜启动,寻找开源世界的超级玛丽
  15. 获取手机相册中照片的地址,保存在手机中的URL(Swift 代码)
  16. 如何在自己的所擅长的领域简历优势
  17. 2.基础语法:手指抽筋模拟器
  18. 关于sql server 2019的 卸载
  19. 现代企业管理笔记——领导
  20. 百度知道引流有哪些方法?一个互动式的疑问解答

热门文章

  1. 几行代码搞定树形文本转XML和JSON
  2. 【ArcGIS遇上Python】Python使用栅格数据
  3. C语言之struct A *b和struct A c区别
  4. Fisher–Yates shuffle 算法
  5. Android之进程与线程的讲解
  6. 《零基础看得懂的C语言入门教程 》——(十三)socket服务端编写
  7. 【C语言简单说】七:自定义函数(1)
  8. python设置cookie_Python中cookie的设置方法
  9. 史上最“可怕”的数学科普,能全都看懂的只有天才!
  10. 快手春节活动奖励未到账,被羊毛党投诉上了全国12315平台