java编程第三次记录
面向对象的概述
面向对象是把构成问题的事物按照一定的规则划分为多个独立的对象。然后通过调用对象的方法来解决问题,面向对象的特点可以概括为封装,继承,多态
1.封装
封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体的实现细节,这是封装思想。
2,继承
继承主要描述的就是类与类之间的关系,通过继承,可以在无须重新编写原有类的情况下,对原有类的功能进行扩展。
3,多态
多态指的是在一个类中定义得属性和功能被其他类继承后,当把子对象直接 赋给父类引用类型的变量时,相同引用类型的变量调用同一个方法所呈现的多种不同行为特性
java中的类与对象
类与对象的关系
类是某一类实物的抽象描述,对象用于表示现实中该类事物得个体
类的定义
在面向对象的思想种,最核心的就是对象。为了在程序中创建对象,首先需要定义一个类,类是对象的抽象,他用于描述一组对象的共同的特征和行为。
类的定义格式:【修饰符】class 类名 【extends 父类名】【implements 接口名】{
//类体,包括类的成员变量和成员方法
}
修饰符可以是public,也可以不写(默认),类名首字母要大写
声明(定义)成员变量
类的成员变量也可以成为类的属性,他主要用于描述对象的特征,例如,一个人的姓名,年龄在类中就需要把他们声明(定义)为成员变量
【修饰符】数据类型 变量名 【=值】;
例如 private String name; peivate int age=20;
声明(定义)成员方法
成员方法也成为方法,主要用于描述对象的行为。定义方法的格式如下
【修饰符】【返回值类型】方法名 (【参数类型 参数名1,参数类型 参数名2,……】{
//方法体
.
return 返回值;//当返回值为void是,return可以省略
}
修饰符:方法的修饰符比较多,有对访问权限进行限定的(如public private ),有静态修饰符static,有最终修饰符final
参数类型:用于限定调用方法时传入的数据,如果不需要传递参数,则参数列表为空
参数名:是一个变量,用于接受调用方法时传入的数据
return;被return语句返回的值,该值会返回给调用者;
package Example;
public class Person {
int age;
void speak() {
System.out.println("我今年"+age+"岁了");
}
}
在java中,定义在类中的叫成员变量,定义在方法中的叫局部变量,如果方法中定义得局部变量和成员变量同名,是可以的,此时方法中通过变量名访问到的就是局部变量。而非成员变量
public class Person(){
int age=10;
void speak(){
int age=30;
System.out.println("我今年"+age+“岁了”);
}
}
对象的创建和使用
使用new关键字来创建对象,语法格式如下
类名 对象名称=new类名();
例如创建Person的实例对象
Person p=new Person();
上面代码中,“new person()”用于创建Person类的一个实例对象,Person p 则是声明了一个Person类型的变量,中间等于号用于将Person对象的内存地址赋给变量p,这样变量p就持有了对象的使用
在创建Person的对象是,程序会占用两块内存区域,分别为栈内存和堆内存,其中Person类型的变量p会被存放在栈内存中,他是一个引用,会指向真正的对象,通过new Person()创建的对象则放在堆内存中,这才是真正的对象
在java中,内存分为栈内存和堆内存,栈内存用于存放基本类型的变量和对象的引用变量,堆内存用于存放由new创建的对象和数组
在创建Person对象后,可以通过对象的引用来访问对象的所有的成员,格式如下
对象的引用.对象成员
在上述代码中,p1和p2的值不同,说明P1和p2是完全不同的两个个体,p1被赋值,p2没有被赋值,但是p2的值为0,说明p2被系统指定默认初始值
当实例对象被引用变量引用,当实例对象没有被任何对象引用时,会被当成垃圾对象,不能再被使用,接下来通过一段代码解释对象如何变成垃圾的
{
Person p=new Person();
}
上边一段代码吗中,new Person创建一个Person类的一个实例对象,Person p则是声明一个Person类型的变量,p引用了一个Person类型的对象,这段代码运行结束,p因为超出作用域会被销毁,这时Person类型的变量相当于没有被任何变量所引用而成为垃圾,
{
Person p=new Person();
p=null;
}
这里p被赋予null,说明不在当Person类实例对象的引用,Person类的对象会被当成垃圾对象
访问控制符
成员属性和方法提供了4种访问级别,控制级别由小到大分别·为分别为private,default,protect,public
private(当前访问级别):当前类成员被private修饰时,这个成员只能被该类其他成员访问,其他类无法访问,类的良好封装性就通过private实现的
default(包访问级别):如果一个类或者类的成员不使用任何访问控制符修饰,则成他为默认访问级别,这个类或者类的成员只能被本包中其他类来访问
protect(公共访问级别):如果一个类的成员是被protect修饰时,那么这个成员既能被本包的其他类访问,也能被其他包中的类访问
public(公共访问级别):如果一个类或者类的成员被public访问,则这个类或者累的成员能被所有的类访问
类的封装
如何实现类的封装
类的封装,是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类提供的方法来实现内部信息的操作访问
具体的过程,应该是,在定义一个类时,将属性私有化,即使用private修饰,私有的属性只能在他所在的类中被访问,如果外界想要访问私有属性,需要提供一些public方法,其中包括getXXX()方法来获取属性值,setXXX()来设置属性值,
set和get方法的快捷键:右击选择source->Generate Getters and Setters
方法的重载和递归
方法的重载
图中定义三个同名的add()方法,但他们的参数个数或参数类型不同,从而实现方法的重载
方法的重载与返回值类型无关,只满足两个条件,一是方法名相同,而是参数个数和参数类型不同
方法的递归
方法的递归就是在一个方法内自己调用自己的过程。递归必须有结束条件,不然就会陷入无线递归的状态,永远无法结束调用
构造方法
构造方法的·定义
【修饰符】方法名(【参数列表】){
//参数体
}
当实例化对象的属性后,如果要为这个对象的属性赋值,则必须直接访问对象的属性或调动setXXX()方法。如果需要实例化对象的同时就要为这个对象进行赋值,就可以构造方法来实现,构造方法是类的特殊成员,他会在类实例化对象时被自动调用
上图中,定义了无参构造方法Person(),并且被调用了,这是因为在通过newPerson()时会自动调该构造函数
在一个类中,除了可以定义无构造方法,还可以定义有参构造方法。通过有参的构造方法就可以实现对属性的赋值如下
构造方法的重载
和普通方法一样,构造方法也可以重载,在一个类中可以定义多高构造方法,只要多个构造方法的参数类型和参数个数不同即可,在创建对象时。可以通过调用不同的构造方法来为不同的属性进行赋值
在java中,每个类至少有一个构造方法,如果在一个类中没有显示的定义构造方法,系统会自动的为这个类创建一个默认的构造方法,这个默认的构造方法没有参数,在其方法体中没有任何代码,即什么也不做
class Person{
}
第二种写法
class Person{
public Person(){
}
}
对于第一种写法,虽然类中没有显示的声明构造方法,但是仍然可以用new Persion()来创建Person类的实例对象,由于系统提供无参构造方法往往不能满足需求,因此可以再自己的类中定义构造方法,一旦为该类定义了构造方法,系统就不再提供默认的无参构造方法
this关键字
java中提供了一个关键字,this,用来指代当前的对象,用在方法中访问对象的其他成员,
(1):通过this关键字来调用成员变量,解决与局部变量的名字冲突问题
class Person{
int age;
public Person(int age){
this.age=age;
}
}
在上述代码中,构造方法的参数被定义为age,他是一个局部变量,再类中还定义了一个成员变量age,在构造方法中使用的age是访问局部变量,但this引用的是成员变量
(2)通过this关键字来调用成员方法
class Person{
public void openMouth(){
}
public void speak(){
this.open,Mouth();
}
}
(3)通过this来调用一构造方法
实例化对象之后调用了有参构造函数,在有参构造函数中通过this()调用了无参构造方法
在使用this是注意以下几点
1:只能在构造方法中使用来调用其他构造方法,不能再成员方法中使用
2:在构造方法中使用this调用构造方法的语句必须放在头一条中,且只能使用一次
3:不能再一个类的两个构造方法中使用this()互相调用
static关键字
在java中使用static关键字来修饰类的成员,如成员变量,成员方法,以及代码块等
静态变量
定义一个类时,只是在描述某类事务的特征和行为,并没有产生具体的数据,只有通过new关键字来创建该类的实例对象后系统才可以为每个对象分配内存空间,存储各自的数局,有时候需要某些特定的数据在内存中只有一份,但是能被所有的实例对象共享,在Java的类中,要实现这种功能要使用static关键字来修饰成员变量,该变量称为静态变量
静态变量的格式
类名.变量名
在Student类中定义了静态变量schoolName,用来表示学生所在的学校,他被所有的实力对象共享,由于schoolName是静态变量,所以可以直接使用Student.schoolName的方式来进行调用,也可以通过stu1.schoolName来调用
static关键字只能用于修饰成员变量,不能用于修饰局部变量
静态方法
静态方法定于十分简单,只需要在类中定义的方法前面加上static关键字即可,在使用时有两种方式来访问
1:类名.方法
2.实例对象名.方法
使用Person.say()调用静态方法,由此可见 静态方法不需要创建对象就可以直接通过类名调用
静态代码块
格式;
static{
}
当类加载的时候,静态代码会执行,由于类只执行一次,所以代码快也只执行一次,在程序中,通常会使用静态代码块来对类的成员变量进行初始化