一个类的组成:
成员变量:在类中方法外
成员方法:去掉static
构造方法:
也是方法:
1)方法名和类名相同
2)没有具体返回类型
3)连void也没有
构造方法的注意事项:
1)无参的构造方法,我们不给出,系统会默认提供
2)如果我们提供了有参构造方法(不管带几个参数),那么系统就不会再提供无参构造方法
3)构造方法是可以重载的
方法重载:overload
方法名相同(参数个数不同/参数类型不同)
如果给出了有参构造方法,而没有给出无参构造方法,再去无参构造对象的话就会报错(推荐永远给出无参构造)
4)构造方法的作用:
其实为了给类中属性进行赋值!(数据初始化)
给 成员变量赋值有几种方式?
两种方式:
1.通过setxxx(xxx)方法赋值
2.通过构造方法进行赋值
/*需求:
手机事物:
属性:品牌,价格,颜色,内存大小
行为:打电话,玩游戏...
使用java面向对象变成方式:定义一个手机类,写一个标准的类,在PhoneTest 中进行测试*/
public class Phone {
//定义属性
private String brand;
private int price;
private String color;
//定义set/get访问方法
public void setBrand(String brand) {
this.brand = brand;
}
public void setPrice(int price) {
this.price = price;
}
public void setColor(String color) {
this.color = color;
}
public String getBrand() {
return brand;
}
public int getPrice() {
return price;
}
public String getColor() {
return color;
}
//定义构造方法
//无参构造
public Phone() {
}
//定义有参构造
public Phone(String brand, int price, String color) {
this.brand = brand;
this.price = price;
this.color = color;
}
//定义成员方法
public void callPhone(){
System.out.println("手机可以打电话...");
}
public void playGame(){
System.out.println("手机可以玩游戏");
}
}
//定义测试类
public class PhoneTest {
public static void main(String[]args){
//利用无参构造对象,并调用set方法赋值
Phone s1=new Phone();
s1.setBrand("华为mate3");
s1.setPrice(4999);
s1.setColor("黑色");
System.out.println(s1.getBrand()+"---"+s1.getPrice()+
"----"+s1.getColor());
System.out.println("-----------------------------------------");
//利用有参构造对象赋值
Phone s2=new Phone ("小米5",3999,"宝石蓝");
System.out.println(s2.getBrand()+"---"+s2.getPrice()+
"----"+s2.getColor());
}
}
//定义一个学生类,属性是姓名,年龄,性别 行为是学习
public class Student {
//成员变量
private String name;
private int age;
private char sex;
//访问方法
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public char getSex() {
return sex;
}
//定义构造方法
//无参构造
public Student() {
}
//有参构造
public Student(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
//成员方法 学习
public void study(){
System.out.println("学习javaEE");
}
}
//定义一个学生的测试类,对两种赋值方法进行测试
public class StudentTest {
public static void main (String []args){
//利用无参构造创建对象,并用setxxx()方法赋值
Student s1= new Student();
s1.setName("张三");
s1.setAge(23);
s1.setSex('男');
System.out.println("姓名:"+s1.getName()+" 年龄:"+s1.getAge()+" 性别:"+s1.getSex());
s1.study();
System.out.println("--------------------------------------");
//利用 有参构造赋值
Student s2=new Student("李思",18,'女');
System.out.println("姓名:"+s2.getName()+" 年龄:"+s2.getAge()+" 性别:"+s2.getSex());
s2.study();
}
}
快捷键
alt +ins:选择setter and getter就会生成访问方法
alt+ins:选择constructor 全部选中就可以自动生成有参构造
选择selectNone 就会生成无参构造
关于一个类的成员
成员方法:
1)是否有返回值类型
2)是否携带形式参数
有返回值无参的
有返回值带参的
无返回值无参的
无返回值有参的
总结:
1.成员方法都是去掉了static(非静态的),编程中除非有明确要求,否则都是非静态的
2.有具体的返回值类型的成员方法,要用对应的返回值类型接收
成员变量的问题
访问问题:
1)当局部变量和成员变量名称不一致的情况,分别访问即可
2)当局部变量和成员变量名称一致的情况下,遵循就近原则:
先在局部位置找(方法定义中或者方法声明上),如果有直接访问它,如果没有,再去类中找(也就是局部变量的优先级高于成员变量)
面试题:
Student s=new Student();做了哪些事情?
第一步:先在栈内存中加载Student.class字节码文件
第二步:在栈内存中开辟内存空间Student s
第三步:在堆内存中申请堆内存空间
第四步:系统默认给Student类中的成员变量进行初始化(默认初始化)
第五步:显示初始化
构造方法对数据进行初始化-----或者通过setxxx(xxxx)来赋值
第六步:给堆内存中产生了一个空间地址值
第七步:将空间地址值赋值给变量s
第八步:栈内存变量s指向堆内存地址!
出现的问题:什么时候将变量定义为成员变量?
如果当前一些变量能够描述事物的属性的时候,就将属性---设置为成员变量
在实际开发中多使用局部变量!(占用内存少)
static关键字
存在,共享共用的意思
静态修饰符static特点:
1)被静态修饰符修饰的变量/方法-------静态变量/静态方法(也叫类变量或者类方法,随着类的加载而加载)
随着静态的加载而加载
2)被静态修饰符修饰的变量或方法优于对象而存在(也就是说对象还没有创建,在加载类的时候就已经将其加载好 了并且静态的变量或方法都是存储在方法区中的静态区的,是一个独立的空间,不在堆内存中)
static和this是不能共存的
加载类---xxx.class---------先执行的
类名 对象名=new 类名();----创建对象是后执行的
3)被静态修饰;有共享,共用的意思
如果一个属性要被几个对象都使用的话,就将其设为静态
4)被静态修饰的变量/方法,可以被类名直接访问!(推荐),也可以使用对象名来访问,只是没必要(不推荐)
实际开发中,并不是为了使用方便,就将某个方法定义为静态,一般情况:定义为静态的功能,那么当前类----一定是一个工具类
静态的注意事项:
1)定义静态的变量-------成员位置-----成员变量---加入static(不能修饰局部变量,只能修饰成员变量)
2)非静态的成员(变量或方法)既能访问非静态的成员(变量或方法)也能访问静态成员(变量或者方法)
静态的成员(变量或者方法)只能访问静态的成员(变量或方法)------------>静态只能访问静态,非静态两种都能访问
静态变量和成员变量(非静态)的区别:
0)写法格式不同:
静态变量:static修饰 数据类型 变量名;
成员变量:数据类型 变量名
1)内存中位置不一样:
静态成员变量:方法区中----静态区域中
成员变量:堆内存中
2)生命周期不同:
静态成员变量:随着类的加载而加载,类就加载一次,static变量加载一次,随着类的加载完毕,不会立即消失
成员变量,随着对象的创建而存在,不会立即消失,等待垃圾回收器的回收!
3)初始化时机不同
静态成员变量:类加载的时候可以直接初始化!
成员变量:对象创建完毕,才进行初始化!