当前位置: 代码迷 >> 综合 >> 010-封装(老杜)
  详细解决方案

010-封装(老杜)

热度:80   发布时间:2024-01-29 10:43:00.0

目录

MethodTest.java

NullPointerTest.java

Person.java

PersonTest.java

PersonTest02.java

Student.java


MethodTest.java

//带有static的方法
//没有static的方法
//分别怎么调用?
//带有static的方法怎么调用?通过“类名.”的方式访问。

//对象被称为实例。
//实例相关的有:实例变量、实例方法。
//实例变量是对象变量。实例方法是对象方法。
//实例相关的都需要先new对象,通过“引用.”的方式去访问。
public class MethodTest{

    /*
public MethodTest(){

}
*/

    public static void main(String[] args){
MethodTest.doSome();
//类名. 可以省略(在同一个类中。)
doSome();
// 尝试使用“类名.”的方式访问“实例方法”
// 错误的
//MethodTest.doOther();

// 创建对象
MethodTest mt = new MethodTest();
// 通过"引用."的方式访问实例方法。
mt.doOther();

    }    

    // 带有static
public static void doSome(){
System.out.println("do some!");
}

    //这个方法没有static,这样的方法被称为:实例方法。(对象方法,对象级别的方法)
//这个没法解释,大家目前死记硬背。
public void doOther(){
System.out.println("do other....");
}
}

/*
运行结果:
do some!
do some!
do other....
*/

NullPointerTest.java

/*
空指针异常导致的最本质的原因是?
空引用访问“实例相关的数据”,会出现空指针异常。

    实例相关的包括:实例变量 + 实例方法。
*/
public class NullPointerTest{
public static void main(String[] args){
User u = new User();
System.out.println(u.id); // 0
u.doSome();

        // 引用变成空null
u = null;

        // id的访问,需要对象的存在。
//System.out.println(u.id); // 空指针异常

        // 一个实例方法的调用也必须有对象的存在。
//u.doSome(); // 空指针异常。
}
}


// 类 = 属性 + 方法
// 属性描述状态
// 方法描述行为动作
class User{

    // 实例变量
int id;

    // 实例方法(对象相关的方法,对象级别的方法,应该是一个对象级别的行为。)
// 方法模拟的是对象的行为动作。
public void doSome(){
System.out.println("do some!");
}

    // 考试的行为,由于每一个人考试之后的分数不一样,所以考试行为应该必须有对象的参与。
public void exam(){

}
}

/*
运行结果:
0
do some!
*/

Person.java

/*
Person表示人类:
每一个人都有年龄这样的属性。
年龄age,int类型。

我这里先不使用封装机制,分析程序存在什么缺点?
Person类的age属性对外暴露,可以在外部程序中随意访问,导致了不安全。

怎么解决这个问题?
封装。
*/

// 这是没有封装的Person。
/*
public class Person{

    // 实例变量(属性)
int age; //age属性是暴露的,在外部程序中可以随意访问。导致了不安全。

}
*/

// 尝试封装一下
// 不再对外暴露复杂的数据,封装起来
// 对外只提供简单的操作入口。
// 优点:第一数据安全了。第二调用者也方便了。
public class Person{
// private 表示私有的,被这个关键字修饰之后,该数据只能在本类中访问。
// 出了这个类,age属性就无法访问了。私有的。
private int age; // 每一个人年龄值不同,对象级别的属性。

    // 对外提供简单的访问入口(电视机的遥控器就相当于是电视机的访问入口,简单明了。)
// 外部程序只能通过调用以下的代码来完成访问
// 思考:你应该对外提供几个访问入口?
// 思考:这些操作入口是否应该是方法呢?
// 写一个方法专门来完成读。(get)
// 写一个方法专门来完成写。(set)
// get和set方法应该带有static,还是不应该有static,get和set方法应该定义为实例方法吗?
// get读年龄,set改年龄,这个读和改都是操作的一个对象的年龄。(没有对象何来年龄)
// 封装的第二步:对外提供公开的set方法和get方法作为操作入口。并且都不带static。都是实例方法。
/*
[修饰符列表] 返回值类型 方法名(形式参数列表){
}

        注意:
java开发规范中有要求,set方法和get方法要满足以下格式。
get方法的要求:
public 返回值类型 get+属性名首字母大写(无参){
return xxx;
}
set方法的要求:
public void set+属性名首字母大写(有1个参数){
xxx = 参数;
}

大家尽量按照java规范中要求的格式提供set和get方法。
如果不按照这个规范格式来,那么你的程序将不是一个通用的程序。

    */
// get方法
public int getAge(){
return age;
}

    // set方法
public void setAge(int nianLing){
// 能不能在这个位置上设置关卡!!!!
if(nianLing < 0 || nianLing > 150){
System.out.println("对不起,年龄值不合法,请重新赋值!");
return; //直接终止程序的执行。
}
//程序能够执行到这里,说明年龄一定是合法的。
age = nianLing;
}

}

PersonTest.java

// 在外部程序中访问Person这个类型中的数据。
public class PersonTest{
public static void main(String[] args){
// 创建Person对象
Person p1 = new Person();
// 访问人的年龄
// 访问一个对象的属性,通常包括两种操作,一种是读数据,一种是改数据。
// 读数据
System.out.println(p1.age); //读(get表示获取)

        // 修改数据(set表示修改/设置)
p1.age = 50;

//再次读取
System.out.println(p1.age);

        // 在PersonTest这个外部程序中目前是可以随意对age属性进行操作的。
// 一个人的年龄值不应该为负数。
// 程序中给年龄赋值了一个负数,按说是不符合业务要求的,但是程序目前还是让它通过了。
// 其实这就是一个程序的bug。
p1.age = -100; //改(随意在这里对Person内部的数据进行访问,导致了不安全。)
System.out.println("您的年龄值是:" + p1.age); //读
}
}

PersonTest02.java

public class PersonTest02{
public static void main(String[] args){
// 创建对象
Person p1 = new Person();

        // Person的age,彻底在外部不能访问了。但是这难免有点太安全了。
// age不能访问,这个程序就意义不大了。
/*
// 读age属性的值
System.out.println(p1.age);

        // 修改age属性的值
p1.age = 20;

        // 读age
System.out.println(p1.age);
*/

        // 通过“类名.”可以调用set和get方法吗?不行。
// 只有方法修饰符列表中有static的时候,才能使用“类名.”的方式访问
// 错误的。
//Person.getAge();

        //读调用getAge()方法
//int nianLing = p1.getAge();
//System.out.println(nianLing); //0
//以上代码联合
System.out.println(p1.getAge()); //0

        //改调用setAge()方法
p1.setAge(20);

        System.out.println(p1.getAge()); //20

        // 你折腾半天了,这不是结果还是没控制住吗??????
p1.setAge(-100);
//System.out.println(p1.getAge()); // -100
System.out.println(p1.getAge()); // 20

    }
}

/*
运行结果:
0
20
对不起,年龄值不合法,请重新赋值!
20
*/

Student.java

//构造方法、构造器、Constructor【构造函数】
// 只能用new来调用构造方法。
public class Student{

    String no;
String name;

    // 无参数的构造方法
public Student(){
}
public Student(String s){
no = s;
}
/*
public Student(String mingZi){
name = mingZi;
}
*/
public Student(String s1, String s2){
no = s1;
name = s2;
}
}

//构造方法两个作用:创建对象  给属性赋值。

class StudentTest{
public static void main(String[] args){
Student s = new Student();
Student s1 = new Student("100");
}
}

  相关解决方案