1.Java语言的基本元素
类实际上在现实当中是不存在的,是一个抽象的概念,是一个模板。类的本质上现实世界当中某些事物具有共同特征,将这些共同特征提取出来形成的概念就是一个“类”。在Java的世界中,“万物皆为对象”。
对象是实际存在的个体(真实存在的个体),是类的实例化。
2.类的成员
1. 属性(field)
用来描述具体某个对象的特征。描述的是对象的状态信息,通常以变量的形式进行定义。
语法格式:
权限修饰符 [特征修饰符] 数据类型 属性名字[ = 值];
例如:
public class Person {
public String name;//成员变量
public int age;
public String sex;
}
变量通常分为成员变量和局部变量。
在类体中,方法体之外定义的变量称为“成员变量”
- 成员变量定义在类体中,在整个类中都可以被访问。
- 成员变量分为类变量和实例变量,实例变量存在于对象所在的堆内存中
成员变量有默认初始化值 - 成员变量的权限修饰符可根据需要,选择任意一个
- 创建对象后才能访问的变量称为实例变量
定义在方法内,代码块内的变量称为局部变量
- 局部变量定义在局部范围内
- 局部变量存在于栈内存中
- 作用范围结束,变量空间自动释放
- 局部变量无默认值,每次必须显示初始化
- 局部变量声明时一般不指定权限修饰符
2. 方法(method)
描述的是对象的动作信息,为定义在类中的具特定功能的一段独立的程序。
语法格式:
权限修饰符 [特征修饰符] 返回值类型 方法名字 (参数)[抛出的异常]{
方法体
}
- 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。
- 将功能封装为方法的目的是,可以实现代码重用,简化代码
- Java里的方法不能独立存在,所有的方法必须定义在类里。
public class Person {
//属性和方法--静态描述特点
//必要的组成部分
// 修饰符 数据类型 属性姓名[=值]
//权限修饰符 [特征修饰符] 数据类型 属性名字
public String name;//全局变量
public int age;
public String sex;
//方法--描述可以做什么事情(动作)
//权限修饰符 [特征修饰符] 返回值类型 ([参数列表]){方法体}
//1、无参数无返回值
//2、无参数有返回值
//3、有参数无返回值
//4、有参数有返回值
//无参数无返回值
//设计一个方法 用来描述人类可以做吃饭这件事
public void eat(){
System.out.println("吃了一碗大米饭");
}
//无参数有返回值
//设计一个方法 用来告诉别人我的名字
public String tellName(){
System.out.println("你们问我叫什么名字呀?勉强告诉你们一下");
return "张三";
}
//有参数无返回值
//设计一个新的吃饭方法
public void chiFan(int count,String something){
System.out.println("吃了"+count+"碗"+something);
}
//有参数有返回值
//设计一个方法 买饮料 1.需不需要提供条件 2.需不需要给别人留下什么结果
//需要提供条件 钱 需要返回值 饮料
public String buyDrink(int money){
if(money>5){
return "红牛";
}
else{
return "矿泉水";
}
}
}
方法的重载(overload)
概念:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
重载的特点:
与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。
参数列表的不同体现在哪里?
- 参数的个数
- 参数的leixing
- 参数的顺序
public class TestOverload {
//方法重载
public void test(){
System.out.println("执行了test方法中没有带参数");
}
public void test(boolean b){
System.out.println("执行了test方法中带boolean参数"+b);
}
public void test(int i){
System.out.println("执行了test方法中带int参数"+i);
}
public void test(char c){
System.out.println("执行了test方法中带char参数"+c);
}
public void test(String s){
System.out.println("执行了test方法中带String参数"+s);
}
public static void main(String[] args){
//创建对象
TestOverload to = new TestOverload();
//通过对象.方法名字 调用方法 可以直接通过方法名字定位方法
//如果方法名字一直 通过方法的参数列表类型来定位
//通过对象调用方法 方法执行一遍
to.test('a');//方法参数传递 类型之间的转换问题
//当没有char类型的方法时,会找一个参数类型可以自动转换的int类型方法
System.out.println(to);//TestOverload@34e45f-->hashCode码
}
}
可变个数的参数
public class Test {
//JDK1.5版本之后 出现的一个新的写法-->动态参数列表
//不能与数组类型的方法构成重载,因为本质上是一样的
public void test(int... x){//本质上是数组
System.out.println("执行了test方法携带的动态列表");
for(int i=0;i<x.length;i++){
System.out.println(x[i]);
}
}
public void test(int[]...x){
System.out.println();
}
public static void main(String[] args){
//创建对象
Test t = new Test();
t.test(1,2,3,4,5);
}
}
方法参数返回值问题
Java的实参值如何传入方法呢?
Java里方法的参数传递方式只有一种:值传递。 即将实际参数值的副本(传入方法内,而参数本身不受影响。
- 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
- 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
public class Test {
public int changeNum(int x){//将void变为int类型的
System.out.println("方法执行开始:"+x);//1
x = 10;
System.out.println("方法执行最终:"+x);//10
return x;//返回值 将x临时的变量空间内的值(值或引用)返回出来
}
public void changeArray(int[] x){
System.out.println("方法执行开始:"+x[0]);//1
x[0] = 10;
System.out.println("方法执行最终:"+x[0]);//10
}
//每一个类中不是必须包含主方法的
//主方法不属于任何一个类,主方法主语虚拟机
public static void main(String[] args){
//创建一个对象--前提 有一个类模型
//加载类模板的过程
Test t = new Test();//堆内存中开辟空间
int a = 1;
a = t.changeNum(1);//需要一个int的条件 int x = a;
//调用方法 让方法执行一遍
//1.方法存在哪里? 堆内存的对象空间内
//2.方法在哪里执行? 栈内存中开辟一块临时的方法执行空间
System.out.println("方法执行完毕,main方法中a的值:"+a);//1
// 临时开辟的执行changeNum方法的空间就没了 a的值没有改变只是被用了
System.out.println("++++++++++++++++++++++++++++++++++++++");
//加载类模板的过程
int[] b = new int[]{1,2,3};
t.changeArray(b);
//方法存在堆内存的对象空间里 方法执行在栈内存中的临时空间里
//调用方法值将b的值传递给了x int[] x = b; 传递过来的就是一个引用
System.out.println("方法执行完毕,main方法中b数组的第一个值:"+b[0]);//10
/**形参和实参
* 形参可以理解为是方法执行时的临时变量空间 x
* 实参可以理解为是方法调用时传递进去的参数 a
*方法调用时会将实参的内容传递给形参
* 如果内容是基本类型 传递的是值 形参改变 实参不变
* 如果内容是引用类型 传递的是引用(地址) 形参改变 实参跟着改变
*/
}
}
方法参数及返回值传递(基本类型)
方法参数及返回值传递(引用类型)
3. 构造方法(构造器)
构造方法的作用:构建(构造)当前类的对象;给对象进行初始化
语法格式:
权限修饰符 与类名一致的方法名 (参数列表) [抛出异常]{
语句;
}
public class Animal {
private int legs;
// 构造器
public Animal() {
legs = 4;
}
public void setLegs(int i) {
legs = i;
}
public int getLegs() {
return legs;
}
}
创建Animal类的实例:Animal a = new Animal();调用构造方法,将legs初始化为4。
根据参数不同,构造器可以分为如下两类:
- 隐式无参数的构造方法(系统默认提供)
- 显式定义一个或多个构造方法(无参、有参)
注意
- 一旦显式定义了构造方法,则系统不再提供默认构造方法
- 一个类可以创建多个重载的构造方法
构造方法的重载
public class Person{
public Person(String name, int age, Date d) {this(name,age);…}
public Person(String name, int age) {…}
public Person(String name, Date d) {…}
public Person(){…}
}
4. 块
作用:跟普通方法一样 做事情
语法格式:
{
java语句;
}
可以认为块是一个没有修饰符,没有参数,没有返回值,没有名字的特殊方法。
用法:
- 块需要调用才能执行,但是不需要我们自己调用
- 每一次调用构造方法之前,会自动调用块
3.this关键字
this是什么?
- 在方法内部使用,即这个方法所属对象的引用;
- 在构造器内部使用,表示该构造器正在初始化的对象。
this 可以调用类的属性、方法和构造器
什么时候使用this关键字呢?
- 当在方法内需要用到调用该方法的对象时,就用this。
具体的:我们可以用this来区分属性和局部变量。比如:this.name = name;
public class Person(){
String name;
int age;
public Person(){}
public Person(String name, int age){
this.name = name;
this,age = age;
}
public void talk(){
System.out.println("Person类中的说话方法");
this.study();
}
public void study(){
System.out.println("Person类中的学习方法");
}
public void display(){
System.out.println(this.name + "今年" + this.age + "岁");
}
}
- 在任意方法或构造器内,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的阅读性。不过,通常我们都习惯省略this。
- 当形参与成员变量同名时,如果在方法内或构造器内需要使用成员变量,必须添加this来表明该变量是类的成员变量。
- 使用this访问属性和方法时,如果在本类中未找到,会从父类中查找。
- his可以作为一个类中构造器相互调用的特殊格式。