Java 面向对象
类?对象?
定义类的语法格式:
Field 定义的语法
方法定义的语法::
构造器定义的语法:
成员变量:
局部变量:
this 关键字:
1.定义类
2.创建对象,调用方法
类?对象?
类:从某一类对象的【概念定义】。比如人类:所有抽象出来的概念定义
对象:以该概念所产生【一个实例】,它就属于对象。
Java程序中,类是最小的程序单位。
所有Java程序,都必须从定义类开始
定义类的语法格式:
[修饰符] class 类名
{
…类体…// 0~N 个 Field 定义
// 0~N 个方法定义
// 0~N 个构造器定义
}
/* 一个类中, 最多只有 5 种成分 */
[修饰符] — 可以省略,可以是public final abstract
类名 — 填空。语法角度来讲,只要是标识符即可。字母数字_$数字不开头
从程序可读性角度来看,必须是多个有意义的单词连缀,每个单词首字母大写(通过类名就大致猜到这个类是做什么的)
Field 定义的语法:
[修饰符] 类型 field名 [ = 默认值]; ([] 里可有可无)
[修饰符] — 可以省略,还可以是 public | protected | private(只能出现一个),static,final,transient (暂时用不到)
类型 — 不能省略。可以是基本类型,数组,任意类(JDK的类和自定义的类),接口,枚举
field名 — 不能省略。语法角度来讲,只要是标识符即可。字母数字_$数字不开头
从程序可读性角度来看,必须是多个有意义的单词连缀,第一个单词首字母小写,后面每个单词首字母大写(通过field名就大致猜到这个field是做什么的)
[ = 默认值] — 可以省略。默认值必须与它声明的类型是一致的。
方法定义的语法:
[修饰符] 返回值类型 方法名(0~N 多个形参声明)
{
// 0~N条可执行性的语句
// 如果方法签名中有返回值类型声明,该方法里必须包含【有效的】 return 语句
}
[修饰符] — 可以省略,还可以是 public | protected | private(只能出现一个),static,final | abstract(只能出现一个)
返回值类型 — 不能省略。可以是基本类型,数组,任意类(JDK的类和自定义的类),接口,枚举。void 用于声明该方法没有返回值。
方法名 — 不能省略。语法角度来讲,只要是标识符即可。字母数字_$数字不开头
从程序可读性角度来看,必须是多个有意义的单词连缀,第一个单词首字母小写,后面每个单词首字母大写(通过方法名就大致猜到这个方法是做什么的)应该“动词”
形参声明 — 每个形参都满足“[final] 类型 变量”的格式。
多个形参声明之间用英文逗号隔开。
方法体 — 方法体中可执行性的代码。代码的执行是从上到下的。
构造器定义的语法:
[修饰符] 构造器名(0~N 多个形参声明)
{
// 0~N条可执行性的语句
}
[修饰符] — 可以省略,还可以是 public | protected | private(只能出现一个)。
构造器名 — 不能省略,必须与类名相同。
形参声明 — 每个形参都满足“[final] 类型 变量”的格式。
多个形参声明之间用英文逗号隔开。
构造器的执行体 — 执行体中放置可执行性的代码。代码的执行是从上到下的。
构造器 可认为是一种特殊的方法,但构造器的作用,是用来产生对象的。
——通俗讲,当我们定义了一个类之后,就需要通过构造器来获取该类的实例。
【构造器的注意点:如果程序员没有为类定义任何的构造器,系统会为类提供一个无参数的构造器。】
static — 字面翻译是“静态”
有 static 修饰的成员,属于类本身。而不是属于实例的。
static 修饰的变量,是与类共存亡的。
没有 static 修饰的成员,属于实例。
没有static 修饰的变量,是与实例共存亡的。
局部变量,它本身既不可能属于实例,也不可能属于类。
所以局部变量不能使用static 修饰。
/*
成员变量:
A:在类方法外
B:在堆内存中
C:随着对象的创建而存在,随着对象的消失而销毁
D:有默认的初始化值
局部变量:
A:在方法定义中
B:在栈内存中
C:随着方法的调用而存在,随着方法的调用完毕而销毁
D:没有初始化的值,使用前必须定义和赋值
*/
以后,如果自己写Java程序
——永远都不要使用对象去调用static修饰的方法、field
你会看到别人的程序、考题,出现了使用对象去调用static 修饰的方法、field的情况。
——当我们要阅读该程序,解答该题时,先把对象换成类。
【Java 允许通过实例来调用 static 修饰方法、Field,本身是不应该的】
引用变量一定存放在栈内存中 是错的,定义声明在哪里就在哪里
成员变量:
如果程序没有初始化,系统会对它进行初始化。
初始化后的值是:如果是基本类型,初始值为 0 / 0.0 / \u0000 / false
如果是引用类型,初始值为 null
局部变量:
1. 方法里的局部变量
2. 形参
3.代码块的局部变量
局部变量的修饰符: final
局部变量必须由程序员赋初始值
this 关键字:
1.this 引用 ——在任何非static修饰方法、构造器可用
当this在方法中,this代表调用该方法的对象。
当this在构造器中时,this代表该构造器正在初始化的对象。
2.this 调用 ——只能在构造器的第一行出现
Dog (应用 this) 程序 及 运行结果:
public class Dog
{
// 代表狗胃中的食物量
double foodAmount;
String name;
public void eat()
{
// this代表调用该方法的对象
// this在该方法中代表的对象是不确定的
// 直到该方法被调用时才确定下来,谁调用这个方法,this就代表谁
this.foodAmount += 10;
}
public Dog(String name)
{
// this代表该构造器正在初始化的对象
this.name = name;
}
public void info()
{
System.out.println("我的名字是:" + this.name);
System.out.println("狗的食物为:" + this.foodAmount);
}
public static void main(String[] args)
{
// 调用构造器、方法时、参数值会传入构造器、方法中。
Dog d = new Dog("旺财");
Dog d2 = new Dog("毛毛");
Dog d3 = new Dog("汪汪");
d2.eat();
d2.info();
// d3的info方法
d3.info();
}
/**
语文 - 英语
正常的句子,满足如下格式:
主谓宾
猪八戒吃西瓜 zhubajie eat xigua
孙悟空飞 swk fly;
在“面向对象程序设计语言”里,上面两个方法可写为:
猪八戒.吃(西瓜);
孙悟空.飞();
孙悟空的年龄
张三的狗
*/
}
Apple 程序 :
public class Apple
{
// Field 定义: [修饰符] 类型 field名 [ = 默认值];
private int age;
protected String name;
static protected String[] subs;
double weight = 56.3;
int grade;
// grade = 2; // 不是field,不是方法,也不是构造器,是错的
/*
[修饰符] 返回值类型 方法名(0~N 多个形参声明)
{
// 0~N条可执行性的语句
// 如果方法签名中有返回值类型声明,该方法里必须包含【有效的】 return 语句
}
*/
String sayHi(String name)
{
grade = 2;
// 编译时候,if里只是一个boolean型的表达式,
// 系统认为if里return是有可能不被执行的,因此这个return还算不上有效
if(true)
{
return name + ",您好!";
}
else
{
return name + ",不好";
}
// 保证系统在编译阶段就识别到:至少有一条return语句被执行
}
}
相当于自定义了一个 Apple 类,形成的 .class 文件,在以下的 AppleTest 程序中调用
AppleTest 程序 及 运行结果:
public class AppleTest
{
public static void main(String[] args)
{
// apple 是一个局部变量
Apple apple; // Apple 是自定义的类
// new 后面带的是构造器
apple = new Apple(); // 创建一个Apple对象,并让apple引用变量指向Apple对象
// Apple 对象存放在堆里。apple引用变量保存在main方法栈里
// 要调用方法,就一定要满足对方的要求
System.out.println(apple.sayHi("晚安啊越~"));
// 使用局部变量之前,必须先赋初始值
System.out.println(apple); // 打印对象,输出的“类名@hashCode值”
// hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
}
}
以上
写在最后:
总结一下最经遇到的两个错误:
1.NullPointerException —— 空指针异常 当程序访问一个 null 对象的实例方法或实例属性,程序就会引发这个异常
2.ArrayIndexOutOfBoundsException —— 数组越界异常
下午效率极低,晚上到现在的效率还不错,难道我要改夜班吗,哭~
外面雨好大啊,虽然床上没有美人等我,但是还是要回家的啊~
金牛座的宝宝就是这样的吗,平时高冷的不行,这个时候我却感觉到了浓浓的爱意~哈哈哈哈,溜了~