6.面向对象,构造器,递归以及对象创建时内存分析(内含代码与练习)
面向对象的概念以及特征
概念
面向对象的特征
类的定义
类与实例,实例对象的创建
//定义一个person类,类中包括属性与方法
public class Person {//属性String name;String sex;int age;void eat() {//无参数的eat方法System.out.println("干饭");}void sleep() {System.out.println("水饺");}void play() {System.out.println("玩");}
}
//创建对象,调用person类,初始化属性以及调用其方法
public class Object {public static void main(String[] args) {Person p;//创建 p 这个person类p=new Person();//初始化 pp.name="张三";//p的属性的初始化p.sex="男";p.age=77;System.out.println(p.name);System.out.println(p.sex);System.out.println(p.age);p.eat();//调用p 的eat方法}
}
package和import语句
全限定名 package+类名
//通过全限定类型约束当前类为com. day1027中的Person
com.day1027.Person p1 = new com.day1027.Person();
系统导入(import)
import java.util.*;// 导入java.until这个包里的所有类
import java.util.Arrays;//导入java.until这个包里面的Arrays类
位置关系
方法
基本组成
定义
组成元素
//定义一个方法,给某个小孩送礼物,要求获取姓名
public String songLiWu(String liwu){//public 为修饰符,String为返回值类型,songLiWu为方法名,String liwu为参数,{}包含的为方法体System.out.pringln("给小孩送了"+liwu);return "小明";
}
方法的语法
有返回值
//两数相加的和,返回结果//如果返回值类型为基本数据类型,可以返回该类型所兼容的数据int add(int a,int b) {return a+b;}
//如果返回值类型为引用类型,可以返回该类或者该子类的对象数据Object buy(double money) {return 12;//自动装箱 基本数据类型装箱为Integer}
无返回值
//吃饭没有返回值类型
void eat() {
system.out.println( "吃饭");
}
方法签名
//方法的id==方法签名--》【方法名+参数列表】int add(int a,int c) {return a;}int add(int a){//这两个方法并不是同一个方法return a;}
练习
//商品分类Category
public class Category {// 属性:--分类id--分类名称--商品列表 int id;String name;Prodution[] produtions;// 方法:用于获取当前商品分类最top的销量的商品的方法getTopSlaeProdution();Prodution getTopSlaeProdution() {// 定义一个变量用于存放销量最高的商品Prodution top = produtions[0];// 遍历for (Prodution prodution : produtions) {// 判断,比较,把销量高的拿出来if (prodution.saleNum > top.saleNum) {top = prodution;}}// 返回销量最高的商品return top;}//商品类Prodution
public class Prodution {// 属性:--商品编号--商品名称--商品价格--商品的总销量【销售额:元】int code;String name;double price;int saleNum;// 方法:用于打印当前商品的所有信息printMessage()void printMessage() {System.out.printf("当前商品编码%d,名称为:%s,价格:%f,销量%d \n", code, name, price, saleNum);}//测试类public static void main(String[] args) {// 调用getTopSlaeProdution方法,获取当前商品分类的最top的销量的商品,并显示该商品信息//主--商品分类 谓--调用 宾--getTopSlaeProdution方法 结果--销量的商品//1、创建多个商品Prodution p1 = new Prodution();p1.name = "秋裤";p1.saleNum = 100;Prodution p2 = new Prodution();p2.name = "卫衣";p2.saleNum = 1100;Prodution p3 = new Prodution();p3.name = "内裤";p3.saleNum = 10000;Prodution p4 = new Prodution();p4.name = "外套";p4.saleNum = 500;//2、创建商品分类、将多个商品赋值到商品分类中的列表Category category = new Category();category.name = "衣服";category.produtions = new Prodution[]{p1,p2,p3,p4};//3、调用方法Prodution top = category.getTopSlaeProdution();top.printMessage();//调用方法,显示商品信息}
方法的入参匹配
不同类型匹配的优先级(从高到低)
基本数据类型
引用类型
//方法的入参匹配
public static void main(String[] args) {// 方法调用按照方法签名来调用MethodInputInvoke invoke = new MethodInputInvoke();//方法调用--方法签名invoke.input(1,2);//基本数据类型:本身--》类型提升--》包装类型--》长度可变类型//引用类型:本身--》父类//在同一个类中,同一种行为的不同的体现//方法名相同,但是方法参数列表不同的 }public class MethodInputInvoke {//方法的组成元素 修饰符 返回值类型 方法名 方法参数列表 方法体/*void input(byte i) {System.out.println("byte i----------------------------");}void input(short i) {System.out.println("short i----------------------------");}void input(int i) {System.out.println("int i----------------------------");}void input(long i) {System.out.println("long i----------------------------");}*/void input(Integer i) {System.out.println("Integer i----------------------------");}void input(Short i) {System.out.println("Short i----------------------------");}//参数入参个数是可变的 int...void input(int... i) {System.out.println("int... i----------------------------");}
重载方法的定义
练习
//思路
//1.定义Hero类--定义属性--定义两个方法
public class Hero {// heroName(英雄名) heroHP(英雄HP) heroArmor(英雄攻击力) heroMoveSpeed(移动速度)String heroName;int heroHP;int heroArmor;int heroMoveSpeed;//--自己治疗的方法heal【自己增加100HP】void heal() {heroHP = heroHP+100;}//--给一个队友治疗的方法heal【队友增加200HP】void heal(Hero h) {//heal方法重载h.heroHP = h.heroHP+200;}
}
//2.测试类--创建对象--调用方法--输出结果
public class HeroTest {public static void main(String[] args) {// 孙悟空治疗自己Hero sun = new Hero();sun.heroName ="孙行者";sun.heroHP = 1500;System.out.println(sun.heroHP);//sun.heal();System.out.println(sun.heroHP);// 小明治疗孙悟空Hero xiaoming = new Hero();xiaoming.heroName ="小明";//xiaoming.heal(sun);System.out.println(sun.heroHP);}
}
方法的递归
练习
public class Raq {//方法 n表示为月份int growp(int n) {//1、出口if(n<=2) { //第一、二个月固定数量return 1;}else {//2、迭代 fum(n)= fum(n-1)+ fum(n-2) 当前月的数量等于前两个月的和return growp(n-1)+growp(n-2);}}//内部测试代码,要加static//外部测试代码则不用public static void main(String[] args) {//Raq ra = new Raq();//System.out.println(ra.growp(13));}
}
构造器的定义
定义
构造器的语法
成员变量默认初始化
练习
//分析:类--》属性--》方法--》测试
//班级Clazz--班级编号、班级名、学生列表,班主任,班长
//学生Student--姓名,住址地点public class Clazz {//-- 班级编号、班级名、学生列表String code;String name;Student[] students;//--班主任Teacher teacher;//--班长Student monitor;public Clazz() {//无参构造器}public Clazz(String n,Student[] stus) {//有参构造器name=n;students=stus;}//统计学生住址地点的方法,返回学生的住址地点String[] getStuAddress() {//1\创建一个数组,用于存放地址String[] adds = new String[students.length];//2\遍历学生,把地址存放到adds中for(int i=0;i<students.length;i++) {adds[i] = students[i].address;}//3\返回数组return adds;}
}//学生类
public class Student {// 外貌--属性--静态特征String name;String address;String sex;// 行为--方法--动态特征// 构造器本质是一个特殊的方法【不需要返回值类型、方法名和类名一致】// 无参构造器public Student() {}public Student(String n,String a) {name=n;address=a;}//全参构造器:在创建对象的同时,给成员变量赋值public Student(String n,String s,int a) {name=n;sex=s;age=a;}
}
//测试类
public class ClazzTest {public static void main(String[] args) {// 统计班级中学生的地址信息// 提供学生Student stu1 = new Student("zhang", "gz");Student stu2 = new Student("li", "sz");Student stu3 = new Student("wang", "zh");// 提供班级Clazz clazz = new Clazz("春田花花幼儿园", new Student[] { stu1, stu2, stu3 });// 调用班级的方法,得到地址信息String[] adds = clazz.getStuAddress();// 遍历显示地址for (String string : adds) {System.out.println(string);}}
}
对象创建的内存分析
6.面向对象,构造器,递归以及对象创建时内存分析(内含代码与练习)相关推荐
- 06JVM运行时内存分析
程序计数器 概述 程序计数器(Program Counter Register)也称之为PC寄存器,是一块较小的内存空间,用来存储指向下一条指令的地址,也可以看作是当前线程执行的字节码的行号指示器. ...
- 跟JVM搞对象 -- 深度剖析对象创建和内存分配
长久以来,面向对象编程大行其道.也正是因为有了面向对象的设计思想,技术才极大程度促进了社会的发展.作为新时代农民工,即已知晓或者掌握面向对象的编程方法,那么知其然也只其所以然也是我们每个人身体力行的必 ...
- JVM对象创建与内存分配机制学习总结
对象的创建过程 1.类加载检查 虚拟机遇到一条new指令时(new关键词.对象克隆.对象序列化等),首先会检查这个类是否已被加载.解析和初始化过.如果没有,要先执行相应的类加载过程. 2.分配内存 内 ...
- Java: String概述、对象创建的内存原理
1.String 概述 java.lang.String 类代表字符串,String类定义的变量可以用于指定字符串对象,然后操作该字符串. Java程序中的所有字符串文字(例如:"abc&q ...
- 32g内存 java开发,阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧...
内存分配机制 逐步分析 类加载检查: 虚拟机遇到一条new指令(new关键字.对象的克隆.对象的序列化等)时,会先去检查这个指令的参数在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否应被 ...
- 3. 对象创建与内存分配机制
对象的创建过程 1. 类加载检查 虚拟机遇到new指令的时候,首先去检查这个指令的参数能否在常量池中定位到一个符号引用,并检查这个符号引用所代表的类是否已被加载.解析和初始化过.如果没有,则执行相应的 ...
- JVM——对象创建与内存分配机制
文章目录 1.对象的创建 1.1.类加载检查 1.2.分配内存 1.3.初始化 1.4.设置对象头 1.5.执行方法 2.对象内存分配 2.1. 对象栈上分配 2.2.对象在Eden区分配 2.3.大 ...
- [转] python运行时内存分析工具meliae
转自:https://my.oschina.net/markco/blog/601773 利用meliae来监控python进程的内存占用情况 meliae是一个python进程内存占用监控.分析工具 ...
- python 内存分析工具_[转] python运行时内存分析工具meliae
meliae是一个python进程内存占用监控.分析工具,它的安装需要依赖pyrex包. 一.安装: 安装python内存分析工具 sudo pip install cython sudo pip i ...
最新文章
- 装饰模式(Decorator Pattern)--------结构型模式
- 【搬砖】【Python数据分析】Pycharm中plot绘图不能显示出来
- 2019.3.1版本pycharm撤销及恢复图解
- java构造顺序_Java构造顺序
- Error message IBase category does not exist in table T371A
- 面向服务的分析与设计原理
- Google推出“Google实验室” Ad Innovations
- jmeter上传文件搞了一天,才搞定,没高人帮忙效率就是低,赶紧记下来,以备后用...
- NBUT 1116 Flandre's Passageway (LIS变形)
- Java数据结构和算法 - 堆
- 音乐节拍自动标记插件 BeatEdit
- MATLAB 图像滤波器
- 犹太民族与基督的真相!
- 机器人改变生活利弊英语作文_机器人的利弊作文
- [LeetCode]Burst Balloons 爆气球
- 家族谱树形数据结构实现
- Oracle单机部署:GI安装
- 施工工地考勤防作弊通道系统,建筑工地通道系统管理方案
- Don‘t Cry Over Spilt Milk
- 空白新机设置——让新电脑nice一些
热门文章
- 三分屏课件制作_剪映如何制作三宫格视频(分屏功能)详细制作步骤
- 南卡骨传导耳机斩获缪斯国际设计大奖,成为中国品牌影响力的代表
- 英雄联盟手游段位一览 LOL手游段位图标大全
- 图数据库Neo4j实战(全网最详细教程)
- Epic Games 识别本地游戏不用重新下载
- 房贷15年提前10年还清划算吗?
- 游戏开发制作实用音效素材下载 - 分类:动物、环境、打斗、生活、魔法、自然、系统、交通、配音、战争
- outlook html邮件变成纯文本,outlook 2007 收到邮件变成纯文本
- 关于目标检测中bounding box编码和解码时weight参数的理解
- (绝对详细)CenterNet训练自己的数据(pytorch0.4.1)