Java中类初级知识
1. 面向对象三大特点概览
面向对象三大特点:封装、继承、多态
-
封装是面向对象中的核心思想,它将对象的方法和属性抽象概括成一个类,给用户提供需要的实现功能的函数接口,不让其看到实现细节,此举还可保护类的内部数据完整性,具体实现与调用完全分离
-
继承的思想起源于类与类之间的关联性,这就引出不同类代码复用的想法,可以节省编码时间也可以减少系统在使用过程中出现错误的概率
-
多态理解起来较为抽象,需要辅以一定的实例来深刻了解,总体来说,这个多态指的是子类的多样性,但在编写子类代码是依照统一的风格编写程序,只不过多了一歩实例化子类的对象;多态的实现是依据抽象类的接口而非具体类,因为它子类的多样性
2. 类中基本成员
2.1类修饰符
访问包位置 | 类修饰符 | ||
---|---|---|---|
private | protected | public | |
本类 | 可见 | 可见 | 可见 |
同包其他类或子类 | 不可见 | 可见 | 可见 |
其他包的类或子类 | 不可见 | 不可见 | 可见 |
所谓可见不可见即为能否调用,接下来对上述表格解释说明之
-
对于本类来说,它具有至高无上的权利,三个关键字对于它不起作用,都可以调用以三个关键字修饰的定义类
-
我们知道一个Java项目的构成是由包(package)、
包中编写的类(class) 构成。所有对于同包的其他类或子类来说,public自然是可以访问这里需要记住保护类型的类是可以访问的就ok了,private是使用范围极小只有本类中的其他类才能调用 -
对于其他包的子类来说,它们就好像被流放的浪子,只有公开的public类才能调用
2.2成员变量、成员方法
下面给出一个Book实例,以介绍成员变量定义与用法
package java_learning;
public class Book {
private String name;
public Book getbook()
{
return this;
}
private void setname(String val)
{
this.name=val;
}
public String getname()
{
setname("Java");
return this.name;
}
}
通过这一个实例可以得到成员变量就是普通的变量,结构体、double、float之流,当然也可以是自定义数据类型也没毛病,当然成员变量也是由三个修饰符来限制其被调用范围的
成员方法的调用方式
权限修饰符 返回值类型 方法名(参数类型 参数名)
{
方法体
return 返回值类型;
}
很明显可以看到·这种成员方法的定义方式和普通的函数方法定义方式几乎一样,区别只在于成员方法定义时加上了一个权限修饰符
需要格外注意一点
关于类中的局部变量定义域:如果一个方法中含有与成员变量同名的局部变量,则该局部变量在此方法内有效,并屏蔽了与其同名的成员变量
注:类中的成员变量和成员方法统称为类成员
等等,似乎还有个小问题,既然类中的成员变量和类都有权限修饰符,那以谁为准呢?县官不如现管,当然是类的权限会约束类成员的权限了
2.3局部变量
局部变量在方法内部声明,并且只能在方法内部使用,在外层的方法被调用时被分配内存,请求在方法执行完毕后自动释放内存而消亡,在使用局部变量的时候必须先对其进行初初始化。它是在方法体中定义的变量以及方法的参数,只在定义它的方法内有效。成员变量如果没有人为初始化,系统将自动根据其所属类型进行初始化,基本数据类型变量量系统赋值0,引用型变量赋值NULL。局部变量在方法执行结束后就被销毁,与此不同,成员变量其实是一种全局变量
2.4 类中 this 关键字
this关键字只能在方法内部使用,与c++中类的定义类似,只不过c++中this是一个对象指针
this的四种用法
- 调用成员变量
使用this调用成员变量发生在方法内部,当成员变量(类下声明的变量)的名字与局部变量(方法内声明的变量)的名字相同时,使用this.变量名来表示该变量代表的是成员变量。
//声明成员变量
private String name;
//参数中的变量是方法中的局部变量
public void setName(String name){
//this.name表示的就是成员变量,name表示局部变量
this.name = name;
}
- 调用成员方法
使用this调用成员方法同样也发生在方法内部。通常情况下,我们在方法内部调用其他方法时,使用的方式是直接调用,即直接写方法名。其实,此时我们可以在要被调用的方法名前使用this关键字加“.”调用,这两种调用成员方法的方式是一样的,由于使用第二种方式没有多大的意义,所以一般情况下,我们选择直接调用的方式。
public class ThisTest{
public void method1(){
System.out.println("成员方法");
}
public void method2(){
//以下两种调用方法的方式效果一致
method1();
this.method1();
}
}
- 调用其他重载的构造器
使用this关键字调用其他重载的构造器是this关键字非常重要的用法之一,采用this调用其他构造方法需要将this语句写在构造器内的第一行,否则会报错。这种调用方式的优点在于一个构造器可以不必重复编写其他构造器中已有的代码,而是通过调用其他构造器实现代码复用,从而提供良好的类代码结构。
其实我个人目前是用不太到~
public class ThisTest{
//定义两个成员变量
private String name;
private int height;
//无参构造器
public ThisTest(){
//使用this调用参数为String类型的构造器
this("Ben");
}
//参数为String类型的构造器
public ThisTest(String name){
//使用this调用参数为String和int类型的构造器
this(name,165);
}
//参数为String和int类型的构造器
public ThisTest(String name, int height){
//为两个属性赋值
this.name = name;
this.height = height;
}
}
public class Test(){
public static void main(String[] args){
//创建对象
new ThisTest();
}
}
上述程序解释
创建对象时,构造器就会被调用,我们来看一下构造器的调用顺序:
首先,创建对象时没有传入参数,所以先调用无参构造器,进入无参构造器后,执行this(“Ben”),然后进入参数为String类型的有参构造器,此时将”Ben”传给name,执行(name,165)。
最后进入参数为String和int类型的构造器,执行该构造器内的语句,即最终的name为”Ben”,最终的height为165。这种使用参数最多的构造器来初始化成员变量的方式在开发中很常用。
- 表示当前对象
public class This2Test{
//定义一个属性
public String name;
//参数为String类型的构造器
public This2Test(String name){
this.name = name;
}
//定义一个参数为引用类型的方法
public void method3(This2Test tt){
//输出该对象的属性
System.out.println(tt.name);
}
public void method4(){
//调用方法并传入this
method3(this);
}
}
public class Test{
public static void main(String[] args){
//创建对象t
This2Test t = new This2Test("贝克");
//对象t调用方法
t.method4();
}
}
我们来分析一下运行程序是怎么运行的,传入的this代表的是什么呢?为什么输出的是贝克呢?
首先看程序的入口main方法,先创建对象t,创建对象时,进入Test2This类调用它的有参构造器,此时name为传入的”贝克”,也就是说当前创建的这个对象t的name为”贝克”。然后,用对象t去调用
method4()方法,该方法内部调用了method3()方法,并传入了this。因此,进入method3()方法,打印this的名字,这里的这个this代表的就是调用method4()方法的对象,即一开始的对象t。所以这里就体现了this的第四种用法(this表示当前对象)。在这里,可以简单理解为:this在method4()方法中被调用,因此this指的就是调用method4()这个方法的对象。