DUFQ_2020.12.07-杜飞强-构造方法
构造方法
定义
如果类内的方法名称与类名相同,并且没有返回值类型,也不写void,那么这个方法就叫做构造方法,或构造函数。
构造方法分为默认构造方法和自定义构造方法。
作用
构造方法的作用是在创建对象时,为对象的成员变量初始化
定义语法格式
[访问修饰符] 方法名 ([参数列表]){
方法体;
}
eg:
public class Person {
public int age;
public String name;
//定义一个构造函数
public Person(){
this.name = "宋江"; //初始化
this.age = 22; //初始化
}
}
PS:1.构造方法没有返回值
2.默认构造方法没有参数
3.构造方法的方法名必须与类名相同
构造方法的调用规则
1.实例化对象时,必须调用类的构造方法,即只要new对象,就一定会调用构造方法。
2.如果类中没有显示定义的构造方法,那么JVM会为类自动定义无参数的构造方法,如果类中显示定义了任意一个构造方法,那么,JVM就不会为类定义默认构造方法。
3.构造方法是在实例化对象时自动调用的,或者在本类的其他构造方法中通过this关键字调用。
eg:
4.构造方法不允许使用对象直接调用。
5.构造方法调用时根据参数匹配原则调用相应的构造方法。
this关键字
this关键字是对一个对象的默认引用。每一个实例方法内部都有一个this引用变量,指向调用这个方法的对象。
PS:(1)this是java的关键字,表示当前正在运行的对象。
(2)this指代当前对象的引用。
this的三种调用
(1)使用this调用成员变量,解决成员变量与局部变量的同名冲突
public class Person {
public String name;
public void setName(String name){
//成员变量与局部变量同名,this.naem表示成员变量,name表示局部变量
this.name = name;
}
}
public class Person{
public String name;
public void setName(String str){
//成员变量与局部变量不同名,this可以省略
name = str;
}
(2)使用this调用成员方法
public class Person(){
public void eat(){
}
public void work(){
this.eat();this调用成员方法,可以省略this
}
}
(3)使用this调用重载的构造方法,只能在构造方法中使用,且必须是构造方法的第一条语句
public class Person{
public String name;
public int age;
public Person(String name){
this.name = name;
}
public Person(String name,int age){
this(name);//调用重载的构造方法,必须放在第一条语句
this.age = age;
}
}
构造方法重载
public class Test {
public String name;
public int age;
public String gender;
//第一种构造方法重载:定义无参数构造方法
public Test(){
this.name = "宋江";
}
//第二种构造方法重载:定义带参数构造方法
public Test(String name){
this.name = name;
}
//第一种work()方法重载,无参的work()方法
public void work(){
System.out.println(this.name+"的工作理念:工作让生活更美好!");
}
//第二种work()方法重载,带参数的work()方法
public void work(String contect){
System.out.println(this.name+","+this.gender+","+this.age+"岁的工作理念:"+contect);
}
public static void main(String[] args) {
Test t = new Test("宋江");//调用Test带有参数的构造方法
System.out.println("大家好,欢迎"+t.name+"的到来");
Scanner sc = new Scanner(System.in);
System.out.println("请选择性别:(1、男,2、女)");
switch(sc.nextInt()){
case 1:
t.gender = "男";//为t对象的性别属性赋值
break;
case 2:
t.gender = "女";//为t对象的性别属性赋值
default:
System.out.println("输入错误");
return;
}
System.out.println("请输入年龄:");
t.age = sc.nextInt();
t.work();//调用无参的work()方法
System.out.print("请重新输入您的工作理念:");
String contect = sc.next();
t.work(contect);//调用带参数的work()方法
}
}
构造方法间的调用
调用本类的构造方法使用this(),调用父类的构造方法使用super(),但必须写在构造方法内的第一行代码,否则不能编译。
public Score(int lishi) {
this.lishi = lishi;
}
public Score() {
this(5);
}
public Score(int a,int b) {
super();
}
调用错误示例
封装
封装的含义
封装是面向对象的三大特征之一,封装的实质就是将类的状态信息(成员变量)隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息(成员变量)的操作和访问。
数据保护方式
1.不允许读,不允许写
2.允许读,不允许写
3.不允许读,允许写
4.允许读,允许写
方法被调用的情况
1.类内的其他方法是否可以调用
2.同包中的其他类是否可以调用
3.子类是否可以调用
4.任务类是否可以调用
封装的实现
封装是通过访问修饰符来实现的,共有4个,分别是:
public修饰符 可以修饰属性、方法、类
默认修饰符 可以修饰方法属性、类
protected修饰符 可以修饰方法、属性、类
private修饰符 可以修饰属性、方法,类
private访问修饰符
可以修饰属性、方法,但不可以修饰类。
eg:修饰了属性和方法
public class Person {
private String name;
private int age;
private String gender;
private void show();
private的使用规则:private修饰的属性或方法只允许在类内被访问。private是最严格的封装。
public修饰符
public表示共有、公共的意思,由public访问修饰符修饰的属性或方法或类可以在任何地方被调用。public是最开放的封装。
默认访问修饰符
默认是指类、属性、方法定义时不写任何访问修饰符,此时就是默认。
由默认访问修饰符修饰的类、属性、方法可以被同包的其他类访问。
protected修饰符
由protected修饰符修饰的属性、方法和类可以被子类和同包中其他的类访问,但不能在位于其他包中的非子类中访问。
类和类成员的访问控制
(1)类的访问修饰符
java这种类的访问修饰符只有两个,分别是public和默认修饰符
作用域/修饰符 | 同一包中 | 不同包中 |
---|---|---|
public | 可以使用 | 可以使用 |
默认修饰符 | 可以使用 | 不可以使用 |
(2)类成员的访问修饰符
位置 | public | protected | 默认修饰符 | private |
---|---|---|---|---|
同类访问 | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
同包其他类访问 | 可以访问 | 可以访问 | 可以访问 | 不可以访问 |
同包子类访问 | 可以访问 | 可以访问 | 可以访问 | 不可以访问 |
不同包子类访问 | 可以访问 | 可以访问 | 不可以访问 | 不可以访问 |
不同包非子类访问 | 可以访问 | 不可以访问 | 不可以访问 | 不可以访问 |
PS:访问修饰符不能用于方法中声明的变量或形式参数,因为方法中声明的变量或形式参数的作用域仅限于该方法,在方法外是不可见的,在其他类无法访问。
封装最常用的方法:共有方法封装私有属性
需求:在教务系统中,学生对成绩只能查询,不能修改。
分析:成绩在成绩类中使用private封装,此时成绩类外不能访问成绩属性。为成绩属性提供一个共有的方法,这个共有的方法返回成绩的值。此时成绩类外可以通过共有的方法获得私有的成绩。这种封装称为共有方法封装私有属性。
代码:
public String getGender() {
return gender;
}
public void setGender(String gender) {//public封装方法
this.gender = gender;
if ("男".equals(gender) || "女".equals(gender)){
this.gender = gender;//public方法中返回private属性
}else{
System.out.println("性别不合法");
}
}
//定义构造方法
public Person(String naem,int age,String gender){
this.name = name;
this.gender = gender;
this.age = age;
}
如果只提供get方法,不提供set方法,表示只读不写
如果只提供set方法,不提供get方法,表示只写不读
如果提供了get方法和set方法,表示可读写
如果get方法和set方法都不提供,表示不可读写
PS:如果一个类中有多个属性,可以使用开发工具IDE一键生成属性的get方法和set方法。
近期评论