Java学习笔记(面向对象1)

面向对象


1.何为面向对象

  • 面相对象是相对面向过程而言的
  • 面相对象和面向过程都是一种思想
  • 面向过程
    • 强调功能行为
  • 面向对象
    • 将功能封装进对象,强调具备了功能的对象。
  • 面向对象是基于面向过程的。

2.类与对象

  1. 类就是对现实生活中事物的描述;
    • 对象则是这类事物,实实在在存在的个体;
    • 描述类时,有属性(成员变量)和行为(成员方法);
    • 成员变量与局部变量
    • 成员变量作用于整个类中;
    • 局部变量作用于函数中或者语句中;
    • 成员变量在堆内存中,因为对象的存在才在内存中存在;
    • 局部变量在栈内存中

3.匿名对象

使用:

  • 当对对象的方法只调用一次,可以使用匿名对象来完成,这样较为简化;若对一个对象进行多个成员调用,必须给这个对象起个名字;
  • 可以将匿名对象作为实际参数进行传递。

4.封装

  • 封装:指隐藏对象的属性和实现细节,仅对外提供公共访问方式;
  • 好处:
    1. 将变化隔离
      • 便于使用
      • 提高重用性
      • 提高安全性
  • 封装原则:
    1. 将不需要对外提供的内容都隐藏起来
      • 把属性都隐藏,提供公共方法对其访问

4.1 private

私有只在本类中有效

一个成员变量(私有属性)通常对应两个访问方式,一个是设置set一个是获取get;
局部变量必须初始化值,成员变量不需要初始化值,有系统默认

5.构造函数

5.1特点:

  1. 函数名与类名相同
    • 不用定义返回值类型
    • 不可以写return语句

5.1作用:

给对象进行初始化。即对象一建立,就会调用与之对应的构造函数

5.3注意:

  1. 默认构造函数的特点;
    • 多个构造函数是一重载的方式存在的;
    • 当一个类中没有定义构造函数,系统会默认给该类加入一个空参数的构造函数;
    • 构造函数在对象一建立就运行,给对象初始化,而一般函数是对象调用才执行,给对象添加对象具备的功能;
    • 一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次;
    • 当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中;

5.4构造代码块

  • 作用:给对象进行初始化,对象一建立就运行,并优先于构造函数执行

构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化

6.关键字

6.1 this关键字

作用:用于区分局部变量和成员变量同名的情况;

this代表本类的对象;哪个对象调用this所在的函数,this就代表哪个对象;即this代表它所在函数所属对象的引用

应用:

  1. 当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示对象
    • 构造函数之间调用只能使用this关键字;
    • this的调用必须放在构造函数第一句,因为初始化要先执行;

6.2 static关键字

6.2.1 作用:
  1. 修饰符,用于修饰成员(成员变量,成员函数),被修饰后成为类变量;
    • 当成员被静态修饰后,便多一个调用方式,除了可以被对象调用外,还可以直接被类名调用(类名.静态变量)。
6.2.2 特点:
  1. static修饰的变量存在于随着类的加载而加载,随着类的消失而消失;说明其生命周期最长;
    • 优先于对象存在,即静态是先存在的,对象是后存在的;
    • 被所有对象共享
    • 可直接被类名所调用

ps:实例变量与类变量的区别

  1. 存放位置
    类变量随着类的加载而存在于方法区中;实例变量随着对象的建立而存在于堆内存中;
    • 生命周期
      类变量生命周期最长,随着类的消失而消失;
      实例变量生命周期随着对象消失而消失;
6.2.3 使用注意事项:
  1. 静态方法只能访问静态成员;非静态方法既可以访问静态也可以访问非静态;
  2. 静态方法中不可以定义this,super关键字,因为静态优先于对象存在;
  3. 主函数为静态。
6.2.4 优缺点:
  • 优点:
    • 对对象的共享数据进行单独空间的存储,节省空间,没必要对每一个对象都存储一份;
    • 可以直接被类名调用。
  • 缺点:
    • 生命周期过长;
    • 访问出现局限性(只能访问静态)。
6.2.5 何时使用:
  1. 何时定义静态变量(类变量):当对象出现共享数据时,该数据被静态所修饰,对象中的特有数据要定义成非静态存在于堆内存中;

    • 只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的。
  2. 何时定义静态函数:当功能内部没有访问非静态数据(对象的特有数据),则该功能可以定义为静态的。

    • 简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。如果不需要,就可以将该功能定义成静态的。当然,也可以定义成非静态,但是非静态需要被对象调用。如果没有访问特有数据的方法,该对象的创建是没有意义。
6.2.5 静态的应用:
  • 每个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装,以重复使用
6.2.5 静态代码块:

特点:

  1. 随着类的加载而执行,只执行一次,用于给类进行初始化;
  2. 优先于主函数执行;(如例1)
  3. 只有类 加载的时候才会执行静态代码块。(如例2)

例1

class StaticCode{
static
{
System.out.print(“a”);
}
}

class StaticCodeDemo{
    static
    {
        System.out.print("b");
    }   
    public static void main(String[] args)  
    {
        new StaticCode();
        new StaticCode();
        System.out.print("over");
    }
    static{
        System.out.print("c");
    }
}

输出结果:bcaover

例2

class StaticCode{
static
{
System.out.print(“a”);
}
public static void show(){
System.out.print(“show run”);
}
}

class StaticCodeDemo{
    static
    {
        System.out.print("b");
    }   
    public static void main(String[] args)  
    {
        StaticCode s = null;
    }
    static{
        System.out.print("c");
    }
}

输出结果:bcover

By the way说一下构造代码块,如下例:

class StaticCode{
int num = 9;
StaticCode()//构造函数,给对应对象初始化
{
System.out.println(“b”);
}

    static
    {
        System.out.print("a");//静态代码块,给类初始化
    }
    {
        System.out.print("c"+9);//构造代码块,给对象初始化
    }

    StaticCode(int x)//构造函数,给对应对象初始化
    {
        System.out.println("d"+x);
    }
    public static void show(){
        System.out.print("show run");
    }
}

class StaticCodeDemo{   
    public static void main(String[] args)  
    {
         new StaticCode(4);
    }
    static{
        System.out.print("e");
    }
}

输出结果:eac9d4

7.main函数

public static void mian(String[] args);

  • 主函数是一个特殊的函数,作为程序的入口,可以被jvm(虚拟机)调用。

  • 主函数的定义:

    1. public:代表该函数访问权限是最大的;
    2. static:代表主函数随着类的加载就已经存在了;
    3. void:主函数没有具体返回值;
    4. main:不是关键字,但是是一个特殊字符,可以被jvm识别;
    5. (String[] args):函数的参数,参数类型是一个字符串类型数组,该数组中的元素是字符串;
    6. 主函数为固定模式,jvm唯一识别格式
    7. args为参数名,可更改;
  • jvm在调用主函数时,传入的是new String[0];

    例如:

    class MainDemo
    {
    public static void main(String[] args){
    System.out.println(args);
    }
    }
    执行结果:

例如1:


class MainDemo
{
public static void main(String[] args){
System.out.println(args.length);
System.out.println(args.[0]);
}
}
编译后输入数值:

例如2:


class MainDemo
{
public static void main(String[] args){
String[] arr ={“hehe”,”haha”,”heihei”,”xixi”};
MainTest.main(arr);
}
}
class MainTest(){
public static void main(String[] args){
for(int x=0; x

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值