登录后台

页面导航

本文编写于 2416 天前,最后修改于 1668 天前,其中某些信息可能已经过时。

请注意,本节变量名,类名和方法名中包含中文,因为 Java 支持 Unicode 6.2.0 字符集,所以这些包括中文的代码确实可以运行。但是我本人强烈建议不要使用中文,我这里使用中文是因为这一讲挺难理解,不想让大家在变量名的理解上浪费脑细胞。

类,对象和方法

昨天我们学了类的概念,先来复习一下格式:

[修饰符] class 类名 {
    零到多个构造器定义
    零到多个成员变量
    零到多个方法
}//[] 代表可省略

今天我们来过一遍代码,先观察下面的 “青年人” 类:

class 青年人 {
    //定义一些成员变量用于描述类的属性
    String 姓名;
    String 性别;
    int 年龄;
    String 爱好;
    
    //定义一些方法来让类完成一些任务
    void 干活 (String 活的名字){
        System.out.println("我刚刚" + 活的名字 + "了");
    }
    
    int 问年龄(){
        return 年龄;
    }
    
}

我们定义了一个青年人类,里面定义了一些成员变量用来描述青年人(类)的一些属性,然后定义了两个方法:分别是干活和问年龄。现在我们有了一个人类,现在我们就把这个人实例化为一个女孩纸作为对象。

//使用 “青年人” 类定义一个 “青年人” 类型的变量,类比 int a;
//用过 new 关键字调用 “青年人” 类的构造器,返回一个 “青年人” 对象
//记住,类通过 new 变成对象才可以使用
//将 “青年人” 实例赋给 “女孩子” 变量
青年人 女孩子 = new 青年人();
//在类中是成员变量,实例化成对象之后就是实例变量了
//通过 对象.变量名 可以获取类的实例变量
//访问 “女孩子” 的 “姓名” 并赋值 小张
女孩子.姓名 = "小张";
//访问 “女孩子” 的 “性别” 并赋值 女,依此类推
女孩子.性别 = 女;
女孩子.年龄 = 18;
女孩子.爱好 = 编程;
String 自述 = "我叫" + 女孩子.名字 + ",今年" + 女孩子.年龄 + "岁了,爱好" + 女孩子.爱好;
System.out.println(自述);
//现在让我们 new 出来的对象做些什么
//通过 对象.方法名 可以调用对象的方法
女孩子.干活("做饭");   //输出:我刚刚做饭了
//获取方法的返回值
int 女孩子的年龄 = 女孩子.问年龄();
System.out.println(女孩子的年龄);

构造器和访问控制修饰符

我们刚刚定义的 “青年人” 类有个问题,性别应该在对象被实例化的时候就决定的,不应该随意修改。我们通过构造器来把类实例化为对象,于是我们需要定义一个构造器来解决。另一个问题是对象的属性不应该被随意访问,就像别人想要知道你的想法一定要去问你,而不是直接读取你的记忆。这里就要用到访问控制修饰符来控制哪些属性可以被外界修改,哪些属性不可以被外部直接修改。然后创建一些列的方法作为接口来控制对象。

其中常见的访问控制符有 public 和 private 。你暂时可以这么理解,被 public 修饰的,在类内可以调用,在类外也可以调用。但是被 private 修饰的只能在类内部调用,不可以在类外面调用。

我们继续完善 “青年人类”

public class 青年人 {
    //定义一些成员变量用于描述类的属性
    //定义被 private 修饰,无法在类外部通过 对象名.变量名 的形式访问
    private String 姓名;
    private String 性别;
    private int 年龄;
    private String 爱好;
    private boolean 感情好;
    
    //定义一个构造器,用于在实例化对象时就设置一些属性。
    //构造器不可以声明返回值为 void
    //构造器名必须和类名一样
    public class 青年人 (String 姓名, String 性别, int 年龄, String 爱好){
        this.姓名 = 姓名;   //在类变量(成员变量)和方法变量重复冲突时,
        this.性别 = 性别;   //在类中通过 this.变量名 来指定时类变量,
        this.年龄 = 年龄;   //不加 this 的就是方法变量。
        this.爱好 = 爱好;    //这四行代码其实就是把初始化时传入的参数赋值给全局变量
    }
    
    //定义一些方法来让类完成一些任务
    public void 干活 (String 活的名字){
        System.out.println("我刚刚" + 活的名字 + "了");
    }
    
    public void 谈恋爱(){
        感情好 = true;
    }
    
    //定义一些接口,一组接口通常包括 getxxx 和 setxxx ,分别用于获取变量和设置变量
    public int get年龄(){  //if 后的代码只有一行时大括号可省略
        if (感情好 == true) return 年龄;   //一个方法在 return 之后就会结束。 
        return 0;
    }
    
    public void set年龄(int 年龄){
        this.年龄 = 年龄;
    }
    
}

下面我们来调用一下全新的 “青年类”

青年人 妹子 = new 青年人("小张", "女", 18, "编程"); //实例化对象,由于我们定义的构造器有参数,
                                                  //所以我们 new 对象的时候也需要传参。
//体验一下接口的好处,使用接口可以阻止你不需要的访问
System.out.println(妹子.get年龄);   //输出为 0 ,而且现在也无法直接调用 妹子.年龄 ,会抛出编译异常
妹子.谈恋爱(); //和妹子培养感情
System.out.println(妹子.get年龄);   //输出为 18 , 可见现在我们通过接口实现了访问控制

总结

这节课的代码和概念我猜你没懂,没懂就没懂吧,大体有个印象就好。实不相瞒,我当初看了 10 篇这节的文章都没理解。但是也得强迫自己去模仿,模仿的多了,自己就理解了。这节课的代码不用上机练习,但是我求你翻上去再看一遍。其实我也没教你咋上机练习,因为下节课就要正式开发 Android 小程序了,基础储备能让我继续讲了,到时候上机的机会多的是。另外我承认最近几篇确实短,主要原因是这些节都是概念性的东西,讲多了就蒙了,而且没有什么图,就显得很短。最最最主要的是我最近身体确实不太舒服,望大家理解。面向对象绝对是 Java 的重难点,没一次性理解也不要怪自己,没事,大家都一样,不要给自己太大压力。

预习

我们先来认识一下 Android 中的常见系统 UI view。打开 Android Studio ,没有 Android Studio 的看我的截图就好了。先随意打开一个布局,(有人反映全屏的gif看不清,那我就只截取重点了)

然后切换到 design 标签,随便看看啦

比较常用的我归纳一下:

控件作用
Button按钮
ImageButton用一张图片作为按钮
TextView用来显示一段文本
WebView用来显示网页
ImageView用来显示图片

再见

好了,今天真的到这里了,明天讲控件,视篇幅,如果篇幅允许的话明天可能会实践做一个简单的套壳浏览器,当然,篇幅不允许的话就得大下次课,也就是周一讲了。我周末休息 #(手动偷笑)。拜拜

2020/5/24 注:
这是我 2018 年高中毕业的假期写的,当时并没有自己搭建博客,近期我给这一系列的文章都放到我自己的博客上。
当时写这个系列文章的想法就是扎实下基础,然后能帮到更多的人就更好了,但是大学开学之后就开始了新生活,没有大块的时间去编撰,系列文章也没有再更新过。但是我其实并不想放弃这个系列,那就,有缘再见吧,拜拜ヾ(•ω•`)o