品牌创意型网站开发,兴城做网站推广的,成都建设网站报价,用dedecms做两个一样的网站一、类与对象
#xff08;一#xff09;类与对象的概念
#xff08;二#xff09;对象内存布局
编辑
对象分配机制
编辑
#xff08;三#xff09;属性/成员变量
#xff08;四#xff09;创建对象与访问属性
二、成员方法
#xff08;一#xff09;方法…一、类与对象
一类与对象的概念
二对象内存布局
编辑
对象分配机制
编辑
三属性/成员变量
四创建对象与访问属性
二、成员方法
一方法的快速入门
二方法的调用机制
三注意事项和使用细节
四成员方法传参机制
克隆对象
五方法递归调用
四、重载overload
五、可变参数
六、作用域
七、构造器构造方法
八、this this的深入理解
this的注意事项和使用细节
一、类与对象
一类与对象的概念
对象属性行为 1、类是抽象的、概念的代表一类事物比如人类、猫类...即它是数据类型
2、对象是具体的、实际的代表一个具体事物即是实例
3、类是对象的模版对象是类的一个个体对应一个实例
快速入门
public class Object01{public static void main(String[] args){// 实例化第一只猫Cat cat1 new Cat();cat1.name 小白;cat1.age 3;cat1.color 白色;// 实例化第二只猫Cat cat2 new Cat();cat2.name 小花;cat2.age 5;cat2.color 花色;// 使用访问对象的属性System.out.println(第一只猫的信息 cat1.name cat1.age cat1.color);System.out.println(第二只猫的信息 cat2.name cat2.age cat2.color);}
}
// 定义一个猫类
class Cat {// 属性String name;int age;String color;// 行为...
}
二对象内存布局 对象分配机制
Java内存的结构分析
1、栈一般存放基本数据类型局部变量
2、堆存放对象Cat cat,数组等
3、方法区常量池常量比如字符串类加载信息 1、先加载Person类信息属性和方法只会加载一次
2、在堆中分配空间进行默认初始化
3、把空间地址赋值给pp就指向对象
4、进行指定初始化
三属性/成员变量
基本介绍
1、从概念或叫法上看成员变量 属性 字段field即成员变量是用来表示属性的
2、属性是类的一个组成部分一般是基本数据类型也可是引用类型对象数组
注意事项和细节
1、属性的定义语法同变量示例 访问修饰符 属性类型 属性名; 访问修饰符控制属性的访问范围包括public,protected,默认,private 2、属性的定义类型可以为任意类型包含基本类型或引用类型
3、属性如果不赋值有默认值规则和数组一致
四创建对象与访问属性
创建对象
1、先声明再创建 Cat cat; cat new Cat();
2、直接创建 Cat cat new Cat();
访问属性 对象名.属性名; cat.name;
二、成员方法
一方法的快速入门
基本介绍在某些情况下需要定义成员方法简称方法。比如人类除了有一些属性外年龄、姓名...还有一些行为说话、跑步...这时就要用成员方法才能完成。
成员方法的好处提高代码的复用性可以将实现的细节封装起来然后供其他用户来调用即可。
成员方法快速入门
1、添加speak成员方法输出我是一个好人
2、添加cal01成员方法可以计算从1...1000的结果
3、添加cal02成员方法该方法可以接收一个数n计算从1...n的结果
4、添加getSum成员方法可以计算两个数的和
public class Method01{public static void main(String[] args){Person p1 new Person();p1.speak(); //调用方法p1.cal01();p1.cal02(5);int returnRes p1.getSum(10,12);System.out.println(getSum的计算结果是 returnRes);}
}
class Person{String name;int age;// public:表示方法是公开的// void:表示方法没有返回值// speak():speak方法名()形参列表// {}方法体public void speak(){System.out.println(我是一个好人);}public void cal01(){int sum 0;for(int i 1; i 1000; i){sum i;}System.out.println(cal01的计算结果是 sum);}public void cal02(int n){int sum 0;for(int i 1; i n; i){sum i;}System.out.println(cal02的计算结果是 sum);}public int getSum(int n1, int n2){int sum n1 n2;return sum;}
}
成员方法的定义
public 返回数据类型 方法名(形参列表...){ 语句; return 返回值;
}
1、参数列表表示成员方法输入
2、数据类型返回类型表示成员方法输出void表示没有返回值
3、方法主体表示为了实现某一功能代码块
4、return语句不是必须的
二方法的调用机制 1、当程序执行到方法时就会开辟一个独立的空间栈空间
2、当方法执行完毕或者执行到return语句时就会返回
3、返回到调用方法的地方
4、返回后继续执行方法后面的代码
5、当main方法栈执行完毕整个程序退出
三注意事项和使用细节
1、访问修饰符作用是控制方法使用的范围如果不写则默认访问。
public protected 默认 private
2、返回类型
1一个方法最多一个返回值如果返回多个结果可以返回数组
2返回类型可以为任意类型包含基本类型或引用类型数组对象 3如果方法要求有返回数据类型则方法体中最后的执行语句必须为return值而且要求返回值类型必须和return的值类型一致或兼容
4如果方法是void则方法体中可以没有return语句或者只写return
3、方法名遵循驼峰命名法最好见名知义
4、参数列表
1一个方法可以有0个参数也可以有多个参数中间用逗号隔开
2参数类型可以为任意类型包含基本类型或引用类型
3调用带参数的方法时一定对应着参数列表传入相同类型或兼容类型的参数
4方法定义时的参数称为形式参数简称形参方法调用时的参数称为实际参数简称实参。实参和形参的类型要一致或兼容个数、顺序必须一致
5、方法体
里面写完成功能的具体语句可以为输入、输出、变量、运算、分支、循环、方法调用但里面不能再定义方法即方法不能嵌套定义。
6、方法调用
1同一个类中的方法调用直接调用即可 2跨类中的方法A调用B类方法需要通过对象名调用比如对象名.方法名(参数)
3跨类的方法调用和方法的访问修饰符相
四成员方法传参机制
1、基本数据类型的传参机制 结论基本数据类型传递的是值值拷贝形参的任何改变不影响实参
2、引用数据类型的传参机制 结论引用类型传递的是地址传递也是值但是值是地址可以通过形参影响实参
克隆对象
例子编写一个方法copyPerson可以复制一个Person对象返回复制的对象克隆对象。注意要求得到的新对象和原来的对象是两个独立的对象只是他们的属性相同。
public class Method03{public static void main(String[] args){Person p1 new Person();p1.name 小哈;p1.age 18;MyTools myTools new MyTools();Person p2 myTools.copyPerson(p1);System.out.println(p1的属性为名字 p1.name 年龄 p1.age);System.out.println(p2的属性为名字 p2.name 年龄 p2.age);// 可以通过对象比较来看对象是否同一个System.out.println(p1 p1);System.out.println(p1 p2);}
}
class Person{String name;int age;
}
class MyTools{public Person copyPerson(Person p){Person p_copy new Person();p_copy.name p.name;p_copy.age p.age;return p_copy;}
} 五方法递归调用
递归就是方法自己调用自己每次调用时传入不同的变量。递归有助于编程者解决复杂问题同时可以让代码变得简介。
递归能解决的问题
1、各种数学问题8皇后问题汉诺塔阶乘问题迷宫问题球和篮子问题
2、各种算法中也会使用到递归比如快排归并排序二分查找分治算法等
3、将用栈解决问题
递归的重要规则
1、执行一个方法时就创建一个新的受保护的独立空间栈空间
2、方法的局部变量是独立的不会相互影响
3、如果方法中使用的是引用类型变量比如数组就会共享该引用类型的数据
4、递归必须向退出递归的条件逼近否则就是无线递归StackOverflowError
5、当一个方法执行完毕或者遇到return就会返回遵守谁调用就将结果返回给谁同时当方法执行完毕或者返回时该方法也就执行完毕。
例子
1、打印问题
public void test(int n){if(n 2){test(n - 1);}System.out.println(n n);
} 2、阶乘问题
public int factorial(int n){if(n 1){return 1;}else{return factorial(n - 1) * n;}
} 3、斐波那契数列
1,1,2,3,5,8,13...
public int Fibonacci(int n){if(n 1 || n 2){return 1;}else{return Fibonacci(n - 1) Fibonacci(n - 2);}
}
4、猴子吃桃问题
有一堆桃子猴子第一天吃了其中的一半并再多吃了一个。以后每天猴子都吃其中的一半然后再多吃一个。当到第10天时想再吃时发现只有一个桃子了。问题猴子吃到第day天共有多少个桃子
public int Peach(int day){if(day 10){return 1;}else{return (Peach(day 1) 1) * 2;}
}
5、老鼠走迷宫问题
public class MiGong{public static void main(String[] args){// 1、先用二维数组创建迷宫// 2、规定数组的元素值0表示可以走1表示障碍物int map[][] new int[8][7];// 设置障碍for(int i 0; i 7; i){map[0][i] 1;map[7][i] 1;}for(int i 0; i 8; i){map[i][0] 1;map[i][6] 1;}map[2][1] 1;map[2][2] 1;map[2][4] 1;map[3][2] 1;map[3][3] 1;// 输出当前地图for(int i 0; i map.length; i){for(int j 0; j map[i].length; j){System.out.print(map[i][j] );}System.out.println();}// 使用findWay给老鼠找路T t new T();t.findWay(map, 1, 1);System.out.println(找路情况);for(int i 0; i map.length; i){for(int j 0; j map[i].length; j){System.out.print(map[i][j] );}System.out.println();}}
}
class T {// 使用递归回溯的思想解决老鼠出迷宫// 该方法目的是找出迷宫的路径// (i,j)是老鼠的位置初始位置是(1,1)// 因为是递归找路所以先规定map数组的各个值含义0表示可以走1表示障碍物2表示走过3表示走不通// 当map[6][5] 2就说明找到通路就可以结束否则就继续找// 确定老鼠找路策略下-右-上-左 策略对结果有影响public boolean findWay(int map[][], int i, int j){if(map[6][5] 2){ //说明已经找到return true;}else{if(map[i][j] 0){ //表示可以走// 假定可以走通map[i][j] 2;// 使用找路策略来确定该位置是否真的可以走通if(findWay(map, i 1, j)){ //向下走return true;}else if(findWay(map, i, j 1)){ //向右走return true;}else if(findWay(map, i - 1, j)){ //向上走return true;}else if(findWay(map, i, j - 1)){ //向左走return true;}else{map[i][j] 3;return false;}}else{ // map[i][j] 1/2/3return false;}}}
} 6、汉诺塔问题
public class HanoiTower{public static void main(String[] args){Tower tower new Tower();tower.move(5,A,B,C);}
}
class Tower {// num表示要移动的盘子a、b、c表示A塔、B塔、C塔public void move(int num, char a, char b, char c){if(num 1){ //如果只有一个盘System.out.println(a - c);}else{// 如果有多个盘可以看成只有两个盘最下面的盘和上面的所有盘// (1)先移动上面所有的盘到b借助cmove(num - 1, a, c, b);// (2)把最下面的盘移动到cSystem.out.println(a - c);// (3)再把b的所有盘移动到c借助amove(num - 1, b, a, c);}}
}
四、重载overload
java中允许同一个类中多个同名方法的存在但要求形参列表不一致。比如System.out.println(); out是PrintStream类型。
重载的好处
1、减轻了起名的麻烦
2、减轻了记名的麻烦
注意事项和使用细节同名不同参
1、方法名必须相同
2、形参列表必须不同参数类型或个数或顺序至少有一样不同参数名无要求
3、返回类型无要求
public class OverLoad01{public static void main(String[] args){MyCalculator mc new MyCalculator();System.out.println(mc.caculate(10,12));System.out.println(mc.caculate(10.10,12));System.out.println(mc.caculate(10,12.10));System.out.println(mc.caculate(2000,10,12));}
}
class MyCalculator{public int caculate(int n1, int n2){return n1 n2;}public double caculate(int n1, double n2){return n1 n2;}public double caculate(double n1, int n2){return n1 n2;}public int caculate(int n1, int n2, int n3){return n1 n2 n3;}
}
五、可变参数
java允许将同一个类中多个同名同功能但参数个数不同的方法封装成一个方法。可以通过可变参数实现。
基本语法
访问修饰符 返回类型 方法名(数据类型... 形参名){
} public class VarParameter01{public static void main(String[] args){Method method new Method();System.out.println(method.sum(10,12,56));}
}
class Method{// int... 表示接受的是可变参数类型是int即可以接收多个int(0-多)// 使用可变参数时可以当做数组来使用即nums可以当做数组public int sum(int... nums){// System.out.println(接收的参数个数 nums.length);int res 0;for(int i 0; i nums.length; i){res nums[i];}return res;}
}
注意事项和细节
1、可变参数的实参可以为0个或任意多个
2、可变参数的实参可以为数组 3、可变参数的本质就是数组
4、可变参数可以和普通类型的参数一起放在形参列表但必须保证可变参数在最后
5、一个形参列表中只能出现一个可变参数
六、作用域
介绍
1、在java编程中主要的变量就是属性成员变量和局部变量
2、局部变量一般是指在成员方法中定义的变量
3、java中作用域的分类
全局变量也就是属性作用域为整个类体
局部变量也就是除了属性之外的其他变量作用域为定义它的代码块中
4、全局变量可以不赋值直接使用因为有默认值局部变量必须赋值后才能使用因为没有默认值。
注意事项和细节
1、属性和局部变量可以重名访问时遵循就近原则
2、在同一个作用域中比如在同一个成员方法中两个局部变量不能重名
3、属性生命周期较长伴随着对象的创建而创建伴随着对象的销毁而销毁。局部变量生命周期短伴随着它的代码块的执行而创建伴随着代码块的销毁而销毁即在一次方法调用过程中。
4、作用域不同
全局变量可以被本类使用或其他类使用通过对象调用
局部变量只能在本类中对应的方法中使用
5、修饰符不同
全局变量/属性可以加修饰符
局部变量不可以加修饰符
七、构造器构造方法
需求前面在创建对象时是先把一个对象创建好后再给他的年龄和姓名属性赋值如果现在要求在创建对象时就直接指定这个对象的年龄和姓名这时就可以使用构造器。
介绍构造方法又叫构造器(constructor)是类的一种特殊的方法它的主要作用是完成对新对象的初始化。
基本语法
修饰符 方法名(形参列表){ 方法体;
}
public class Constructor01{public static void main(String[] args){Person person new Person(Smith,80);System.out.println(name person.name age person.age);}
}
class Person{String name;int age;// 构造器public Person(String pName, int pAge){name pName;age pAge;}
}
注意事项和使用细节
1、构造器的修饰符可以默认也可以是public protected private
2、构造器没有返回值
3、方法名和类名字必须一样
4、参数列表和成员方法一样的规则
5、构造器是完成对象的初始化并不是创建对象。在创建对象时系统会自动调用该类的构造器完成对象的初始化
6、一个类可以定义多个不同的构造器即构造器重载。比如可以再给Person类定义一个构造器用来创建对象的时候只指定人名不指定年龄。 7、如果程序员没有定义构造器系统会自动给类生成一个默认无参构造方法也叫默认构造方法比如Dog(){}使用javap指令反编译看看。
javap是jdk提供的一个命令行工具能对给定的class文件提供的字节代码进行反编译。 8、一旦定义了自己的构造器默认的构造器就覆盖了就不能再使用默认的无参构造器除非显式的定义一下即Person(){}
对象创建流程分析 1、加载Person类信息(Person.class)只会加载一次
2、在堆中分配空间地址
3、完成对象初始化先默认初始化age0 namenull再显式初始化age90 namenull最后是构造器的初始化age20 name小倩
4、在对象在堆中的地址返回给pp是对象名也可以理解成是对象的引用
八、this 构造器中的name name; age age;都是局部变量。 this介绍java虚拟机会给每个对象分配this代表当前对象。 this的深入理解 java中没有办法直接获取到实际地址因为是在虚拟机里的是虚拟地址可以使用hashCode来获取哈希值。 简单来说 哪个对象调用this就代表哪个对象。
this的注意事项和使用细节
1、this关键字可以用来访问本类的属性、方法、构造器
2、this用于区分当前类的属性和局部变量
3、访问成员方法的语法this.方法名(参数列表); 两种方法有区别在继承里会涉及
4、访问构造器语法this(参数列表); 注意只能在构造器中使用即只能在构造器中访问另外一个构造器。而且必须放在第一条语句。 5、this不能在类定义的外部使用只能在类定义的方法中使用