android基础-Java篇02:类和对象、构造方法、访问权限控制、重载、this关键字、static关键字

一、类和构造方法

    (类和对象在百度百科已经有详细的介绍,这里只做简单的描述以及帮助理解;百度百科:类和对象,需要注意的是,百度百科类和对象的举例中都是C++,书写格式不要和Java混淆!)

什么是类?什么是对象?    对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型。它们之间的关系是,对象是类的实例,类是对象的模板。

    举个例子:老师是对所有老师的总称,李老师是老师行业里的一个老师。那么老师就可以理解为是类,它是抽象的;而李老师就可以理解为是对象,他是老师这个类的一个实例。

 

a)     类        

public class Teacher{

    public string name;

    public int age;

    public static int num

    public void TeacherRank(){

        intgrade;

    }

}

一个类可以包含三种变量:1、局部变量 2、成员变量 3、类变量(静态变量)

1、局部变量:顾名思义,局部的变量,在方法或者语句块中被定义的变量,在方法结束后,变量就会自动销毁。如上代码中,TeacherRank方法中的grade变量。

2、成员变量:定义在类中、方法之外的变量,可以被类中的方法和语句块访问,在创建对象的时候实例化。如上代码的 nameage

3、类变量(静态变量):声明在类中、方法体之外,用static 修饰。如上代码中的 num

 

b)    构造方法:

      在类中,不得不提到构造方法,每个类都有构造方法,构造方法的名称必须与类同名,一个类可以有多个构造方法,然而在上文例程中并没有这个方法,并没有看到和类同名的构造方法,这是因为如果没有显式的定义构造方法的话,编译器将会为该类提供一个默认构造方法:public Teacher (){}

      其次,普通方法是用来定义对象具备的功能,只能被对象调用且可以多次调用;而构造函数是用于对象初始化,所以定义的是对象在建立时应该具备的内容,由Java虚拟机(JVM)调用,且只在创建对象时候调用。

那我们再修改上文代码,加入构造方法:

public class Teacher{

    public string name;

    public int age;

    public static int num

    public Teacher (){}

    public Teacher (String name , Int age){

       this.name= name;

       this.age= age;

    }

    public void TeacherRank(){

       intgrade;

    }

}

 

二、对象

对象是通过new className(类名)产生的,在创建一个对象的时候,至少要调用一个构造方法。

例如:Teacher MrLi = new Teacher();

或者Teacher MrLi = new Teacher(“LiLei”,23);

      可以看出创建对象有三步:声明、实例化、初始化。对应上面代码,声明Teacher的一个叫MrLi的对象,用关键字new来实例化,再使用构造方法来初始化对象。

 

三、访问权限控制

         为供类库开发人员向客户端程序员指明哪些是可用的、哪些是不可用的,Java提供了访问权限修饰符,按照权限大到小排序:publicprotected、无修饰词、private

       在说明访问权限控制之前,简单说明什么是包,包就是一组类在单一的名字空间之下被组织在一起,就像《Thinking in Java》一书中举的例子,在Java的标准发布中有一个工具库,被组织在java.util名字空间之下,里面有很多的工具类,那么java.util就是一个包。需要使用这些工具类的时候(拥有权限的情况下),需要使用import关键字将其导入或者直接在创建对象的时候指定包名,如import java.util.ArrayListjava.util.ArrayList list =new java.util.ArrayList()。

1. public:权限最大,允许所有类访问,但其他包下的类想要访问,使用import关键字将其导入。

2. Protected:不可以被其他包使用,可在本类、同包下以及继承类允许被访问。

3. 无修饰词:只可以在本类、同包下允许被访问。

4. private:只在本类中允许被访问。

 

