1、类的说明
(1)一个.java文件,可以有若干的class,在编译时产生多个不同的.class文件。 但是只能有一个 public class,
(2)文件名必须与public类的类名一致。
(3)类中,变量表示属性,方法表示行为,类方法用static表示
2、类的权限
所以类一般都定义成 default ,public
3、举个例子
public class Student {
public String name = null;
public int age = 0;
Student(String name){
this.name = name;
}
public String getName() {
return name;
}
public static void main(String[] args) {
String name = "小白";
Student student = new Student(name);
System.out.println(student.getName());
}
}
(1)栈区创建了一个变量name,指向了堆区的字符串“小白”
(2)在栈区创建了一个变量student,指向了堆区新创建student对像
(3)name赋给了类中的变量name后,栈中的name是临时变量,被回收
4、this是指向类对像本身的引用,相当于python的self,
(1)局部变量和成员变量重名,用this区分。
public class Student {
public String name = null;
Student(String name){
this.name = name; //这里做区分
}
public static void main(String[] args) {
String name = "小白";
Student student = new Student(name);
System.out.println(student.name);
}
}
(2)当某个成员方法,需要返回对象自身时,使用this。
public class Student {
public int age = 0;
public Student add(){
age = age+1;
return this;
}
public static void main(String[] args) {
Student student = new Student();
student.add().add().add();
System.out.println(student.age);
}
}
(3)调用构造函数
//我们现在创建一个学生类,并且重载几个构造函数
public class Student {
public String name;
public int id;
public int age;
Student(String name) {
this.name = name;
}
Student(String name, int id) {
this.name = name;
this.id = id;
}
Student(String name, int id, int age) {
this.name = name;
this.id = id;
this.age = age;
}
}
我们发现,其实三个构造函数有重复,都是比上个一构造函数多了一个变量而以,那可以改成这样
public class Student { public String name; public int id; public int age; Student(String name) { this.name = name; } Student(String name, int id) { this(name); this.id = id; } Student(String name, int id, int age) { this(name,id); this.age = age; } }
5、static
static关键字的使用
(1)staitc 声明的类变量为类的静态变量
类第一次加载时被加载到方法区
对于类的全部实例,静态变量为共有且只有一份
只能通过对象访问
成员方法和静态方法都可以访问
*值修改问题:对象或类名改变静态变量后,全部收到影响
(2)staitc 声明的类方法为类的静态方法
类第一次加载时被加载到方法区
对于类的全部实例,静态变量为共有且只有一份
通过对象和类名都可以访问
静态方法中只能访问静态变量
(3)静态代码块
在类加载阶段执行,并且只执行一次,是自上而下的顺序依次执行
(4)实例代码块 、
每调用一次构造方法,则实例代码块就会执行一次。
实例代码块在构造方法调用之前执行。
实例代码块也是自上而下的顺序执行。
public class Student {
public static int age = 0;
public void add(){
age = age+1;
}
public static void main(String[] args) {
Student student = new Student();
student.add();
System.out.println(Student.age);
}
}
6、构造方法
定义:就是类构造对象时调用的方法,主要用来实例化对象。构造方法分为无参构造方法、有参构造方法。
1、构造方法与类名同名2、构造方法不能有任何修饰符
3、如果成员变量与构造方法的变量,名一样,记得用this
this.name = name
4、类缺省有一个不带参数的构造函数,如果定了一个带参数的构造函数,则缺省的构造函数不生效,如果想生效,必须将缺省构造函数定义出来
Student(){} Student(String name){ this.name = name; }
7、方法重载
方法重载:方法名相同,参数类表不同
参数列表:个数不同,数据类型不同,顺序不同
注:方法重载与修饰符和返回值类型无关, 与参数的名称无关,只与参数列表的个数,类型,顺序相关
public class Test{
1 public static void open(){} // 正确重载
2 public static void open(int a){} // 正确重载
3 static void open(int a,int b){} // 代码错误:和第6行冲突
4 public static void open(double a,int b){} // 正确重载
5 public static void open(int a,double b){} // 代码错误:和第6行冲突
6 public void open(int i,double d){} // 代码错误:和第7行冲突
7 public static void OPEN(){} // 代码正确不会报错,但是并不是有效重载
8 public static void open(int i,int j){} // 代码错误:和第3行冲突}
8、类的执行顺序
静态代码块的执行顺序:静态代码块----->非静态代码块(实例代码块)-------->构造函数
9、类的定义顺序;
类{
静态代码块
实例代码块
成员变量
静态变量
构造方法
成员方法
静态方法
}
class Student {
private int id;
private String address;
public String name;
public int age;
public int getId(){ //成员方法,给类外部留接口,获取private的值
return id;
}
public void setId(int id){ 成员方法,给类外部留接口,设置private的值
this.id =id;
}
Student(String name,int age) { //构造函数
this.name = name;
this.age = age;
}
Student(String name, int age, int id) { //构造函数重载
this(name,age);
this.id = id;
}
Student(String name, int age, int id,String address) { //构造函数重载
this(name,age,id);
this.address = address;
}
static {
System.out.println("我是静态代码块"); //静态方法
}
}
输出结果:
我第一个被执行,且执行一次
旺才
2