类与对象
对象instance
含义:一种数据结构(对数据的管理模式),存放数据和数据的行为。
内存上:一块存放数据集合的内存块!。
对象本质:一种数据的组织方式。
类
组成:
成员变量:属性[描述信息]
成员方法:行为[能做的事]
对象与类的关系
1.对象是具体事物,类是对对象的抽象。
2.可理解位:类是对象的一种模板,对象是类的一个具体实例。
3.类描述同一类型对象的一个抽象概念,类中定义了这一类对象所应具有的共同的属性方法。
举例:飞机设计图就相当于类(抽象虚拟),真正制造出来并呈现在你面前的飞机是new出来的对象(现实) 。
示例:
package com.itcode.demo3;
import java.util.Arrays;
/**
* @Auther: 成都码到功成学员
* @Description:
*/
public class Test {
// 属性
int age;
String name;
// 方法
public int getAge() {
return age;
}
// 方法
public static void main(String[] args) {
// new Test()代表创建了对象。并把对象地址值赋给局部变量t。
Test t = new Test();
}
}
属性
类或类对象包含的数据。作用域是整个类体。
定义成员变量时可以对其初始化,如未定义,Java使用默认值对其初始化。
Java默认初始化值:
数据类型
默认值
整型
0
浮点型
0.0
字符型
‘\u0000’
布尔型
false
所有引用类型
null
示例:
package com.itcode.demo3;
import java.util.Arrays;
/**
* @Auther: 成都码到功成学员
* @Description:
*/
public class Test {
// 属性
int age;
String name;
// 方法
public int getAge() {
return age;
}
// 方法
public static void main(String[] args) {
// new Test()代表创建了对象。并把对象地址值赋给局部变量t。
Test t = new Test();
System.out.println(t.name);// null 引用类型
System.out.println(t.age);// 0 基本类型
}
}
java虚拟机内存
内存分为栈stack、堆heap、方法区method area。
栈:
每个方法被调用都会创建一个栈帧/线程(存储局部变量、操作数、方法出口等)。
栈是线程私有,线程间不能共享。
存储特性:先进后出。
栈由系统自动分配,速度快。栈内存空间连续。
堆:
存储创建好的对象和数组(数组也是对象)。
堆只有一个,被所有线程共享。
堆是不连续的内存空间,分配灵活,速度慢。
方法区:
方法区只有一个,被所有线程共享!
方法区实际也是堆。
存放程序中永远不变或唯一的内容。存储类信息【Class对象】、静态变量/方法、常量等。
关于对象与类关系的示例代码分析
重点必看
当class文件被加载至JVM里面时,会执行静态的main方法,同时在栈为main方法开启一个栈帧。
找到类型为TextStu定义的stu变量,目前它的值为null。
执行到new TextStu()的时候,会去调用TextStu类默认提供的无参构造方法,同时会在栈为构造方法开启开启栈帧。
构造方法执行完毕会在堆开辟一块TextStu对象的空间,类的属性与方法加载至对象中,并为属性分配初始化值。
堆会为TextStu对象分配一个地址值15db9742,把地址值赋值给变量stu。当我们使用stu时,stu会根据地址值15db9742去堆里面寻找。
执行到“stu.id = 2002;”,内存中id的值变为2002。执行到“stu.name = "成都码到功成"”,把方法区中的"成都码到功成"的地址值告诉给堆中的name。当你调用stu.name时,会在堆内存对象里面再根据地址值去找到方法区的"成都码到功成",并将这个值给stu.name。记住,堆里面的name的值并不是"成都码到功成",它的值只是字符串常量的地址值!类似的操作下去内存中age的值变成20。
执行到“Computer com”同时也会在栈main方法栈帧里面建立一个变量com,初始化值为null。
执行到“new Computer()”,会调用Computer类默认提供的无参构造方法,在栈里面为Computer类开启一个新的栈帧。
在堆里面为Computer类开辟一块空间,并把类的属性brand加载至内存,为其分配值null。
为空间分配地址值6d06d69c,并把6d06d69c给变量com,把变量com和名字为6d06d69c的内存空间关联起来。
执行到“com.brand = "神舟"”,把方法区的字符串“神舟”的地址值给brand。
执行到“stu.computer = com”,记住这里是把变量com的内存地址值赋值给stu.computer。所以堆里面15db974内存空间里面的属性computer的值就是Computer地址值6d06d69c。
当我们调用方法eat()时,打印“学生吃饭……”。
调用study方法时,study方法里面有“computer.brand”。computer属性是地址值6d06d69c,computer.brand就是6d06d69c.brand。brand有对字符串“神舟”的引用,所以study()方法的打印结果就是“学生学习电脑,请选神舟”。
注意:构造方法栈帧出栈时机:在堆开辟完空间并把地址值给常量stu/com时。

