概念了解
Java是一种面向对象的程序设计语言,了解面向对象的编程思想对于学习Java开发相当重要。
面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。
面向对象和面向过程的区别
提到面向对象,自然会想到面向过程,面向过程就是分析解决问题所需要的步骤,然后用函数把这些步骤一一实现,使用的时候一个一个依次调用就可以了。面向对象则是把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。当然,一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能,这样当应用程序功能发生变动时,只需要修改个别的对象就可以了,从而使代码更容易得到维护。
首先了解几个概念:
类
类是一个模板,它描述一类对象的行为和状态。
对象(实例)
对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
每个对象占用独立的内存空间,保存各自的属性数据。
每个对象可以独立控制,让它执行指定的方法代码。
举例说明:创建一个Soldier类
我们定义一个士兵类,他的属性有 id(表示他的唯一编号)、blood(表示他的血量)。他的行为有 go(前进)、attack(攻击)
Soldier类
public class Soldier {
//成员变量
int id;//唯一编号,默认0
int blood = 100;//血量,默认满血
//成员方法
public void go(TextView tv) {
if (blood == 0) {
tv.setText(id + "已阵亡,无法前进" + "\n" + tv.getText());
return;
}
tv.setText(id + "前进" + "\n" + tv.getText());
}
public void attack(TextView tv) {
if (blood == 0) {
tv.setText(id + "已阵亡,无法攻击" + "\n" + tv.getText());
return;
}
tv.setText(+id + "号士兵发起进攻" + "]\n" + tv.getText());
int b = new Random().nextInt(30);
if (blood < b) {
blood = b;
}
blood -= b;
if (blood == 0) {
tv.setText("["+id + "号士兵阵亡" + "\n" + tv.getText());
} else {
tv.setText("[士兵" + id + "进攻完毕,血量" + blood + "\n" + tv.getText());
}
}
}
xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="新建士兵" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="前进" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="进攻" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#222222"
android:textSize="15sp"/>
</LinearLayout>
MainActivity
public class MainActivity extends AppCompatActivity {
TextView textView;
Soldier s1;//默认null
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
}
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
f1();
break;
case R.id.button2:
f2();
break;
case R.id.button3:
f3();
break;
}
}
public void f1() {
s1 = new Soldier();
s1.id = 9527;
//用s1找到士兵对象内存空间
//访问它的属性变量id
textView.setText("士兵9527已创建" + "\n");
}
public void f2() {
s1.go(textView);
}
public void f3() {
s1.attack(textView);
}
}
运行程序:
举例说明:创建一个FlashLight类
我们来创建一个手电筒的类。它的属性有颜色、开光状态。它的方法有开灯、关灯
FlashLight.java
public class FlashLight {
//属性变量,成员变量
int color = Color.BLACK;
boolean on = false;
public void turnOn() {
on = true;
}
public void turnOff() {
on = false;
}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/black"
android:orientation="vertical">
<ToggleButton
android:id="@+id/toggleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doClick"
android:textOff="关"
android:textOn="开" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="红" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="白" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="蓝" />
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
FlashLight flashLight = new FlashLight();
LinearLayout linearLayout;
ToggleButton toggleButton;
Button red;
Button white;
Button blue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout = findViewById(R.id.layout);
toggleButton = findViewById(R.id.toggleButton);
red = findViewById(R.id.button1);
white = findViewById(R.id.button2);
blue = findViewById(R.id.button3);
}
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
f1();
break;
case R.id.button2:
f2();
break;
case R.id.button3:
f3();
break;
case R.id.toggleButton:
f4();
break;
}
}
public void f1() {
//用light变量找到手电筒对象的内存空间地址
//访问它的color变量
flashLight.color = Color.RED;
show();
}
public void f2() {
flashLight.color = Color.WHITE;
show();
}
public void f3() {
flashLight.color = Color.BLUE;
show();
}
public void f4() {
//判断开关指示按钮状态
if (toggleButton.isChecked()) {
flashLight.turnOn();
} else {
flashLight.turnOff();
}
show();
}
public void show() {
//根据flashlight属性控制界面
if (flashLight.on) {
linearLayout.setBackgroundColor(flashLight.color);
} else {
linearLayout.setBackgroundColor(Color.BLACK);
}
}
}
运行程序:
举例说明:创建一个Car类
我们来创建一个汽车类,它的属性有颜色color、品牌brand、速度speed。它的方法有前进、停止。
Car.java
public class Car {
public String color;
public String brand;
public int speed;
public void go(TextView tv) {
tv.append("\n" + color + brand + "汽车以时速" + speed + "前进");
}
public void stop(TextView tv) {
tv.append("\n" + color + brand + "汽车停止");
}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="创建汽车" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="go" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="stop" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="#222222" />
</LinearLayout>
MainActivity
public class MainActivity extends AppCompatActivity {
Car car;
Button create;
Button go;
Button stop;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
create = findViewById(R.id.button1);
go = findViewById(R.id.button2);
stop = findViewById(R.id.button3);
textView = findViewById(R.id.textView);
}
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
f1();
break;
case R.id.button2:
f2();
break;
case R.id.button3:
f3();
break;
}
}
private void f1() {
car = new Car();
//默认值如下
//color="";
//brand="";
//speed=0;
car.color = "红色";
car.brand = "BMW";
car.speed = 80;
textView.setText("汽车已创建");
}
private void f2() {
car.go(textView);
}
private void f3() {
car.stop(textView);
}
}
运行程序:
类中包含的变量
一个类可以包含以下类型变量:
1、局部变量
在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
局部变量有以下特点:
①必须手动初始化(分配内存空间),没有默认值
②局部变量作用域,到它定义的代码块为止
③作用域内不能重复定义
void f1(){
int a = 10;
if(){
int a = 9;//这样是不允许的,作用域范围内重复定义了
print(a);
}
}
void f1(){
int a = 10;
if(){
print(a);
int b = 100;
}//此时b的作用范围已结束,可以再定义一个b,不是同一个
int b = 1000;
}
2、成员变量
成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
成员变量有以下特点:
①定义在类中,自动初始化,有默认值
Int a;默认0
boolean b;默认false
int[] c;默认null
例如我们第一个例子 Soldier 类中,唯一编号 id,默认值就是 0。
②访问范围:类中都可以访问,根据访问范围设置,类外也可以访问
3、类变量
类变量也声明在类中,方法体之外,但必须声明为 static 类型。
关于关键字 static
后边的文章中会讲到
类中的方法
对类中方法不懂的可以查看:Java 方法