Java开发实战经典学习记录(一)

面向对象编程(基础篇)

目录

面向对象编程(基础篇)

一、类与对象

1、类与对象

2、类的定义

3、对象的创建及使用

4、创建多个对象

二、封装性

三、构造方法

四、匿名对象

五、String类

1、实例化String类对象

2、String对象的内容比较

3、字符串的内容不可变

六、this关键字

1、表示类中的属性

2、使用this调用构造方法

3、this表示当前对象

七、static关键字

1、使用static声明属性

2、使用static声明方法

3、关于main()方法

八、代码块

九、对象数组

十、内部类


一、类与对象

1、类与对象

1>类:定义出一个基本的模板,代表一个共性。

2>对象:一个个具体的东西。

如果要使用一个类,就一定有产生一个对象。对象所具备的操作是类中规定好的方法。

2、类的定义

1>类(属性+方法),一个属性就是一个变量,方法是一些操作的行为。

class 类名称 {
    数据类型 属性;                                            //声明成员变量(属性)
……

    public 返回值的数据类型 方法名称(参数1,参数2……){         //定义方法内容
        程序语句;
        [return 表达式;]
    }
}

:类名称要求开头首字母大写。

3、对象的创建及使用

1>对象的创建

类名 对象名称 = null;               //声明对象
对象名称 = new 类名();              //实例化对象,只要有关键字new就表示开辟新的堆内存空间

2>对象的创建

类名 对象名称 = new 类名();

3>使用对象访问类中的某个属性或方法

访问属性: 对象名称.属性名;
访问方法: 对象名称.方法名();

4、创建多个对象

引用传递:将一个堆内存空间的使用权给多个栈内存空间(一个栈内存只能保存一个堆内存空间的地址,如果想要再指向其他的堆内存空间,则必须先断开已有的指向才能分配新的指向),不同的栈内存将指向同一块堆内存,每个栈内存空间都可以修改堆内存的内容。

二、封装性

1>保证对象不能直接访问类中的属性。

为属性封装:private 属性类型 属性名称;
为方法封装:private 方法返回值 方法名称(参数列表){}

但是属性必须封装又必须访问,所以需要settergetter方法设置和取得。

:1.开发过程中,类中全部属性需要封装,再通过setter和getter进行访问。2.封装不单指private,private声明的属性或方法只能在其类的内部被调用,不能在类的外部被调用。3.正常情况下,类方法+类名称就可以完成本类中的方法调用,如果要强调是本类中的方法也可以用this,“this.方法名称()”来调用。4“-”表示private。

三、构造方法

class 类名称{
    访问权限 类名称(类型1 参数1,类型2,参数2…){
        程序语句;
        ……        //构造方法没有返回值
    }
}

注:

1.构造方法的名称必须与类名称一致;

2.构造方法的声明处不能有任何返回值类型的声明;

3.不能再构造方法中使用return返回一个值。

4.当调用关键字new实例化对象的时候才会调用构造方法。

5.只要是类,就必须存在构造方法,如果一个类没有明确的声明一个构造方法则在编译的时候会直接生成一个无参数的,什么都不做的构造方法。

重载:由于构造方法名称本身要求与类名称保持一致,所以只要每个构造方法的参数类型参数个数不同,就可以实现重载。(所有的重载方法按照参数的个数由多到少,或者是由少到多排列)

四、匿名对象

匿名对象:没有明确给出名字的对象。一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。(使用一次后就等待被垃圾收集机制回收)

五、String类

1、实例化String类对象

1>直接赋值:只要以后声明的字符串内容相同,则不会再开辟新的空间内存。

String name = "zz";

2>构造方法:String类存在一个构造方法,所以可以new实例化对象调用该方法。但是会开辟一个新的空间,真正使用的只是一个使用关键字new开辟的空间,另一个是垃圾空间。

public String(String original)

注:一个字符串就是一个String类的匿名对象,可以调用String类中的方法。

String name = new String("zz");

2、String对象的内容比较

1.String对象的内容实际上都是保存在堆内存之中的,而且堆中的内容是相等的,但是其内容分别保存在了不同的空间,所以即便内容相等,但是地址的值也是不相等的。

2.“==”主要功能是进行数值相等判断的,如果用在String对象上表示的是内存地址数值的比较。

3.equals()方法是由String提供的方法,此方法专门负责进行字符串内容的比较。(使用equals时要注意空指针异常问题)

3、字符串的内容不可变

String类字符串一旦声明则不可改变,而一个String对象内容的改变实际上是通过内存地址的“断开-链接”变化完成的,而本身字符串中的内容并没有任何的变化。

六、this关键字

1、表示类中的属性

在程序中可以使用this调用本类属性

name=name;        //name到底是属性还是构造方法的参数
age=age;          //age到底是属性还是构造方法的参数

在赋值的时候,属性不是明确被指出,所以会造成错误。

this.name=name;              //明确表示为类中的name属性赋值
this.age=age;                //明确表示为类中的age属性赋值

