一 类与对象概述
1类与对象简述
(1)类是抽象的,是一种泛称,比如人类、狗类,是一种概括性的称呼
(2)对象是具体的,是一个个具体的实例,比如一只名叫点点的泰迪狗
(3)类是对象的种类的总称,对象是类下一个个具体的实例
(4)对象属性:用于说明对象具体的特征,比如点点的毛发颜色等
(5) 对象方法:用于说明对象的具体功能
2关系图如下
二 成员方法和成员变量(属性)
1成员变量
(1)概念
成员变量=属性=field(即成员变量是用来表示属性的)
属性是类的一个组成部分,一般是基本数据类型,也可以是引用数据类型(数组,对象)
(2)属性定义语法
public class Explain {
public static void main(String[] args) {
Dog dog = new Dog();//创建Dog对象
System.out.println(dog.name);//对象引用
}
}
class Dog{
访问修饰符 属性类型 属性名;
String name = "点点";
int age = 3;
}
(3)注意
属性如果不赋值会有默认值,不同数据类型会有不同默认值,int 0、short 0、byte 0、long 0、float 0.0、double 0.0、char \u0000,boolean false,String null
2成员方法
(1)成员方法语法
创建类名为Dog的类
class Dog{
成员方法的形式:
修饰符 返回值类型 方法名(参数列表....){
return 返回值;
}
public String bark(){
return "bark";
}
}
(2)返回值问题
当无返回值要求时,即返回值类型为void,方法体中可以没有return语句,或者只写return
当有返回值时,方法体中最后执行的语句必须是return值
一个方法最多有一个返回值,如果要返回多个值,那么可以创建一个数组,将值存放在数组当中
返回值类型可以是任意类型,包含基本类型或引用类型(数组、对象)
(3)参数列表问题
一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开
参数类型可以是基本数据类型,也可以是引用数据类型
调用带参数的方法时,一定对应着参数列表传入相同类型或者兼容类型的参数
方法定义时的参数称作形式参数,简称形参;方法调用时的参数称为实际参数,简称实参
(4)方法调用细节
//1 一个类中的不同方法,可以直接调用
class A{
public void print(int n){
System.out.println("print方法被调用" + n);
}
public void printAgain(){
print(10);
}
}
//2 跨类方法的调用,A类调用B类的方法,需要通过对象名调用
class A{
public void a(){
B b = new B();
b.b();
}
}
class B{
public void b(){
System.out.println("B类中的方法被调用");
}
}
注意:跨类的方法调用和方法的访问修饰符十分有关系
(5)成员方法的传参机制
如果方法的参数列表是基本数据类型,那么实参的传入也对应是基本数据类型,注意点基本数据类型传递的是值拷贝,形参(参数列表中的值)的任何改变不影响实参
相反如果是引用类型传递,其传递也是值,但是值是地址,可以通过形参影响实参
(6)成员方法的好处
可以将实现的细节进行封装,然后供其他用户调用
提高了代码的复用性
3 如何创建对象
以声明dog对象为例,类名为Dog//
//1 先声明再创建
Dog dog;
dog = new Dog();
//2 直接创建
Dog dog = new Dog();
三 对象在内存中的存在形式
Java虚拟机运行时的数据区,可以简单的分为栈区、堆、方法区
1栈区
线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。
从引用中可以知道,执行Java方法时,都会新创建一个栈区中创建一个新的空间
局部变量表:存放编译期存在的各种基本数据类型
2堆区
对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组。内部会划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)。可以位于物理上不连续的空间,但是逻辑上要连续。
3方法区
属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
四 变量作用域
1概述
Java编程中,主要的变量指的是属性(成员变量)和局部变量
2作用域分类
全局变量:指的是属性,作用域为整个类体,例如在Dog类中的方法都可以使用
局部变量:除了属性之外的其他变量,作用域为定义它的代码块中。也就是说局部变量一般指在成员方法中定义的变量
3注意点
全局变量可以不赋值直接使用,因为其有默认值。
局部变量必须赋值后,才能使用,因为其没有默认值。
属性和局部变量可以重名,访问时遵循就近原则
在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名
作用域不同:全局变量可以被本类调用,或其他类使用。局部变量只能在本类对应方法中使用
修饰符不同:全局变量可以加修饰符,局部变量不可以加修饰符
五 方法递归
1 简介
方法递归:递归就是方法自己调用自己,每次调用时传入不同的变量,最终达到目的
2 代码
public class Method {
public static void main(String[] args) {
T t = new T();
t.test(4);
}
}
class T{
public void test(int n){
if (n > 2){
test(n - 1);
}
System.out.println("n=" + n);
}
}
3 递归重要规则
(1)执行一个方法时,就创建一个新的受保护的独立空间(栈空间)具体可参照对象在内存中的存在形式
(2)方法的局部变量是独立的,不会相互影响
(3)递归必须向退出递归的条件逼近,否则就是无限递归
(4)当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕了
六 方法重载
1 简介
Java中允许同一个类中,存在多个同名方法,但要求形参列表不一致
2 注意事项
方法名:必须相同
形参列表:必须不同(形参类型或者个数或顺序,至少有一样不同,参数名无要求)
返回类型:无要求
七 可变参数
1 简介
Java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。就可以通过改变参数的个数实现预计达到的效果
2 基本语法
访问修饰符 返回值类型 方法名(数据类型... 形参名){
}
3 注意事项
可变参数的实参可以为0个或者任意多个
可变参数的实参可以为数组
可变参数的本质就是数组
可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数放置在形参列表的最后
一个参数列表中只能出现一个可变参数
4 案例
//求多个数的和
public class VarParameter {
public static void main(String[] args) {
VarMethod varMethod = new VarMethod();
int i = varMethod.sum(1,2,3);
System.out.println("总和为" + i);
}
}
class VarMethod {
int sum = 0;
public int sum (int... num){
//可变参数的本质为数组,所以要访问形参num中的值,就要遍历它
for (int i = 0; i < num.length; i++) {
sum += num[i];
}
return sum;
}
}
八 构造器(构造方法)
1 基本介绍
构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化
2 基本语法
【修饰符】 方法名 (形参列表){
}
3 注意事项
构造器的修饰符可以默认
构造器没有返回值
构造器方法名和所在类名字必须一致
参数列表和成员方法的参数列表一样规则
在创建对象时,系统会自动地调用该类地构造器完成对对象地初始化
4 构造方法的练习
public class Constructor {
public static void main(String[] args) {
//通过构造器指定人的姓名和年龄
Person person = new Person("Tom",18);
System.out.println("person对象的名字" + person.name);
System.out.println("person对象的年龄" + person.age);
}
}
class Person{
String name;
int age;
public Person(String pName,int pAge){
System.out.println("构造器已被调用");
name = pName;
age = pAge;
}
}
5 注意事项
一个类可以定义多个不同的构造器,即构造器重载
构造器是完成对象的初始化,并不是创建对象
在创建对象时,系统自动的调用该类的构造方法
如果没有定义构造器,系统会自动给类生成一个默认无参构造器(也叫默认构造器)
一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器了
构造器是完成对象的初始化,对象要具有属性和方法。因此在使用构造器之前,也要给对象设置相应的属性
九 this关键字
1 什么是this
Java虚拟机会给每个对象分配this,代表当前对象
2 this使用的关键
哪个对象调用,this就代表哪个对象
3 注意事项和使用细节
this关键字可以用来访问本类的属性、方法、构造器
this可以用来区分当前类的属性和局部变量
如果将上图中的this.name变成name,则会造成在属性和局部变量重名的情况,其会采取就近原则的方法进行相应处理。造成没有对对象属性初始化的情况
访问成员方法的语法:this.方法名(参数列表);
访问构造器语法:this(参数列表);注意只能在构造器中使用(即只能在构造器中访问另一个构造器)
对于此的调用,必须要在构造器中的第一条语句调用
public class thisDetail {
public static void main(String[] args) {
Person person = new Person();
}
}
class Person{
String name;
int age;
public Person(){
this("jack",18);
System.out.println("Person() 构造器被调用");
}
public Person(String name,int age){
this.name = name;
this.age = age;
System.out.println(name);
System.out.println(age);
}
}
this不能在类定义的外部使用,只能在类定义的方法中使用(即不能乱写)