1.面向对象的第一大特征:封装性
- 当我创建了对象以后,我如果直接通过“对象名.属性名”的方式去对属性赋值的话,可能会出现一些不符合
- 实际情况的问题,所以我们不考虑使用“对象名.属性名”的方式赋值,而是通过“对象名.方法名”的方式进行赋值,
- 因为我们可以在方法里面加大量的业务逻辑对属性值进行限制
解决方式:
- 使用封装
*1.将属性私有化
*2.提供公用的(getting setting)方法实现调用和赋值
比如:(一个学生类)
年龄age如果只写成int 类型,那在用对象名.属性名的方法赋值的时候写-1也是可以的,但是与现实情况不符,所以采用封装。将属性私有化,提供公用的get set方法调用和赋值(读写)。
//学生类
public class Student {
int stuNo;//学号
String stuName;//姓名
//private:修饰符权限:用private修饰符的属性和方法只能在类的内部访问,出了此类就不能调用了
private int age;//年龄
//个人描述
public void desc(){
System.out.println("我的学号"+stuNo+",我的姓名是:"+stuName+",我今年:"+age+"岁");
}
//赋值
public void setAge(int age1){
if(age1>0 && age1<=150){
age=age1;
}else {
System.out.println("请输入合法年龄!!!");
}
}
//取值
public int getAge(){
return age;
}
测试一下:
public class TestStudent {
public static void main(String[] args) {
//创建学生对象
Student stu=new Student();
//给属性赋值
stu.stuNo=1001;
stu.stuName="刘能";
//调用setAge方法对年龄赋值
stu.setAge(19);
System.out.println(stu.getAge());
stu.desc();
}
}
如果setAge里19换成-1就会提示请输入合法年龄。
遇到问题:学生类中有太多的属性及对应的set方法,在初始化时容易忘记,有没有可能简化对象的初始化代码?
2.构造方法
在我们使用类的时候会使用一个特殊的方法叫构造方法,也叫构造器
(1)作用
:构造方法就是专门创建对象的方法,当我们在new的时候其实调用就是构造方法。
(2)如果创建构造方法呢?
public 构造方法名(参数){ }
注意:
- 1.构造方法不能写返回值
- 2.构造方法名必须和你当前的类名一模一样,大小写都得一样
- 构造方法是一个方法,那么他可以进行方法重载吗?
- 可以
(3)构造方法的作用
- 1.定义无参构造方法,可以new对象
- 2.定义有参构造方法,可以在new对象的同时给属性赋值
注意:
- 如果类中没有定义构造方法,系统会自动给我提供一个无参的构造方法,
- 如果类中自己定义了有参构造方法,它会把系统提供的无参构造方法覆盖掉,需要手动再提供一个无参构造方法。
例如:
(一个学校类,两个属性,校名,地址)
private String name;//校名
private String address;//地址
创建一个 构造方法
//构造方法
public School(){
System.out.println("构造方法执行了");
}
可以重载
//重载的构造方法
public School(String name1){
System.out.println("一个参数的构造方法执行了");
name=name1;
}
两种赋值方法:
① 使用get-set方法赋值(只能赋值单个值)
//第一种使用set方法给属性赋值,只能赋值单个值
public void setName(String name1){
name=name1;
}
public String getName(){
return name;
}
public void setAddress(String address1){
address=address1;
}
public String getAddress(){
return address;
}
②使用构造方法赋值
//第二种使用构造方法给属性赋值
public School(String n,String a){
name=n;
address=a;
}
测试一下:
public class TestSchool {
public static void main(String[] args) {
School sc1=new School("枣庄学院"); //很明显这是有参的那个构造方法(重载的)的赋值。所以输出:一个参数的构造方法执行了。
System.out.println(sc1.getName()); //输出了学校名字“枣庄学院”
System.out.println("=======使用set方法给属性赋值=========");
//创建school对象
School sc=new School();//new 后面的这个方法就是构造方法(无参数,赋值取值使用get-set,且一次只能赋值一个)
sc.setName("国际希望小学");
sc.setAddress("山东");
System.out.println("校名:"+sc.getName()+",地址:"+sc.getAddress());
System.out.println("============使用构造方法给属性赋值=================");
//new对象的同时给属性赋值,省去了set方法的麻烦,针对多个属性同时赋值的场合
School sc2 = new School("北京XX","北京海淀区"); //针对多个属性同时赋值的场合
//如果单个变量值需要改变用set方法
sc2.setAddress("山东济宁");
System.out.println("校名:"+sc2.getName()+",地址:"+sc2.getAddress());
}
}
3.this关键字
当局部变量和成员变量重名时,方法中会根据“就近原则”使用局部变量的值。
如果想要区分的话我们可以使用this关键字。
(1)格式
this.成员变量名
this可以理解为当前使用的对象或者正在创建的对象,通过哪个对象调用的方法谁就是this。
(2)this作用:
- 1.可以修饰属性、方法、构造方法
- 2.this可以理解为当前使用的对象或者正在创建的对象,通过那个对象调用的方法谁就是this
- 3.可以在构造方法中通过“this(形参)”的方式调用本类中其他重载的构造方法
- 注意:在构造方法内部必须写在首行
举个例子:
一个人,属性有自己的名字,和年龄。
public class Person {
private String name;//自己的名字
private int age;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
} //这是有参的get-set方法。可以使用快捷键,不用自己敲。
//创建打招呼 方法
public void sayHello(String name){//对方的名字
System.out.println(this.name+"对"+name+"说:你好啊!");
//当前对象的吃饭方法 (方法调用方法)
this.eat();
}
public void eat(){
System.out.println("吃饭了");
}
//-------------------------------------------------------------------------
//如果类中自己定义了有参构造方法,它会把系统提供的无参构造方法覆盖掉,需要手动再提供一个无参构造方法。
public Person() {
System.out.println("Person无参构造方法");
}
public Person(String name) {
this.name = name;
System.out.println("Person带name参数的构造方法");
}
public Person(int age) {
this.age = age;
System.out.println("Person带age参数的构造方法");
}
public Person(String name,int age){
// this(name) ;3.可以在构造方法中通过“this(形参)”的方式调用本类中其他重载的构造方法
// * 注意:在构造方法内部必须写在首行
this(age);
this.name=name;
// this.age =age;
System.out.println("Person带name,age参数的构造方法");
}
}
测试一下:
public class TestPerson {
public static void main(String[] args) {
//创建对象
Person p=new Person();
p.setName("赵四");//设置自己的名字
p.sayHello("刘能");//设置对方的名字
Person p1=new Person("张三",12);
System.out.println("姓名:"+p1.getName()+",年龄"+p1.getAge());
}
}
输出结果: