这篇文章深入理解类和对象里面的语法结构
目录
Javabean
JavaBean是一种特殊的Java类,它遵循JavaBeans规范,通过封装数据和相关操作方法提供了一种可重用的组件。JavaBean可以被Applet、Servlet、JSP等Java应用程序调用,也可以被可视化地用于Java开发工具中。说了这么多可以都比较抽象!来一个比较接地气的解释
我们把JavaBean叫做实体类?什么是实体类?
实体类当然是一种类,里面可以有成员,可以有方法。实体类中成员必须private(封装起来),且要提供getter和setter,必须要有无参数构造器。
package javabean;
//什么是实体类?有啥特点?
//成员变量必须私有,且要为提供get和set,必须有无参数构造器
public class Student {
//1.私有成员变量
private String name;
private double chinese;
private double math;
public Student(){} //无参数构造器
public Student(String name,double chinese,double math){ //有参数构造器
if(chinese>=0 && chinese<=100){
this.chinese = chinese;
}else{
System.out.println("您输入的数据非法!");
}
this.name = name;
this.math = math;
}
//2.提供公开的getter和setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getChinese() {
return this.chinese;
}
public void setChinese(double chinese) {
if(chinese>0 && chinese<100){
this.chinese = chinese;
}else{
System.out.println("您输入的数据非法!");
}
}
public double getMath() {
return math;
}
public void setMath(double math) {
this.math = math;
}
}
这个类中全部private 成员 ,并且提供了set和get方法,还构造了无参数构造器。
实体类有啥应用场景吗?
有——数据和业务相分离
比如:
package javabean;
public class StudentService {
private Student s; //声明了一个学生类成员,因为类的成员类型可以是任何类型
public StudentService(){}
public StudentService(Student s){
this.s = s;//StudentService类对象的 Student类成员
}
//打印总成绩
public void printtotal(){
System.out.println(s.getName() + "的总成绩为:" + (s.getChinese() + s.getMath()));
}
//打印平均成绩
}
看责这个代码可能有点绕,Stuent类已经把数据声明完了,有name,chinese,math。StudentService类看英文就是为Student服务的,所以成员是个Studnt类,所以就要写个有参数构造器把Student类跟StudentService类扯上点关系,所以写个this.s = s,下面就是对Student类服务的方法。
注意:主要Student类对象里面的数据被赋值了,get方法就自动获取了
这个写出Student类和StudentService类就把数据和业务方法分离了。
Static
static修饰成员变量
public class Student { //属于类 static String name; //属于对象 int age; }
什么叫属于对象和属于类呢?
我们之前创建一个对象是Student s = new Student();
s.age = 10; //这个是属于所有对象的不管创建什么对象都可以.age
而static String name呢?是属于类的,
要用Student.name, 也可以使用对象.name(不推荐容易搞混不容易理解)
举个例子:
package stillness;
/*static关键字
成员变量按照有无static修饰,分为两种.目标:访问机制
1.静态变量:有static修饰,属于类,只加载一份,类名.静态变量
2.实例变量:没有static修饰,每个对象有一份
*/
public class Text {
public static void main(String[] args) {
//1.类名.静态变量
Student.name = "黄龄";
Student s1 = new Student();
s1.name = "郁可唯";
Student s2 = new Student();
s2.name = "那英";
System.out.println(Student.name);
}
}
可以猜下输出是什么,是黄龄吗?
结果是那英。为什么呢?
因为static修饰的是属于类的,只加载一份存放在堆里,虽然用类.name和对象.name都可以访问的,但是会搞混,所以不推荐大家使用对象.name。
静态对象的应用 只对类服务的成员 比如:系统启动后,要求类记住创建了多少个用户对象
package stillness;
public class User {
static int count = 0;
String name;
String gender;
public User(){
//注意:在同一个类中访问静态成员变量可以省略类名.
count++;
}
}
这样我每new一下对象count都会++。
static修饰方法
static修饰方法 1.静态方法:有static修饰的成员方法,属于类。类名.静态方法 2.实例方法:无static修饰的成员方法,属于对象。对象.方法 如果这个方法只是为了做个功能且不需要直接访问对象的数据,这个方法直接定义为静态方法
比如说Math.random()这个方法就是生成0到1的随机数,Math是类,random()是方法。random()方法只需要生成随机数,并不需要用到Math对象。所以random()这个方法就可以static修饰。
所以static修饰方法就可以用在全部是功能的类上——工具类
工具类的方法都是静态方法,每个类方法都是用来完成一个功能的。 提高了代码的复用性;调用方便,提高了开发效率;工具类把构造器私有化nb点(就不让创建对象),省内存
static的注意事项
1.静态方法中可以直接访问静态成员,不可以直接访问实例成员 2.实例方法中既可以直接访问静态成员,也可以直接访问实例成员 3.实例方法可以出现this关键字,静态方法不可以出现this关键字
解释1:
看到name变红没?变红就说明报错了,本来静态方法是用类名表示都不需要用到对象,这个在静态方法中用到了实例对象,这时候程序就有点懵了,所以静态方法不能直接访问实例变量
解释2:
这个都没有报错,本来静态变量都可以用对象.来访问,只是会影响理解,这种情况虽然可以存在,但是不推荐这样写。
解释3:实例方法可以出现this关键字,静态方法不可以出现this关键字
this是不是指代着这个类的对象啊,静态方法都没有对象访问,怎么可以使用this!