在Java中类可以看作是对象的载体,它定义了对象所有的功能
1.面向对象概述
对象可以划分为两个部分:1.静态部分:事物本身所具有的属性,如人的高矮胖瘦;2.动态部分:具有高矮胖瘦的人会去吃饭,散步这些行为。
类的概念:类是同一类事物的统称,他们具有相同的特性和行为。如人类、鸟类,类是里面具体生物的总纲。类是构造对象时所依赖的规范,或者说,类是世间事物的抽象称呼,而对象则是这 个事物相对应的实体。是一个总分的关系。
在Java中类是封装对象的属性和行为的载体,或者说具有相同属性和行为(即方法)的一类实体成为类。
类中对象的行为是以方法的形式定义的,对象的属性是以成员 变量的形式定义的,所以类包括对象的属性和方法。标记文本
在多态的机制 中,父类通常会被定义为抽象类在抽象类中给出一个方法的标准,而不给出实现的具体流程。
2.类
在Java中类对象的属性也称为成员变量。
public class Book{
private String name; //定义一个String型的成员变量
public String getName(){//定义了一个getName()方法
int id = 0; //局部变量
setName("Java"); //调用类中的其他方法
return id+this.name;
}
private void setName(String){//定义一个setName方法
thie.name=name;//将参数值赋予类中的成员变量
}
public Book getName(){
return this;//返回Book类的引用
}
}
用class关键字来定义类,Book是类 的名称,成员变量的类型可以设置为Java中 合法的数据类型,其实成员变量就是普通的变量,可以为它设置初始值,也可以不 设置初始值。如果不设置初始值,则会有默认值。
**this.name指的就是Book类中的name成员变量,而 this.name=name语句中的第二个name则指的是形参name。实质上setName()方法 实现的功能就是将形参name的值赋予成员变量name。
(2)成员方法
在Java语言中使用成员方法对应于类对象的行为。
语法:
权限修饰符 返回值类型 方法名(参数类型 参数名){
...//方法体
return 返回值;
}
Java中的成员方法无返回值,可以使用void关键字表示。
成员方法的返回值可以是计算结果,也可以是其他想要的数值和对象,返回值 类型要与方法返回的值类型一致。
在成员方法中可以调用其他成员方法和类成员变量,同时在成员方法中可以定 义一个变量,这个变量为局部变量。
类成员变量和成员方法也可以统称为类成员。
(3)权限修饰符
权限修饰符有:private、public和protected。
a.一个类的成员变量或成员方法被修饰为private,则该成员变量只能在本类中被使用,在子类中是不可见的,并且对其他包的类也是不可见的。
b.将类的成员变量和成员方法的访问权限设置为public,那么除了可以在本类使用这些数据之外,还可以在子类和其他包的类中使 用。
c.一个类的访问权限被设置为private,这个类将隐藏其内的所有数据,以免用户直接访问它.
d.如果需要使类中的数据被子类或其他包中的类使用,可以将这 个类设置为public访问权限。
e.一个类使用protected修饰符,那么只有本包内 的该类的子类或其他类可以访问此类中的成员变量和成员方法。
***当声明类时不使用public、protected和private修饰符设置类的权限,则这个类预设为包存取范围,即只有一个包中的类可以调用这个类的成员变量或成员方法.
(4)局部变量
在成员方法内定义一个变量,那么这个 变量被称为局部变量。
局部变量是在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误。
public String getName(){//定义一个getName()方法
int id=0; //局部变量
setName("Java");//调用类中其他方法
return id+this.name;设置方法返回值
}
局部变量的有效范围称为变量的作用域,局部变量的有效范围从该变量 的声明开始到该变量的结束为止。
this关键字
this引用的就是本类的一个对象。在局部变量或方法参数覆盖了成员变量时,就要添加this关键字明确引用的是类成员还是局部变量或方法参数。
3.类的构造方法标记文本
构造方法的特点如下:构造方法没有返回值;构造方法的名称要与本类的名称相同。
构造方法并不需要使用void关键字进行修饰
语法:
public book(){
… //构造方法体
}
在构造方法中可以为成员变量赋值,这样当实例化一个本类的对象时,相应的成员变量也将被初始化。如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认构造方法。
public class Anything{
public AnyThing(){//定义无参构造方法
this("this调用有参数构造方法");
}
public AnyThing(String name){//定义有参构造方法
System.out.println("有参构造方法");
}
}
在无参构造方法中可以使用this 键字调用有参的构造方法。但使用这种方式需要注意的是只可以在无参构造方法中 的第一句使用this调用有参构造方法。
(4)静态变量、常量和方法
由static 修饰的变量、常量和方法被称作静态变量、常量和方法
被声明为static的变量、常量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和“.”运算符调用静态成员。
public class StatiTest{
final static double PI =3.415;//在类中定义静态常量
static int id; //在类中定义静态变量
public static void method1(){//在类中定义静态方法
//do Something
}
public void method2(){
System.out.println(StaticTest.PI);//调用静态常量
System.out.println(StaticTest.id);//调用静态变量
System.Test.method1();//调用静态方法
}
}
静态数据与静态方法的作用通常是为了提供共享数据或方法
Java语言中对静态方法有两点规定:
a.在静态方法中不可以使用this关键字。
b. 在静态方法中不可以直接调用非静态方法
Java中规定不能将方法体内的局部变量声明为static的
(5)类的主方法
主方法语法:
主方法的定义中可以看到其具有以下特性:
a. 主方法是静态的,所以如要直接在主方法中调用其他方法,则该方法必须 也是静态的。
b.主方法没有返回值。
c.主方法的形参为数组。其中args[0]~args[n]分别代表程序的第一个参数 到第n个参数,可以使用args.length获取参数的个数。
public class TestMain{
public static void main(String[] args){//定义主方法
for(int i=0;i<args.legth;i++){//根据参数个数做出循环
Syste.out.println(args[i]);//循环打印内容
}
}
}
6.对象
(1)使用new操作字符来调用构造方法来创建对像。
语法:
Test teset=new Test(); Test test=new Test(“a”);
test对象被创建出来时,就是一个对象的引用,这个引用在内存中为对象分配了存储空间,,可以在构造方法中初始化成员变量,当创建对象时,自动调用构造方法.
每个对象都是相互独立的,在内存中占据独立的内存地址,并且每个对象都具有自己的生命周期,当一个对象的生命周期结束时,对象就变成垃圾,由Java虚拟机自带的垃圾回收机制处理,不能再被使用
public class CreatObject{
public CreateObject(){
System.out.println("创建对像");
}
public static void main(String[] args){
new CreateObject();//创建对像
}
}
结果:创建对像
创建对象的同时,将自动调用 构造方法中的代码
(2)访问对象的属性和行为
对象的属性和行为在类中是通过类成员变量和成员方法的形式来表示的,所以当对象获取类成员时,也相应地获取了对象的属性和行为
public class TransferProperty{
int i=47;
public void call(){
System.out.println("调用call()方法");
for(i=0;i<3;i++){
System.out.print(i+" ");
if(i==2){
System.out.print("\n");
}
}
}
public TransferProperty(){
}
public static void main(String[] args){
//创建一个对象
TransferProperty t1=new TransferProperty();
//创建一个对象
TransferPropery t2=new TransferProperty();
t2.i=60:
//私用第一个对象调用成员变量
System.out.println("第一个实例对象调用变量i的结果:"+t1.i++);
t1.call();//使用第一个对象调用类成员方法
//使用第二个对象调用类成员变量
System.out.println("第二个对象调用类成员变量i的结果:"+t2.i);
t2.call();//使用第二个对象调用类成员方法
}
}
两个对象的产生是相互独立 的,改变了t2的i值,不会影响到t1的i值。
public class TransferProperty{
static int i=47;
public void call(){
System.out.println("调用call()方法");
for(i=0;i<3;i++){
System.out.print(i+" ");
if(i==2){
System.out.print("\n");
}
}
}
public TransferProperty(){
}
public static void main(String[] args){
//创建一个对象
TransferProperty t1=new TransferProperty();
//创建一个对象
TransferPropery t2=new TransferProperty();
t2.i=60:
//私用第一个对象调用成员变量
System.out.println("第一个实例对象调用变量i的结果:"+t1.i++);
t1.call();//使用第一个对象调用类成员方法
//使用第二个对象调用类成员变量
System.out.println("第二个对象调用类成员变量i的结果:"+t2.i);
t2.call();//使用第二个对象调用类成员方法
}
}
由于使用t2.i=60语句改变了静态成员变量的值,使用对象t1调用成员变量的值也为60,这正是i值被定义为静态成员变量的效 果,即使使用两个对象对同一个静态成员变量进行操作,依然可以改变静态成员变量的值,因为在内存中两个对象同时指向同一块内存区域。t1.i++语句执行完毕 后,i值变为3。当再次调用call()方法时又被重新赋值为0,做循环打印操作。
== 关于静态变量见https://www.cnblogs.com/ustcanmin/p/11239257.html==
(3).对象的引用
语法如下:
Book book=new Book();
Book:类名。 book:对象。
new:创建对象操作符。
引用只是存放一个对象的内存地址,并非存放一个对象。
“==”运算符与equals()方法
public class Compare{
public static void main(String[] args){
String c1 =new String("abc");
String c2=new String("abc");
String c3=c1;
System.out.println("c2==c3的运算结果为:"+(c2==c3));
System.out.println("c2.equals(c33)的运算结果为:"+(c2.equals(c3)));
}
}
equals()方法是String类中的方法,它用于比较两个对象引用所指的内容是 否相等;
“==”运算符比较的是两个对象引用的地址是否相等.
对象的销毁
每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址 需要被回收。在其他语言中,需要用户手动回收废弃的对象。