1.对象和类(Object and class):
一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。
面对对象编程是java非常重要的一部分,作者本身之前学过c++所以省略了部分基础,详见例子:https://www.runoob.com/java/java-object-classes.html
对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
类:类是一个模板,它描述一类对象的行为和状态。
a.类的内容:
方法:比如说Dog可以有void barking(),void sleeping()这些行为。
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。比如说我们要定义狗的年龄,就从外部引入一个age_dog的变量赋值给成员变量。没有默认值,必须自己赋值。
成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。比如狗dog可以有age,color这种特征变量。有默认值,如果没有会系统自动分配,根据类型不同则默认值不同。
类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
注:在一个类中,局部变量可以与成员变量同名,但是局部变量优先,如果非要访问成员变量的属性,则必须使用 this.color
b.对象的操作:
声明对象一般用关键字new来创建一个新的对象。
例如:
Puppy myPuppy = new Puppy( "tommy" );
其中Puppy是类的名字,my puppy是对象的名字,tommy则是狗这个对象的名字。
假设我们有一个方法是“setAge”,我们可以调用其来设定狗的年纪(成员变量age = 2):
myPuppy.setAge( 2 );
然后调用:
dog_age = myPuppy.getAge( );
把成员变量赋值给主函数里的dog_age.
2.Java包(package):
包主要用来对类和接口进行分类。当开发Java程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。
使用import去定位某个类,下面的例子命令行将会命令编译器载入java_installation/java/io路径下的所有类:
import java.io.*;
具体编程的例子见:https://www.runoob.com/java/java-object-classes.html
和c++不一样的就是c++除了cpp还得有个h头文件,java直接引用java文件就行。
几个注意事项:
1.java因强制要求类名(唯一的public类)和文件名统一,因此在引用其它类时无需显式声明。在编译时,编译器会根据类名去寻找同名文件。
2.package 的作用就是 c++ 的 namespace 的作用,防止名字相同的类产生冲突。Java 编译器在编译时,直接根据 package 指定的信息直接将生成的 class 文件生成到对应目录下。如 package aaa.bbb.ccc 编译器就将该 .java 文件下的各个类生到 ./aaa/bbb/ccc/ 这个目录。
3.import 是为了简化使用 package 之后的实例化的代码。假设 ./aaa/bbb/ccc/ 下的 A 类,假如没有 import,实例化A类为:new aaa.bbb.ccc.A(),使用 import aaa.bbb.ccc.A 后,就可以直接使用 new A() 了,也就是编译器匹配并扩展了 aaa.bbb.ccc. 这串字符串。
4.JAVA 和 C++ 一样,若是不定义任何的构造函数,会自动构造;如果定义了任何一个构造函数,就不会再自动构造,需要自己定义全部的构造函数。
3.this 和 super区别:
a.this:
this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
sub 1.普通的直接引用:
就是指对目前所处的对象的引用。
sub 2.形参与成员名字重名,用 this 来区分:
比如说:
public int GetAge(int age){
this.age = age;
return this.age;
}
}
sub 3.引用构造函数:
见super里面的解释。
b.super:
super 可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
sub 1.普通引用:
与 this 类似,super 相当于是指向当前对象的父类,这样就可以用 super.xxx 来引用父类的成员。
sub 2. 子类中的成员变量或方法与父类中的成员变量或方法同名:
class City extends Country { //这个是指Country是city的一个子类
。。。
。。。
super.value(); //value(是子类的一个方法)
。。。
}
sub 3. 引用构造函数:
super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
注意事项:
1.super是引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
2.this它代表当前对象名(在程序中易产生二义性之处,应使用 this 来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用 this 来指明成员变量名)
3.调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用 super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
4.super() 和 this() 均需放在构造方法内第一行。
5.this 和 super 不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有 super 语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
6.this() 和 super() 都指的是对象,所以,均不可以在 static 环境中使用。包括:static 变量,static 方法,static 语句块。
7.从本质上讲,this 是一个指向本对象的指针, 然而 super 是一个 Java 关键字。