[Java]开发安卓,你得掌握的Java知识3——“类” 其之一
目录
1.本文主要内容简介
2.“类”的基础知识讲解
3.“类”的细节讲解
4.总结
0.前言
本文重点在于讲解Java中类的相关知识
如果想要了解一些基础知识的,可以去看前面的文章
《[Java]开发安卓,你得掌握的Java知识1》由于最终目的是要开发安卓app,
因此这里使用的IDE是AS(Android Studio)
(不会使用的可以参考下面这篇文章)
《[Java]开发安卓,你得掌握的Java知识2》
1.本文主要内容
-
Java中类的相关基础知识
-
对应知识的相关细节
2.“类”的基础知识讲解
在c语言中,对于复合型的数据类型,我们一般会使用struct
-
而在Java中,我们要定义一个复合型的数据,一般会用class,
就是下面所说的“类”
什么是“类”
- “类”就是描述具有相同属性的一类事物的一种概念,是抽象的,
“类”不是实际存在的东西,就像我们每个人都属于人类,
每个人都是"人类"这个抽象概念的的一个实例
但是“人类”这个概念并不是实际存在的,我们每个人是实际存在的
跟“类”有比较密切联系的概念,是“对象”
什么是“对象”
- 对象是具体的实际的存在,是某一类的实例化(即使类的实际例子)
在Java中,类用class表示,而对象则一般是通过new 语句得到的
如:
class Person{
public String name;
}
public static void main(String[] args){
Person p = new Person();
}
- 以上代码中,Person就是一种类,
p就是Person类的一个实例,是一个对象
什么是“属性”
- 属性就是同一类实例都拥有的共同的性质
同一类的不同实例都有相同的属性,但是每个属性的值不尽相同
什么是“方法”
方法就是同一类实例都拥有的函数
“在类中寻找(或是自定义)对应的方法以解决问题”
这是Java的基本思想
3.“类”的细节讲解
3.1类的基本定义
上文中提到,类中包含有各种属性和方法,因此,
- 我们在考虑将某一类事务抽象成“类”时,
需要考虑他们具有什么相同的属性,以及会做哪些事情
(将这些会做的事情变成方法)
具体语法:(此处以Person类为例子)
class Person{
String name;//每个人都有名字
int name;//每个人都有年龄
void sayHello(){
//每个人都会说你好
System.out.println("hello!");
}
}
3.2类的简单应用
要使用类的属性、方法,需要先实例化
即,先把一个抽象的概念,依靠一个实际的载体进行实例化
就像你必须找一个真正的人,才能帮你,
而不是说我要找“人类”这个概念来帮我的忙
public static void main(String[] args){
Person p = new Person();
p.name = "小王";
p.age = 20;
p.sayHello();
}
以上代码就是先将Person类实例化,得到一个Person类的对象p
然后通过这个p,
我们可以给这个对象赋值,且可以通过这个对象调用非静态方法
3.3类中的修饰符
一般类中常见的修饰符有:
public、protected、private、final
这些修饰符主要是规定了方法、变量的作用域以及使用权限
不同的修饰符有不同的作用
- public:外部、内部都可以调用
- protected: 内部可以调用,外部(同一个包内)可以调用
- private: 只能内部调用
- final: 它修饰的变量一旦赋值,就不能改变,也称为修饰的标识为常量。
当然,这些修饰符还跟“继承”有一定的关系,但是本文暂不赘述
3.4类的一些进阶知识
3.4.1静态方法
如果类中的方法使用了static进行修饰,那么该方法就是静态方法,可以通过类名.方法名()的格式调用
如:
class Person{
String name;//每个人都有名字
int name;//每个人都有年龄
static void sayHello(){
//每个人都会说你好
System.out.println("hello!");
}
}
public static void main(String[] args){
Person.sayHello();
}
一般数学相关类中,这种用法比较常见,主要就是可以避免创建一个对象却只用一两次方法,浪费空间
3.4.2匿名对象
通常情况下,我们对类进行实例化,都会有一个实际的对象(如上面Person类的对象p),但是在一些特殊情况下,可能不需要一个有>名字的实例,就可以使用匿名对象
void sayYes(Person person){
//这是一个以Person类为参数的函数
}
public static void main(String[] args){
sayYes(new Person());
}
上面这个带啊中,new语句使得分配了空间,但是由于没有名字, 故其实也只能用这一次,之后就没法再用了
- 匿名对象一般用于对象只用一两次的情况
3.4.3 this
在类中编写方法时,有时候需要用到该类成员变量
具体来说就是,如果实例化后:
- 对象在调用该方法时,需要用到该对象的属性的情况
此时一般会用this来指示该变量是自己的属性
如:
class Person{
public String name;
public int lastMoney;
public Poker poker;
public void initPerson() {
this.name = name;
this.poker = new Poker();
this.poker.number = -1;
this.poker.suit = -1;
this.lastMoney = 100;
}
- 这里为了新手方便,写的是initPerson(),
实际上这个intiPerson函数中的内容,一般由“构造函数”负责
3.4.4构造函数
上面的例子中,我们都没有在类里面写构造函数,
原因是在正常情况下默认会有一个不带参数的,空的构造函数
Person p = new Person();
后面的Person()就是一个不带参数的构造函数
- 有时候我们需要在使用new语句之后就马上为对象赋初值
(而不是系统默认的值),此时就要编写构造函数 - 注意:构造函数可以有参,也可以无参,可以是空的,也可以写很多东西,看具体情况
class Person{
public String name;
public int lastMoney;
public Poker poker;
public Person(String name){
this.name = name;
this.poker = new Poker();
this.poker.number = -1;
this.poker.suit = -1;
this.lastMoney = 100;
}
构造函数的名字需要和类名一致
注意:一旦定义了一个自己的构造函数,原来那个默认的无参的空构造函数,就会被当做不存在了(除非重新删光自己定义的)
自定义了构造函数之后,要在实例化时有所体现
可以有多个构造函数(但它们的参数种类、个数不能完全相同)
public static void main(String[] args){
Person p = new Person("小王"):
//此时Person p =new Person();就不能用了,除非再写一个无参数的构造函数
}
4.总结
(1)Java使用的是面向对象的思想,与C语言中,“遇到什么问题就马上去写一个函数解决”的思想不同,Java主张先考虑解决这个问题的方法是不是在某个类中已经实现,如果没有,再考虑自己定义。
(2)Java要多考虑将一系列相似的东西进行抽象,然后写成一个类,这个过程需要考虑这些相似的事物有哪些共同的属性、都能做哪些事情。
(3)真正着手编写Java应该就会感觉到,有了类之后,能更轻松地做到很多结构体难以做到的事情,类的思想让许多零散的部分连成一个整体,这让问题的解决变得更加简单。