四、重载(overload

        为了方便理解重载,举个现实交流的例子:你去了你朋友家,你朋友家非常大,你想上厕所,这时候你就会问“我想去方便一下,你方便告诉我厕所在哪吗”,句子中两个“方便”却有不同的意思。那么这两个“方便”就构成了重载。

        重载指的就是在一个类中,除参数以外,其他外部特征都一样的方法(方法名、返回值声明、修饰符)。

        最典型的例子就是上面提到的构造方法,public Teacher (){}public Teacher (String name , Intage){…}就构成了重载。

        当然,凡是方法都可以构成重载。我们修改上面例程如下:

public class Teacher{

    …

    public Teacher (){}

    public Teacher (String name , Int age){…}

    publicTeacherRank(){…}

    publicTeacherRank(Int rank){…}

}

        方法TeacherRank()和方法TeacherRank(Int rank)也构成重载。

 

五、this关键字

    在例程中,

public class Teacher{

    public string name;

    public int age;

    …

    public Teacher (String name , Int age){

       this.name = name;

       this.age = age;

    }

    …

}

 

        你会发现Teacher类中有nameage两个成员变量,而Teacher (String name , Int age)方法中,也有两个名字相同的局部变量,那么问题来了,在Teacher (String name , Int age)中,我们如何区分哪个是成员变量的nameage?哪个是局部变量的nameage呢?为此有一个专门的关键字:thisthis关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。

        那么答案非常明了了,在上面例程中,方法内this.namethis.age指的就是成员变量。因为类是通过对象来实现的,this表示当前对象,那么这里对象的nameage只能指的是那两个成员变量。

        既然this表示当前对象的引用,那么自然就可以用this来实现构造器中调用构造器来达到避免重复代码。需要注意的是,可以用this调用一个,但是不能调用用两个,而且this的调用必须写在第一行,例程修改如下:

public class Teacher{

    public string name;
    public int age;

     …   

    public TeacherRank(){…}

    public TeacherRank(String name){

        this.name = name;

    }

    public Teacher (String name , Int age){

        this(name);

        this.age =age;

    }

    …

}

 

六、static关键字

static(静态)可以修饰变量、方法以及代码块,被修饰的变量和方法分别可称为静态变量(类变量)和静态方法。

a)     静态变量(类变量)如:public static int num = 0

        静态变量会被所有对象共享,同时,局部变量不能被声明为static变量(这里需要说明的误区是,static修饰之后不会影响访问权限。而且Java没有全局变量一说)。

b)    静态方法如:public static voidnum(){…}

        静态方法不依附于任何对象就可以被访问,正是因为其不依附于任何对象,所以不能访问类非静态方法/变量(因为非静态的是必须依附在对象上),相反的,类非静态方法是可以访问静态方法/变量的。

c)     static修饰代码块

        修改之前的例程如下:

public class Teacher{

    …

    static{

        int youngage = 30;

        …

    }

    public void AgeGroup(){

       if(age < youngage){System.out.println(“年轻教师”);}

    }

}

可以看出直接用static修饰{代码块}即可,但是这么用有什么区别呢?

那对比一下代码:

public class Teacher{

    …

    public void AgeGroup(){

        int youngage = 30;

       if(age < youngage){System.out.println(“年轻教师”);}

    }

}

        方法的功能上没什么区别,但是在每次调用方法AgeGroup ()时,都要创建youngage并赋值,而声明为static之后,只要创建,就一直存放在内存中。

 

七、final关键字

final,不可改变的,为了更好的设计或效率,常常需要final来声明。

a) final数据private final int i = 0

final关键字修饰数据时,可以使数据恒定不变,如一个永不改变的编译时常量、一个运行时初始化之后就不会改变的值。

final定义常量:常量必须是基本数据类型,定义时必须对其进行赋值。

final修饰对象:对象引用初始化时指向一个对象之后,就无法再改变它,令它指向其他对象。

final修饰参数时候,参数同上一样,不能被修改,只能被读取。

空白final:这里需要了解一下空白final,空白final即使声明为final之后未给初始值的情况,在Java中是允许存在的,如:private final int i。但是final在使用前必须被初始化。

b) final方法private final void i(){ }

final修饰方法的时候主要出于一个作用:把方法锁定,避免任何继承类修改其含义。(无法覆盖)。当然要注意的是,在早期的Java中,可以使用final方法来提高效率,但是在方法内程序代码很多,方法很大时就看不到任何效果,在Java SE56的时候,应该让编译器和JVM去处理效率问题。

c) final

final 修饰类的时候作用和方法差不多,就是不可以被继承,不存在子类。当一个类被定义为final时,其类内的所有方法都默认为final,不管类中的方法是否定义了final

 

------------------------------------------------分割线----------------------------------------------------------

上文如有错误、写得不合理以及有疑惑的地方,希望您可以在评论区提出。

在下十分感谢。

如果只是想在评论区吐吐槽、聊聊心得、卖个萌,同样也十分欢迎。

祝大家生活美好,干杯!~( ゜▽゜)つロ

 

转载请注明原作者以及附上原文章地址,谢谢。

你可能感兴趣的:(android基础-Java篇02:类和对象、构造方法、访问权限控制、重载、this关键字、static关键字)