2、使用this调用构造方法

1、构造方法实在实例化一对象时被自动调用的,也就是说在类中的所有方法里,只有构造方法是被优先调用的,所以使用this调用构造方法必须也只能放在构造方法的第一行。

public Person(){
    System.out.println("一个新的Person对象被实例化");        //无参构造
}
public Person(String name,int age){                         
    this();                                                 //在此处调用Person类中的无参构造
    this.name=name;
    this.age=age;
}

2、对于this调用构造方法的时候一定要留一个构造方法作为出口,即程序中至少存在一个构造方法是不使用this调用其他构造方法的。一般都将无参构造方法作为出口,即在无参构造方法中最好不要再去调用其他构造方法。

3、this表示当前对象

当前对象就是指当前正在调用类中方法的对象

七、static关键字

每个对象有每个对象自己的属性,如果现在有些属性希望所有对象共享,则就必须将其声明为static属性。如果一个类中的方法不想由对象,而是由类名称直接调用,则就可以声明为static方法。

1、使用static声明属性

如果在程序中使用static声明属性的话,则此属性称为全局属性(静态属性),由所有对象共享。

注:一个类中的公共属性可以由一个对象修改,但是不合适。类的公共属性应该由类进行修改,那么有时也就把使用static声明的属性称为类属性。

类名称.static属性;

扩:Java中常用的内存区域

1>栈内存空间:保存所有对象名称(保存了引用的堆内存空间的地址)。

2>堆内存空间:保存每个对象的具体属性内容。

3>全局数据区:保存static属性的内存。

4>全局代码区:保存所有的方法定义。

2、使用static声明方法

用static声明的方法被称为类方法,可以由类名称直接调用。

注:非static声明的方法可以去调用static声明的属性或方法,但是static声明的方法是不能调用非static类型声明的属性或方法。因为程序中所有的属性和方法必须在对象开辟堆内存之后才可以调用,而static类型的方法在对象未被实例化时就可以被类名所调用。

3、关于main()方法

使用的main()方法的定义中,一直有static关键字的存在。

    public static void main(String args[]){}

1>public:表示此方法可以被外部所调用。

2>static:表示此方法可以由类名称直接调用。

3>void:主方法是程序的起点,所以不需要任何的返回值。

4>main:系统规定好默认调用的方法名称,执行的时候,默认找到main()方法名称。

5>String args[]:表示的是运行时的参数。参数的传递形式为”Java 类名称 参数1 参数2 参数3……“。

注:如果一个方法要由主方法直接调用,则必须按以下格式声明:

”public static 方法的返回值类型 方法名称(参数列表){}“

这是因为主方法是静态方法,而静态方法不能调用非静态方法,所以之前的方法声明处才必须加上static关键字。

八、代码块

代码块:用{}括起来的一段代码。

1、普通代码块:用于程序分割使用。

2、构造块:构造代码块是直接写在类中的代码块。构造块优先于构造方法执行,每次实例化对象的时候都会执行构造块中的代码。

3、静态代码块:使用static声明的代码块。静态代码块优先于主方法执行,在类中定义的静态代码块会优先于构造块执行,不管多少个对象产生,静态代码块只执行一次。

九、对象数组

对象数组:包含了一组相关的对象。

数组一定要先开辟空间,使用数组里面的每一个对象必须分别进行实例化。

对象数组也有静态初始化和动态初始化。

类 对象数组名称[]=new 类[数组长度]
Person per[]=new Person[3];

主方法中String args[]就是个对象数组:在主方法中,可以使用String args[]接收初始化参数,实际上这里的String本身就是一个类,所以在主方法中的参数本身就是以对象数组的形式出现的。

十、内部类

1>内部类:如果在类1的内部再定义一个类2,此时这个类2称为内部类,类1称为外部类。

内部类可public或private,声明后,对其访问的限制与成员变量和成员方法完全相同。

内部类的好处是可以方便地访问外部类中的私有属性。同时,外部类也可以方便地访问内部类中的私有属性。

标识符 class 外部类的名称{
    //外部类的成员
    标识符 class 内部类的名称{
        //内部类的成员
    }
}

eg:
class Outer{
    private String info = "hello world";
    class Inner{
        public void print(){
            System.out.println(info);
        }
    }

2>使用static定义内部类:使用static可以声明属性或方法,而使用static也可以声明内部类,用static声明的内部类则变成外部类,但是用static声明的内部类不能访问非static的外部属性。

3>在外部访问内部类:一个内部类除了可以通过外部类访问,也可以直接在其他类中进行调用,调用的基本格式为

外部类.内部类 内部类对象 = 外部类实例.new 内部类();

4>在方法中定义内部类:内部类可以定义在程序的任意位置,例如:代码块中、方法中,但是在方法中定义的内部类不能直接访问方法中的参数,如果方法中的参数想被内部类访问,则参数前必须加上final关键字(JDK1.8开始可以不用加)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值