JavaBean的特点:
private 成员属性
public 成员方法
有get/set方法对成员变量进行赋值/取值
有空构造方法
符合这些条件的称为标准的JavaBean。
构造方法(也叫构造器)
定义的位置是在类中,成员方法外,和成员变量、成员方法是平级关系。
特点是:与类同名,没有返回值。
语法格式如下:
[修饰符]构造方法名(形参列表){
零到多条可执行语句组成构成方法的执行体
}
例如:
class Student{
public Student(){
System.out.println("这是一个学生类的空参构造方法");
}
}
构造方法能重载。
构造方法定义时注意事项:
1.构造方法必须和类同名
2.构造方法没有返回值,也不能使用void,一旦加了返回值或者void,
那么这个方法就是一个成员方法,而不是构造方法了。
默认的构造方法
当定义一个类的时候,如果没有显式的定义任何构造方法,这时,
系统会给这个类加上一个默认的无参构造方法,并且构造方法里没有任何语句。
class Demo{
//public Demo(){}
//如果没有定义任何构造方法的话,系统自动加上一个空参构造方法
public void show(){
System.out.println("hello world");
}
}
一旦有自定义构造方法,系统就不会加上任何构造方法了
class Demo{
public Demo(int id){
System.out.println("这是有一个参数的构造方法");
}
}
构造方法的使用
实际上,在程序中使用new关键字创建一个类的实例化对象的时候,就是去调用该类的相应的构造方法,此时应注意,根据构造方法的形参列表的不同来调用不同的构造方法,调用不存在的构造方法肯定编译报错
class TestDemo{
//Demo d = new Demo(); //error,没有这样的构造方法
Demo d = new Demo(10); //调用的是自定义的,有一个参数的构造方法
}
标准JavaBean练习
定义一个员工类,自己分析出几个成员,然后给出成员变量,构造方法,getXxx()/setXxx()方法,以及一个显示所有成员信息的方法。并测试。
class Employee{
private String employeeId;
private String name;
private int age;
public String getEmployeedId(){
return employeeId;
}
public void setEmployeeId(String employeeId){
this.employeeId = employeeId;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public void show(){
System.out.println("员工编号是:"+employeeId+"的这个人是:"+name+"的年龄是:"+age);
}
}
class EmployeeTest{
public static void main(String[] args){
Employee e = new Employee();
e.setEmployeeId("9527");
e.setName("唐伯虎");
e.setAge(18);
e.show();
}
}
自定义类练习:
定义一个算数类MyMath,提供基本的加减乘除功能,然后进行测试。
根据面向对象编程思想,应该把方法操作的数据封装成成员变量,然后再使用方法进行操作,但十分麻烦,在一些简单的应用中,可以不用封装成成员变量,直接定义方法,使用时把操作数当成实参进行传参即可。
import java.util.Scanner;
class MyMath{
public int add(int a,int b){
return a+b;
}
public int sub(int a,int b){
return a-b;
}
public int mul(int a,int b){
return a*b;
}
public int div(int a,int b){
return a/b;
}
}
class MyMathTest{
public static void main(String[] args){
Scanner sc =new Scanner(System.in);
System.out.println("请输入第一个操作数: ");
int firstNumber = sc.nextInt();
System.out.println("请输入第二个操作数: ");
int secondNumber = sc.nextInt();
MyMath mm = new MyMath();
System.out.println("加法的结果是: "+mm.add(firstNumber,secondNumber));
System.out.println("减法的结果是: "+mm.sub(firstNumber,secondNumber));
System.out.println("乘法的结果是: "+mm.mul(firstNumber,secondNumber));
System.out.println("除法的结果是: "+mm.div(firstNumber,secondNumber));
}
}
this关键字
this关键字用来指向当前对象,根据this关键字出现的位置不同,this作为对象的引用有两种情况:
在构造方法种引用该构造方法正在初始化的对象
在方法中引用正在调用该方法的对象
this关键字使用情景:
让类中的一个方法去访问类中的另一个实例方法或变量;
在构造方法中,对成员变量进行初始化。
static关键字
static的真正作用就是用于区分成员变量,方法,内部类,初始化块这四种成员是属于类本身还是属于这个类的实例。
类变量/类方法:凡是有static修饰的成员变量/成员方法;
实例变量/实例方法:没有static修饰的成员变量/成员方法。
static修饰类的成员变量和变量方法(类变量,类方法)
只要类存在,程序中就可以访问到类变量,类变量访问的语法:
类名.类变量 Student.name
只要实例存在,程序中就可以访问到该实例的实例变量,访问实例变量的语法
实例名.实例变量 s.id
类变量也可以通过该类的实例来访问,通过实例访问类变量的语法
实例名.类变量 Student.name/s.name
static关键字的特点
被static关键字修饰的部分,有如下特点
- 随着类的加载而加载
- 优先于对象存在(因为类的加载优先于对象的创建)
- 被类的所有实例对象共享(存在于方法区中的静态区,如果是一个类变量的话,任何一个对象对该变量进行修改,都会在其他对象中得到体现),这也是我们在定义一个类时,判断是否使用静态关键字的标准
- 可以通过类名访问(类名.静态变量名/类名.静态方法名),也可以使用对象名来访问,推荐使用类名调用,因为静态变量/方法是属于类的
什么时候使用static关键字?使用static关键字的标准
当一个变量或者方法属于一个类,而不属于这个类的实例对象时,就可以使用static来修饰,
这样就可以使用类名.成员(变量/方法)的方式访问这个static变量/方法。
所有这个类的实例对象都能看到对静态变量(类变量)的更改。
static方法重点注意事项
静态方法(类方法)中不能使用this关键字,this关键字代表的是当前对象的引用,
但是static关键字修饰的方法是属于这个类的,随着类的加载而存在,但当类进行加载时,
此时实例对象还没被创建出来,这时是无法使用this关键字的。
静态方法只能访问静态变量和静态成员方法。
|
所属 |
内存位置 |
出现时间 |
调用 |
静态变量 |
类 |
方法区的静态区 |
随类加载而加载 |
类名调用,对象名调用 |
实例变量 |
对象 |
堆内存 |
随对象创建而存在 |
对象名调用 |
|
声明位置 |
内存位置 |
生命周期 |
初始值 |
局部变量 |
方法内,形参上 |
栈内存 |
随方法调用而存在 |
必须先定义,赋值再使用 |
实例变量 |
类内,方法外 |
堆内存 |
随对象创建而存在 |
有默认初始值 |
main方法是静态的
public static void main(String[] args) {}
public 被jvm调用,访问权限足够大。
static 被jvm调用,不用创建对象,直接类名访问
void被jvm调用,不需要给jvm返回值
main 一个通用的名称,虽然不是关键字,但是被jvm识别
String[] args 以前用于接收键盘录入的
如何使用API文档
点击显示,找到索引,看到输入框
以Scanner举例
在输入框里面输入Scanner,然后回车
看包
java.lang包下的类不需要导入,其他的全部需要导入。
要导入:
import java.util.Scanner;
再简单的看看类的解释和说明
看类的结构
成员变量 字段摘要
构造方法 构造方法摘要
成员方法 方法摘要
学习构造方法
A:有构造方法 就创建对象
B:没有构造方法 成员可能都是静态的,这样的类也不需要构造方法,直接用类名就行
看成员方法
A:左边
是否静态:如果静态,可以通过类名调用
返回值类型:人家返回什么,你就用什么接收。
B:右边
看方法名:方法名称不要写错
参数列表:人家要什么,你就给什么;人家要几个,你就给几个
代码块
代码块
在Java中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块
局部代码块
在方法中出现,直接用{}括起来的部分,就是局部代码块
作用:限定变量生命周期,及早释放,提高内存利用率
构造代码块(也叫初始化块)
在类中,方法外出现;多个构造方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行,若多个构造代码块,则他们之间是顺序执行
作用:抽取构造方法中相同的部分,提高利用率
构造代码块和构造方法的关系:
构造代码块可以看成是构造方法的补充,构造代码块是一段固定的代码,它不接受任何参数,正是基于这个特点,如果多个构造方法中有一些代码完全相同,并且不需要接受任何参数的话,就可以把它们提取到构造代码块中。
将构造方法中相同的代码段提取到构造代码块的过程
静态代码块
在类中,方法外出现,加了static修饰的{},或者可以理解成,加了static修饰的构造代码块
作用:给类进行初始化(类变量的初始化),在加载的时候就执行,并且只执行一次
小结:代码块的作用
1.静态代码块是对类进行初始化的(主要是对类变量/静态变量进行初始化)
2.构造代码块和构造方法主要是对实例对象进行初始化的
3.局部代码块是用来规定变量的作用范围,提高内存使用效率,节省空间的
非静态方法可以访问的是:
1.静态/非静态成员变量
2.静态/非静态成员方法
总结,简单记:
静态只能访问静态,非静态两种都能访问
对象初始化过程包含两个方面:
构造代码块的执行 + 构造方法的执行
构造代码块:抽取构造方法中共同的语句,在构造方法执行前执行
静态代码块:在类加载时执行一次,用于对类(成员变量)进行初始化