示例:
package com.itcode.demo;
/**
* @author: 成都码到功成学员
* @description:
* 对象与类
* 学生类示例
*/
class Computer{
String brand;
}
public class TestStu {
// 成员属性
int id;
String name;
int age;
// 引用计算机
Computer computer;
// 成员方法
public void study() {
System.out.println("学生学习电脑,请选" + computer.brand);
}
public void eat() {
System.out.println("学生吃饭……");
}
// 程序执行入口
public static void main(String[] args) {
// TODO Auto-generated method stub
TestStu stu = new TestStu();// 创建对象,//系统默认提供无参构造方法(作用:创建类的对象)
// com.itcode.demo.TestStu@15db9742的15db9742是TestStu对象在堆中的地址值。
System.out.println("TestStu地址值:" + stu);
stu.id = 2002;
stu.name = "成都码到功成";
stu.age = 20;
Computer com = new Computer();
System.out.println("Computer地址值:" + com); // 6d06d69c
com.brand = "神舟";
stu.computer = com;
// 调用方法
stu.eat();
stu.study();
}
}
效果:

匿名对象
没有名字的对象,比如new Stu(),对象在堆内存已经产生,但没有实际引用。
基本使用:
1、方法中作为实参进行参数传递;
2、只调用一次对象方法时,如new Stu().eat()
注意:对象要进行多个成员操作时,必须给对象起名。
弊端,对象一建立就变成了垃圾,无法再使用,只能使用一次。
方法
代码块/语句块
用花括号扩起的不限数量的Java语句。
代码块之间可以嵌套,嵌套代码块之间不能定义同名变量。
代码块的变量作用域仅限于此代码块,任意内部代码块可以调用外部定义的变量。
方法
1.概述:特供特定功能的代码块。
2.作用:定义类的实例的行为功能实现。是面向对象的核心。
3.格式:
修饰符1,修饰符2,…… 返回值类型 方法名(形参列表){
java语句……
Return 返回值;
}
4.术语介绍
形参:接收外界传入的数据。
实参:调用方法时实际给方法的值。
返回值:方法执行完毕返回给调用者的数字。
返回值类型:事先约定的返回值类型。如果无返回时,需把返回值类型定义成void。
注意:
1、所调用方法的形参列表(参数个数、数据类型、顺序)必须和实参匹配。
2、return 语句终止方法运行并指定返回数据。
3、参数传递:基本类型传递值的副本,引用类型传递对象引用值。
示例:
package com.itcode.method;
/**
* @author: 成都码到功成学员
* @Description:
* 方法使用
*/
public class TestMethod {
public static void main(String[] args) {
// TODO Auto-generated method stub
int sum = mAirthmetic(23, 4, 12);
System.out.println(sum);
}
// 定义一个乘法
public static int mAirthmetic(int a, int b, int c) {
int d = a + b +c;
return d; //return的作用:1.结束方法。 2.返回值。
}
}
方法重载(overload)
一个类出现一个以上同名方法,只要参数类型不同,与返回值类型无关。
记住,一个类永远不能出现两个完全一模一样的的方法。
构成重载:参数顺序不同,参数个数不同,参数类型不同。
注意:只有返回值或者形参名称不同不构成方法重载。返回值类型不同也不构成重载。
如【int a(int i)与void a(int i)】和【int a(int inx)与int a(int sit)】不构成。
// int a,int b 形参
public static int add(int a,int b){
return a+b;
}
public static void main(String[] args) {
// 23, 34 实参
HelloWorld.add(23, 34);
}
示例:
package com.itcode.method;
/**
* @author: 成都码到功成学员
* @Description:
* 方法重载
*/
public class TestMethod {
public static void main(String[] args) {
// TODO Auto-generated method stub
int sum =23;
System.out.println(sum);
}
public static int add(int a, int b) {
return a + b;
}
// 参数个数不同构成重载
public static int add(int a, int b, int c) {
return a + b + c;
}
// 参数类型不同构成重载
public static int add(byte a, int b) {
return a + b;
}
// 参数顺序不同构成重载
public static int add(int a, byte b) {
return a + b;
}
// 参数名称不同不构成重载
public static int add(int a, byte ab) {
return a + ab;
}
// 返回值类型不同不构成重载
public static void add(int a, byte ab) {
System.out.println(a + ab);
}
}
递归
关键词:本质、递归头体、耗时。
本质:自己调用自己。爬虫的本质就是递归。
递归头:什么时候不调用自身方法,也就是递归的结束条件,没有头会陷入死循环。
递归体:什么时候调用自身方法。
Last updated
Was this helpful?