请注意,本节变量名,类名和方法名中包含中文,因为 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