面向对象编程(基础部分)
类与对象
- 类是抽象的,概念的,代表一类事物,比如人类,猫类…, 即它是数据类型.
- 对象是具体的,实际的,代表一个具体事物, 即是实例.
- 类是对象的模板,对象是类的一个个体,对应一个实例
字符串本质上是一个引用类型,按照jvm的规则会把字符串放在方法区的常量池中间。
栈中的是对象引用(对象名),实际上的对象在堆中。
// 创建Person 对象
// p1 是对象名(对象引用)
// new Person() 创建的对象空间(数据) 才是真正的对象
Person p1 = new Person();
// 对象的属性默认值,遵守数组规则:
对象
- 先声明再创建
Cat cat ; //声明对象cat
cat = new Cat(); //创建
- 直接创建
Cat cat = new Cat();
访问属性
对象名.属性名;
cat.name ;
cat.age;
cat.color;
Person p1=new Person0;
p1.age=10;
p1.name="小明";
Person p2=p1;//把p1赋给了p2,让p2指向p1
System.out.println(p2.age);
核心:引用传递传递的是地址。
方法
在某些情况下,我们要需要定义成员方法(简称方法)。
- 提高代码的复用性
- 可以将实现的细节封装起来,然后供其他用户来调用即可
访问修饰符 返回数据类型 方法名(形参列表..){//方法体
语句;
return 返回值;
}
// 如果方法是void,则方法体中可以没有return 语句,或者只写return;
访问修饰符(作用是控制方法使用的范围)
如果不写默认访问,[有四种: public, protected, 默认, private]
方法不能嵌套定义!
传参
基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参!
引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!
栈的值是地址,改的时候修改的是对应堆中的值。
递归
1.执行一个方法时,就创建一个新的受保护的独立空间(钱空间)
2.方法的局部变量是独立的,不会相互影响,比如n变量
3.如果方法中使用的是引用类型变量(比如数组,对象),就会共享该引用类型的数据。
4.递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError
5.当一个方法执行完毕,或者遇到return
,就会返回,遵守谁调用,就将结果返回给谁
重载(OverLoad)
java
中允许同一个类中,多个同名方法的存在,但要求形参列表不一致!
1)方法名: 必须相同
2)形参列表: 必须不同(形参类型或个数或顺序,至少有一样不同,参数名无要求)
3)返回类型: 无要求
可变参数
java
允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。就可以通过可变参数实现
访问修饰符返回类型方法名(数据类型... 形参名) {
}
1)可变参数的实参可以为0个或任意多个。
2)可变参数的实参可以为数组。
3)可变参数的本质就是数组。
4)可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后。
5)一个形参列表中只能出现一个可变参数。
public void f3(int... nums1, double... nums2) (X错误)
作用域
1.在java编程中,主要的变量就是属性(成员变量) 和 局部变量。
2.我们说的局部变量一般是指在成员方法中定义的变量。
3.java中作用域的分类
全局变量:也就是属性,作用域为整个类体
局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块中
4.全局变量(属性)可以不赋值,直接使用,因为有默认值,局部变量必须赋值后,才能使用,因为没有默认值。
注意
1.属性和局部变量可以重名,访问时遵循就近原则。
2.在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名。
3.属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。局部变量,生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁。
4.作用域范围不同
全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
局部变量:只能在本类中对应的方法中使用
5.修饰符不同
全局变量/属性可以加修饰符
局部变量不可以加修饰符
属性/成员变量/字段
成员变量 = 属性 = field(字段) (即成员变量是用来表示属性的,统一叫属性)
class Car {
String name;//属性, 成员变量, 字段field
double price;
String color;
String[] master;//属性可以是基本数据类型,也可以是引用类型(对象,数组)
}
属性是类的一个组成部分,一般是基本数据类型, 也可是引用类型(对象,数组)。
注意事项
属性的定义语法同变量,示例:访问修饰符属性类型属性名;
属性如果不赋值,有默认值,规则和数组一致。
构造方法/构造器
构造方法又叫构造器(constructor
),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。
[修饰符] 方法名(形参列表){
方法体;
}
- 构造器的修饰符可以默认, 也可以是public protected private
- 构造器没有返回值
- 方法名和类名字必须一样
- 参数列表和成员方法一样的规则
- 构造器的调用, 由系统完成
注意事项
1.一个类可以定义多个不同的构造器,即构造器重载
比如:我们可以再给Person类定义一个构造器,用来创建对象的时候,只指定人名,不需要指定年龄。
2.构造器名和类名要相同
3.构造器没有返回值
4.构造器是完成对象的初始化,并不是创建对象
5.在创建对象时,系统自动的调用该类的构造方法
6.如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器(也叫默认构造器). 比如Dog(){}
7.一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式的定义一下,即:Dog(){}
this 关键字
java
虚拟机会给每个对象分配this, 代表当前对象。
this.name
就是当前对象的属性name
。
隐藏的this
指向自己的堆地址。
this 的注意事项
-
this
关键字可以用来访问本类的属性、方法、构造器 -
this
用于区分当前类的属性和局部变量 -
访问成员方法的语法:
this.方法名(参数列表);
-
访问构造器语法:
this(参数列表);
注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一条语句) -
this
不能在类定义的外部使用,只能在类定义的方法中使用。
javap的使用
javap是JDK提供的一个命令行工具,javap能对给定的class文件提供的字节代码进行反编译。 通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作。
javap <options> <classes>
javap -c -v 类名
-help --help -? 输出此用法消息
-version 版本信息
-v -verbose 输出附加信息
-l 输出行号和本地变量表
-public 仅显示公共类和成员
-protected 显示受保护的/公共类和成员
-package 显示程序包/受保护的/公共类
和成员 (默认)
-p -private 显示所有类和成员
-c 对代码进行反汇编
-s 输出内部类型签名
-sysinfo 显示正在处理的类的
系统信息 (路径, 大小, 日期, MD5 散列)
-constants 显示最终常量
-classpath <path> 指定查找用户类文件的位置
-cp <path> 指定查找用户类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置