面向对象基础
我们可以用关键字class来定义一个类,一个java文件可以同时定义多个class。每一个源文件必须有且只有一个public class,并且类名和文件名保持一致!
类的组成: [修饰符] 属性类型 属性名 = [默认值]
方法组成:[修饰符] 返回值类型 方法名(形参列表) {}
创建对象:
对象?当然这里不是我们想要有的那个对象哈。java中对象(object)是实例存在的某些事物的个体,也称实例。(class)类是创建对象的模板,对象是类的实例。定义一个类,也就是说明一个类。创建了一个类,一定要实例化对象后,才能访问和调用。
- 声明对象:类定义了一类对象的特征,每一个对象都是相应类的实例。
结构: 类名 对象名; 例如 Person a; - 创建对象:要为对象分配内存空间,还需要用new关键字来创建对象。
结构:对象名 = new 构造方法名(实参列表); Person a=new Person(); - 对象的使用:对象创建后,可以访问对象的属性和方法。
结构: 对象名 . 属性名 或 对象名 . 属性名(实参列表);
构造方法(重点):
构造方法是一种特殊的方法,利用构造方法能够初始化对象的属性,注意的是,构造方法必须与定义它的类有完全相同的名字。
构造方法的结构:
[修饰符] 类名(参数列表){
//方法体
}
构造方法具有以下特点:
1)具有与类相同的名称
2)不含返回值类型
3)不能在方法中用return语句返回一个值
4)一般访问权限为public
构造方法的作用:
1)完成对象的创建,即完成对象的实例化
2)一般使用构造方法来完成对属性的初始化
在开发中,我们编写自己的类时,应该根据需要提供相应的构造方法,保证在用这个类时,能够选择合适的构造方法。构造方法可以像普通方法一样发生重载,声明多个有不同参数的构造方法。任何对象都是通过内存分配操作符new创建和开辟内存空间。
如果在开发时,没有明确的写出构造方法,在编译时编译器会发现该类没有构造方法,这时编译器会自动地给这个类增加一个构造方法,该构造方法没有任何参数,称之为“默认的空构造方法”。要养成写构造方法的习惯,哪怕是无参构造方法。
//无参构造方法
class Person{
String name;
int age;
String address;
/*
默认存在的无参构造方法
public Person() {}
*/
}
public class Text{
public static void main(String[] args){
Person P = new Person();
P.name="xiaohong";
P.age=23;
P.address="召唤兽峡谷";
System.out.println("姓名:"+P.name+"\n年龄:"
+P.age+"\n地址"+P.address);
}
}
this关键字介绍:
当创建一个对象成功后(在构造方法调用前,对象已经创建成功),虚拟机(JVM)会动态的分配一个引用,该引用指向的就是当前对象,这个引用的名字叫做this。
在成员方法中:谁调用这个方法,那么this就指向那个对象。
在构造方法中:this指向新创建的那个对象。
this关键字主要应用:
1、this调用本类中的成员变量;
2、this调用本类中的成员方法;
3、this调用本类中的其它构造方法
class Person{
//有参构造方法
String name;
int age;
String address;
public Person(String name,int age,String address){
this.name=name;
this.age=age;
this.address=address;
}
}
public class Text{
public static void main(String[] args){
Person P = new Person("xiaohong",23,"召唤兽峡谷");
System.out.println("姓名:"+P.name+"\n年龄:"+P.age+"\n地 址:"+P.address);
}
}
注意:
1、如果定义了指定的构造方法,那么默认提供的构造方法就没有了。
2、当局部变量和成员变量同名,使用this来区分成员变量。
3、建议:不要省略无参构造方法,每个类中都应该有自己的无参构造方法。
Static关键字:
在类中(方法之外),用static修饰的变量我们称之为静态变量或类变量。
切记:static不能用于修饰局部变量!!!
静态变量:
1、 静态变量优先于对象存在,静态变量随着类的加载就已经存在了。
2、 一个类中,静态变量只有一份,可以被该类和该类的对象所共享。
3、 我们可以通过 类名.静态变量或 对象.静态变量 来操作静态变量。
//今天变量案例
class Person{
String name;
int age;
String address;
static String sex;
public Person(String name,int age,String address){
this.name=name;
this.age=age;
this.address=address;
}
void show(){
System.out.println("姓名:"+name+"\n年龄:"+age+"\n地址:"+address);
}
}
public class Text{
public static void main(String[] args){
Person P = new Person("xiaohong",23,"召唤兽峡谷");
P.show();
Person.sex="男";
System.out.println(Person.sex);
}
}
静态变量和成员变量区别
区别一:生命周期不同
成员变量随着对象的创建而创建,随着对象的回收而释放。
静态变量随着类的第一次加载而存在,随着类的消失而消失。
区别二:调用方式不同
成员变量只能被对象调用。
静态变量可以被类名调用,也可以被对象调用。
区别三:数据存储位置不同
成员变量存储在堆中,也称为对象的特有数据。
静态变量存储在方法区(共享数据区)的静态区,也称为对象的共享数据。
区别四:创建次数不同
成员变量可以创建任意多次,每创建一次对象就创建了一次成员变量。
静态变量只能创建一次,被该类和该类的对象所共享。
静态方法:
静态方法特点
1、静态方法优先于对象存在,静态方法随着类的加载就已经存在了。
2、我们可以通过 类名.静态方法() 或 对象.静态方法() 来调用静态方法。
3、用static修饰的方法我们称之为静态方法或类方法。
//静态方法案例
class Student {
String name;
// 构造方法
public Student(String name) {
this.name = name;
}
// 静态方法
public static void study() {
System.out.println("我是一个静态方法。");
}
}
public class StaticMethodDemo {
public static void main(String[] args) {
// 使用类名调用静态方法
Student.study();
// 实例化一个对象
Student stu = new Student("小明");
// 使用对象来调用静态方法
stu.study(); // 不建议使用!
}
}
静态方法和成员方法区别
区别一:访问变量区别
成员方法中既能访问成员变量,又能访问静态变量。
静态方法中只能访问静态变量,不能访问成员变量,因为对象可能还未初始化。
区别二:访问方法区别
成员方法中既能访问成员方法,又能访问静态方法。
静态方法中只能访问静态方法,不能访问成员方法,因为对象可能还未初始化。
区别三:访问this区别
成员方法中可以访问this。
静态方法中不能访问this,因为对象可能还未初始化。
静态代码块:
在类中,没有用static修饰的代码块叫做构造代码块(非静态代码块),主要用于给所有对象共性特点进行初始化操作!
构造代码块特点:
1、 构造代码块只能定义在类里面,独立于任何方法,不能定义在方法里面。
2、 一个类中允许定义多个构造代码块,执行的顺序根据定义的顺序进行。
3、 构造代码块中的变量都是局部变量,既可以访问静态变量也可以访问实例变量。
4、 构造代码块随着对象的创建而加载,每创建对象一次就执行一次!
构造代码块作用:
可以将各个构造方法中公共的代码提取到构造代码块。
匿名内部类不能提供构造方法,此时初始化操作可以放到构造代码块中。
class BlockDemo {
String name;
static String sex;
{
// 可以访问静态变量也可以访问实例变量
name = "小明";
sex = "男";
}
}
代码块执行顺序
静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存。所以静态的会优先非静态的。