- 面向对象基本概念
- 面向对象是一种编程思想,是一种思考问题的思维方式
- 建立面向对象的思维方式:1. 先整体,再局部 2.先抽象,再具体 3.能做什么,再怎么做
- 如何学习面向对象:1.掌握一门面向对象语言的语法 2.熟悉面向对象的设计原则 3. 熟悉面向对象设计模2.类与对象
2.类与对象
- 类是既包括数据又包括作用于数据的一组操作的封装体。类的数据称为成员变量,类对数据的操作成为成员方法。成员变量反映类的状态和特征,成员方法反映类的行为和能力。类的成员变量和方法统称为类的成员。
- 对象是类的实例。对象是动态的,拥有生命周期,都会经历一个从创建、运行到消亡的过程。
- 对象与类的关系就像变量与数据类型一样。
- new关键字:表示向内存申请空间,也表示实例化一个对象,创建一个对象。
- 一个对象在内存中的大小,由该对象的所有属性所占的内存大小的总和,引用类型变量在32位系统上占四个字节,在64位系统上占8个字节。加上而外的对象隐性数据所占的大小。
- 相同的类型才可以赋值。
- 不同的引用,指向一同个对象,任何一个引用改变对象的值,其他引用都会反映出来。
- 编程时要注意的问题,在确定不使用对象时,要尽早释放对象:引用 null 。
- 当一个堆中的对象,没有被任何引用变量所指向时,该对象会被JVM 的 GC程序认为是垃圾对象,从而被回收。
3. 类和对象的定义格式
- 类的定义包括两部分:类声明和类体,格式如下
class 类名
{
//类体部分;
}
- 在基本格式基础之上,一般情况下,类的定义格式如下:
[public] class 类名
{
[成员变量]
[构造方法]
[方法]
}
如:
class point {
int x,y;
void init(int a,int b) {
x=a;
y=b;
}
}
- 类是对象的创建模板。获得一个类的对象需要两步:1.对象的声明 2.为对象分配内存。通过new运算符调用构造方法创建对象实体,并把该对象的引用赋值给该变量。
如声明Point类型的对象:
Point mypoint = new Point();
//或
Point mypoint; //声明对象的引用
mypoint =new Point(); //创建Point类的对象
4.对象的内存分析
5.封装性
成员变量和局部变量
- 在类中位置不同
成员变量:在类中定义
局部变量:在方法中定义或者方法的参数
2. 在内存中位置不同
成员变量 :在堆内存(成员变量属于对象,对象进堆内存)
局部变量 :在栈内存(局部变量属于方法,方法进栈内存)
3. 生命周期不同
成员变量 : 随着对象的创建而存在,随着对象的销毁而消失
局部变量 : 随着方法的调用而存在,随着方法的调用完毕而消失
4. 初始化值不同
成员变量:有默认初始化值,引用类型默认为 null
局部变量 : 没有默认初始化值,必须定义,赋值,然后才能使用
注意 :
局部变量名称可以和成员变量名称一样,在方法使用的时候,采用的是就近原则
对于属性来说,加private就是封装
6. 构造方法
构造方法和方法的区别
构造方法要与类名相同,无返回类型,在类初始化时调用。
方法最好不要与类同名,对象调用,静态方法可用 类名.方法()
构造器和方法在下面三个方面区别:
1. 和方法一样,构造器可以有任何形式的修饰:public,protected,private或者没有修饰(通常被package和friendly调用 )。不同方法的是,构造器不能有以下非访问性质的修饰:abstract,final,native,static或者synchronized。
2. 返回类型也是十分重要的,方法能返回任何类型的值或无返回值(void),构造器没有返回值,也无需void
3. 两者的命名。构造器和类使用相同的名字,而方法则不同。按照习惯,方法通常用小写字母开始,而构造器通常由大写字母开始。构造器通常是一个名词,因为它和类同名;而方法通常要接近动词,因为它说明一个操作。
7. this关键字
- 使用this 调用本类中的成员变量(属性),如
class Student {
private String name;
public void setNamae(String name) {
this.name=name; //将形参的值传递给成员变量
}
public String getName() {
return name;
}
}
//这是this.name代表的就是类中的成员变量,赋值号右边的 就是方法的形参
- 使用this 调用构造方法,如 :
class Student {
private String name;
private int age;
public Student {
System.out.println("新对象实例化");
}
public Student(String name) {
this(); //调用本类中无参构造方法
this.name = name;
}
public Student(String name,int age) {
this(name); //调用本类中有一个参数的构造方法
this.age = age;
}
}
//java编译器会根据所传递参数数量的不同,来判断该调用那个构造方法
- 使用this 调用当前对象,如:
public class Car {
public Car getCarObject() {
return this; //返回当前对象
}
public static void main(String[] args) {
Car sc =new Car(); //创建一个Car对象
System.out.println(sc.getCarObject() instanceof Car);
}
}
//这里定义了一个返回值为Car类型的方法 getCarObject(),并使用this关键字返回当前对象Car。
//在main()方法中创建一个Car对象并使用 instanceof方法判断 getCarObject()方法返回的对象与Car对象是否匹配。
//运行结果为true
8.值传递和引用传递
- 值传递示例:
public class ValueDemo{
public static void main(String[] args) {
int x=10;
method(x);
System.out.println("x="+x);
}
public static void method(int mx) {
mx=20;
}
}
- 引用传递示例:
public class RefDemo{ public static void main(String[] args) { Duck d = new Duck(); method(d); System.out.println("Duck age = "+d.age); } public static void method(Duck duck) { duck.age = 5; } }
9.对象的一对一关系
分为双向一对一和单向一对一
(比如一个英雄对一个兵器)
public class Test{
public static void main(String[] args) {
Hero hero =new Hero("刘备",300);
Weapen weapen =new Weapen("双股剑",3);
//把两个对象关联起来
hero.setWeapen(weapen);
weapen.setHero(hero);
}
}
//英雄类
class Hero {
private String name;
private int age;
private Weapen weapen; //一对一关系
public void setWeapen(Weapen weapen) {
this.weapen = weapen;
}
public Weapen getWeapen() {
return weapen;
}
public Hero(){}
public Hero(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
reurn name;
}
public void setAge(int age){
this.age =age;
}
public int getAge() {
return age;
}
}
//兵器类
class Weapen{
private String name;
private int grade;
//若是双向关系,则两边都添加
private Hero hreo;
public void setHero(Hero hero) {
this.hero = hero;
}
public Hero getHero(){
return hero;
}
public Weapen(){}
public Weapen(String name,int grade) {
this.name=name;
this.grade=grade;
}
public void setName(String name){
this.name = name;
}
public String getName(){
reurn name;
}
public void setGrade(int grade){
this.grade =grade;
}
public int getGrade() {
return grade;
}
}
10.static关键字
- 静态变量或方法不属于对象,依赖类。
- 静态变量是全局变量,生命周期从类被加载后一直到程序结束。
- 静态变量只存有一份,在静态方法区中储存。
- 静态变量时本类所有对象共享一份。
- 建议不要使用对象名法去调用静态数据,直接使用类名调用。
- static修饰一个方法,那么该方法属于类,不属于对象,直接用类名调用。
- 静态方法不能访问非静态变量属性和方法,只能访问静态。
11.main方法分析
主方法:
public static void main(String[] args){
//代码块
}
- public : 共有的,最大的访问权限
- static : 静态的,无需创建对象
- void : 表示没有返回值,无需向JVM返回结果
- main : 方法民法,固定的方法名
- String[] args : 表示参数为字符串数组,可以在调用方法时传入参数
12.代码块
- 普通代码块,在方法中写的代码块
- 构造块,是在类中类中定义的代码块,在创建对象时被调用,优于构造方法执行
- 在类中使用static声明的代码块称为静态代码块
在第一次使用的时候被调用(创建队象),只会执行一次,优于构造快执行
13.单例设计模式
单例设计模式:保证一个类仅有一个实例,并提供一个正在访问它的全局变量访问点。
- 构造方法私有化
- 声明一个本类对象
- 给外部提供一个静态方法获取对象实例
两种实现方式:
- 懒汉式:在第一次调用方法时,对象被创建,到程序结束被释放
- 饿汉式:在类被加载后,对象被创建,到程序结束后释放
饿汉式占用内存时间长,提高效率
- 在项目中使用单例的目的是为了节省重复创建对象所带来的内存消耗,从而来提高效率。
14.对象与数组管理
动态数组:
- 数组是一种线性数据结构
- 数组不适合作删除插入操作,适合添加,查找,遍历