🔭学习内容
- 掌握构造方法的定义格式、调用时机、构造方法的重载、构造方法的私有化意义
- 掌握匿名对象的概念及应用。
- 可以通过所学到的知识完成简单类的开发。
🔭1、构造方法
✂️定义:就是类构造对象时调用的方法,主要用来实例化对象。构造方法分为无参构造方法、有参构造方法。
✂️概念:构造方法是一种特殊的“成员方法”。
在面向对象程序中构造方法的主要作用是为类中的属性初始化。
✂️定义格式:
class 类名称{
访问权限 类名称(类型1 参数1,类型2 参数2,…){
程序语句;
… / /构造方法没有返回值
}
}
✂️构造方法的声明注意以下几点:
- ✒️构造方法的名称必须与类名称一致。
- ✒️构造方法的声明处不能有任何返回值类型的声明。
- ✒️不能在构造方法中使用return返回一个值。
class Demo{
public Demo(){} //无参构造方法
}
只要是类就必须存在构造方法,在Java中如果一个类中没有明确地声明一个构造方法,则在编译时会直接生成一个无参数的、什么都不做的构造方法
✂️关于构造方法的几点说明:
- ☘️构造方法的调用是在创建一个对象时使用new操作进行的
- ☘️如果不写构造方法,会默认添加一个无参的构造方法。如果写了一个有参的构造方法,就一定要写无参构造方法。一般情况下,我们自定义的类都要手动给出无参构造方法。接口不允许被实例化,所以接口中没有构造方法
- ☘️构造方法的访问权限一般为default(默认,什么都不写)、private、public3种。不能被static、final、abstract和native修饰
- ☘️构造方法可以被重载。构造方法在初始化对象时自动执行,一般不能显式地直接调用,当同一个类存在多个构造方法时,编译系统会按照参数个数以及参数类型来自动对应完成构造函数的调用
✂️关于构造方法的使用范例如下:
class Person{
private String name; //声明姓名属性
private int age; //声明年龄属性
public Person(){} //定义无参构造方法
public Person(String name){ //定义有一个参数的构造方法
this.setName(name);
}
public Person(String name,int age){ //定义两个参数的构造方法
this.setName(name);
this.setAge(age);
}
public void tell(){ //取得信息的方法
System.out.println("姓名:" + getName() +",年龄:"+ getAge()); // this 强调该方法是本类中的方法,可不写
}
public String getName(){
return name;
}
public void setName(String n){
name=n;
}
public int getAge{
return age;
}
public void setAge(int a){
if(a>0 && a<150){
age=a;
}
}
}
public class Demo{
public static void main(String[] args){
Person p=new Person("张三"); //创建并实例化对象
p.tell();
}
}
🔭2、匿名对象
✂️定义:匿名对象就是没有明确给出名字的对象。一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。
✂️匿名对象:
new Person(“张三”,30).tell();
此处没有任何栈内存引用它,所以此对象使用一次之后就等待被垃圾收集机制回收。
✂️匿名对象的作用:匿名对象基本上都是作为其他类实例化对象的参数传递的
🔭3、实例讲解一类设计分析
✂️下面来写一程序,以巩固之前所学知识:
-
(1)根据要求写出类所包含的属性。
-
(2)所有的属性都必须进行封装(private)。
-
(3)封装之后的属性通过setter和getter设置和取得。
-
(4)如果需要可以加入若干构造方法。
-
(5)再根据其他要求添加相应的方法。
-
(6)类中的所有方法都不要直接输出,而是交给被调用处输出。
题目:定义并测试一个名为Student的类,包括的属性有“学号"、“姓名"以及3门课程“数学”、“英语"和“计算机"的成绩,包括的方法有计算3门课程的“总分"、“平均分" 、“最高分”及“最低分”
✂️完整程序如下:
class Student {
private String stuno;
private String name;
private float math;
private float english;
private float computer;
public Student() {
}
public Student(String stuno, String name, float math, float english, float computer) {
this.setStuno(stuno);
this.setName(name);
this.setMath(math);
this.setEnglish(english);
this.setComputer(computer);
}
public void setStuno(String s) {
stuno = s;
}
public void setName(String n) {
name = n;
}
public void setMath(float m) {
math = m;
}
public void setEnglish(float e) {
english = e;
}
public void setComputer(float c) {
computer = c;
}
public String getStuno() {
return stuno;
}
public String getName() {
return name;
}
public float getMath() {
return math;
}
public float getEnglish() {
return english;
}
public float getComputer() {
return computer;
}
public float Sum() {
return math+english+computer;
}
public float Ave() {
return this.Sum()/3;
}
public float Max() {
float max=math;
max=max > computer ? max : computer ;
max=max > english ? max : english;
return max;
}
public float Min() {
float min = math;
min=min<computer ? min : computer;
min=min<english ? min : english;
return min;
}
}
public class Demo{
public static void main(String[] args){
Student stu=new Student("123","张三",89.0f,76.0f,80.0f);
System.out.println("学号:"+stu.getStuno());
System.out.println("姓名:"+stu.getName());
System.out.println("数学成绩:"+stu.getMath());
System.out.println("英语成绩:"+stu.getEnglish());
System.out.println("计算机成绩:"+stu.getComputer());
System.out.println("总分:"+stu.Sum());
System.out.println("平均分:"+stu.Ave());
System.out.println("最高分:"+stu.Max());
System.out.println("最低分:"+stu.Min());
}
}
✂️运行结果:
学号:123
姓名:张三
数学成绩:89.0
英语成绩:76.0
计算机成绩:80.0
总分:245.0
平均分:81.666664
最高分:89.0
最低分:76.0