概述
上节嘟宝工程Git配置。这节开始讲解java基础,学习Java语法糖。Java 是由 Sun Microsystems 公司于1995年5月推出的 Java 面向对象程序设计语言。 Java 语言的语法与 C 语言和 C++ 语言很接近,但也丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如指针、操作符重载、多继承、强制类型转换。特别是Java 语言不使用指针,而是引用。并提供了内存回收机制,使得程序员不必为内存管理而担忧,但也带来java内存泄漏问题。java语言有以下特点:
- Java语言是面向对象
- Java语言是安全
- Java 语言是解释型
- Java 语言是动态的

Java语法糖
打开嘟宝工程,第四节讲解嘟宝工程详解,项目只有一个HelloWorldActivity页面,该页面在AndroidManifest当中被设置为启动页面,如下代码:
ini
<activity
android:name=".HelloWorldActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
我们将在HelloWorldActivity页面中学习java语法。
类的概念
在 Java 里,class 是最核心的概念之一。如果用一句话说清楚:class = 自定义类型 + 数据(属性)+ 行为(方法)。如定义类Fish,鱼有名字是属性,游泳是方法。 类是用来描述事物的,类的实例就是对象,对象即是数据。
- HelloWorldActivity 定义类Fish
- 创建属性name
- 创建方法swim
scala
package com.zilong.dubao;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
class Fish{
String name;
void swim(){
Log.d("test",name+"会游泳");
}
}
public class HelloWorldActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello_world);
Fish fish=new Fish();
ish.name="鲫鱼";
fish.swim();
}
}
其他HelloWorldActivity 继承AppCompatActivity,先不关心它是什么,app打开首先调用onCreate函数。会执行
ini
Fish fish=new Fish();
fish.name="鲫鱼";
fish.swim();
- name是成员变量,成员变量也有类型,
String name类型是字符串 - swim 是方法,是函数,他有函数体与返回值。返回值可以是void、String、int 成员变量与方法还可标记用private 、public、protected标记。
- default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
- private : 内部可用
- public : 外部、内部可用
- protected :外部不可用,继承子类可用。
csharp
class Fish{
public String name;
protected int price=0;
private float weight=0;
public void swim(){
add();
Log.d("test",name+"会游泳"+"价格"+price+"体重"+weight);
}
private void add(){
price++;
weight++;
}
}
name外部可用,price与weight内容函数可用。addPrice也只能内部可用。其中add函数当中,Log.d("test",name+"会游泳"+"价格"+price+"体重"+weight);,Log.d是andorid自带日志输出信息,它传递两个参数,一个是标签(用于过滤),一个是日志内容。运行andorid提示,查看日志输出:
test标签作用是过滤。
类中成员变量数据类型
如name的类型是String 字符串,price类型是 int
- int 数据类型是32位、有符号的以二进制补码表示的整数;范围是-2^31^到2^31^-1
- short 数据类型是16位、有符号的以二进制补码表示的整数;范围是-2^15^到2^15^-1
- long 数据类型是 64 位、有符号的以二进制补码表示的整数;;范围是-2^63^到2^63^-1
- byte 数据类型是8位、有符号的,最小值是-127,最大值127
- float 数据类型是单精度、32位、符合IEEE 754标准的浮点数
- double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
- boolean数据类型表示一位的信息
类的构造函数
构造函数,类的对象被定义时,如:Fish fish=new Fish();会被调用。构造函数可不写,他与类名同,可做成员变量数据初始化。
csharp
class Fish{
public String name;
protected int price;
private float weight;
Fish(){
name="未知鱼";
price=0;
weight=0;
}
public void swim(){
addPrice();
addPrice(10);
Log.d("test",name+"会游泳"+"价格"+price+"体重"+weight);
}
private void addPrice(){
price++;
weight++;
}
}
类的继承
如HelloWorldActivity继承自AppCompatActivity。Fish作为一个类,还可以淡水鱼、海洋鱼,这些都属于鱼,可以继承自Fish。
csharp
class Fish{
public String name;
protected int price=0;
private float weight=0;
public void swim(){
addPrice();
addPrice(10);
Log.d("test",name+"会游泳"+"价格"+price+"体重"+weight);
}
private void addPrice(){
price++;
weight++;
}
private void addPrice(int num){
price+=num;
weight+=num;
}
}
class OceanFish extends Fish{
int age;
}
OceanFish 拥有Fish类中除用private标记的所有属性与方法。
类的重载
重载,同一个类中可以有多个同名的方法,但参数不同。包含构造函数,如add函数
csharp
class Fish{
public String name;
protected int price=0;
private float weight=0;
public void swim(){
addPrice();
addPrice(10);
Log.d("test",name+"会游泳"+"价格"+price+"体重"+weight);
}
private void addPrice(){
price++;
weight++;
}
private void addPrice(int num){
price+=num;
weight+=num;
}
}
很容易理解,add函数,有两种状态。addPrice()与 addPrice(int num)
类的多态
重载与多态的区别,一个是类同一个类中可以有多个同名的方法,但参数不同。一个是父类与子类具有同名函数。
scala
package com.zilong.dubao;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
class Fish{
public String name;
protected int price;
private float weight;
Fish(){
name="未知鱼";
price=0;
weight=0;
}
public void swim(){
addPrice();
addPrice(10);
Log.d("test0","Fish类:"+name+"会游泳"+"价格"+price+"体重"+weight);
}
private void addPrice(){
price++;
weight++;
}
private void addPrice(int num){
price+=num;
weight+=num;
}
}
class OceanFish extends Fish{
@Override
public void swim() {
super.swim();
Log.d("test0","OceanFish类:"+name+"会游泳"+"价格"+price);
}
}
public class HelloWorldActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello_world);
OceanFish fish=new OceanFish();
fish.name="鲫鱼";
fish.swim();
}
}
OceanFish与Fish同有函数名称swim函数,被称为多态,在OceanFish 的swim函数中调用父类的swim,super.swim();如在我们的HelloWorldActivity当中,onCreate函数即是多态。 
类的接口
接口即是回调函数,程序设计时用的很多。简单理解,调用fish.swim()函数,函数执行完之后,需要告诉我一下。我在执行swim时,传递一个接口(回调函数),swim执行完,再调用这个接口。
typescript
package com.zilong.dubao;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
class Fish{
public String name;
protected int price=0;
private float weight=0;
public interface CB {
void onSwim();
}
Fish(){
name="未知鱼";
price=0;
weight=0;
}
public void swim(CB cb){
addPrice();
addPrice(10);
Log.d("test",name+"会游泳"+"价格"+price+"体重"+weight);
cb.onSwim();
}
private void addPrice(){
price++;
weight++;
}
private void addPrice(int num){
price+=num;
weight+=num;
}
}
public class HelloWorldActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello_world);
Fish fish=new Fish();
fish.name="鲫鱼";
fish.swim(new Fish.CB() {
@Override
public void onSwim() {
Log.d("test","Swim函数已经执行完成");
}
});
}
}
- Fish定义接口CB,swim函数需要传递CB变量。
- fish被定义,调用swim时,创建new CB变量传递给swim函数。
- swim执行完成,回调cb