面向对象(6.7)

 1、面向对象(实体)思想:没有就造一个,有就拿来用。

用JAVA语言对现实生活中的事物进行描述,通过类的形式来体现的。

//面向对象:三个特征:封装,继承,多态。
//以后开发:其实就是找对象使用。没有对象,就创建一个对象。
//找对象,建立对象,使用对象。维护对象的关系。

a.怎么描述?

对于事物描述通常只关注两方面。
一个是属性,一个是行为。

只要明确该事物的属性和行为并定义在类中即可

对象:其实就是该类事物实实在在存在的个体

b.类与对象之间的关系?

类:事物的描述
对象:该类事物的实例

对象:该类事物的实例。在java中通过new来创建

C.匿名对象:没有名字的对象

1.当对象对方法仅进行一次调用的时候,就可以简化成匿名对象。
2.匿名对象可以作为实际参数进行传递。

类类型的变量一定指向对象,要不就是null

成员变量和局部变量的区别:

1.成员变量定义在类中,整个类中都可以访问
局部变量定义在函数,语句、局部代码块中,只在所属的区域有效
2.成员变量存在于堆内存的对象中
局部变量存在与栈内存的方法中
3.成员变量随着对象的创建而存在,随着对象的消失而消失
局部变量随着所属区域的执行而存在,随着所属区域的结束而释放
4.成员变量都有默认初始化值
局部变量没有默认初始化值

2.封装

private :私有,权限修饰符:用于修饰类中的成员(成员变量,成员函数)。
私有只在本类中有效。

将age私有化以后,类以外即使建立了对象也不能直接访问。
但是人应该有年龄,就需要在Person类中提供对应访问age的方式。

注意:私有仅仅是封装的一种表现形式。

之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断等语句。
对访问的数据进行操作。提高代码健壮性。

2.构造函数

对象一建立就会调用与之对应的构造函数。

构造函数的作用:可以用于给对象进行初始化。

构造函数的小细节:

当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。
当在类中自定义了构造函数后,默认的构造函数就没有了。

一般函数和构造函数什么区别?

a.构造函数和一般函数在写法上有不同。

b.在运行上也有不同。

构造函数是在对象一建立就运行。给对象初始化。
而一般方法是对象调用才执行,给是对象添加对象具备的功能。
一个对象建立,构造函数只运行一次。
而一般方法可以被该对象调用多次。

什么时候定义构造函数?

当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。

构造函数重载
构造函数内存图解

this 关键字

this:看上去,是用于区分局部变量和成员变量同名情况。
this为什么可以解决这个问题?
this到底代表的是什么呢?

this:就代表本类的对象,到底代表哪一个呢?
this代表它所在函数所属对象的引用。
简单说:哪个对象在调用this所在的函数,this就代表哪个对象。

this的应用:当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。
但凡本类功能内部使用了了本类对象,都用this表示。

static关键字

静态:static。
用法:是一个修饰符,用于修饰成员(成员变量,成员函数).
当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,
还可以直接被类名调用。类名.静态成员。

static特点:
1,随着类的加载而加载。
也就说:静态会随着类的消失而消失。说明它的生命周期最长。

2,优先于的对象存在
明确一点:静态是先存在。对象是后存在的。

3,被所有对象所共享
4,可以直接被类名所调用。

实例变量和类变量的区别:
1,存放位置。
类变量随着类的加载而存在于方法区中。
实例变量随着对象的建立而存在于堆内存中。
2,生命周期:
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。

 静态使用注意事项:

1,静态方法只能访问静态成员。
非静态方法既可以访问静态也可以访问非静态。
2,静态方法中不可以定义this,super关键字。
因为静态优先于对象存在。所以静态方法中不可以出现this。
3,主函数是静态的。


静态有利有弊
利处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存储一份。
可以直接被类名调用。
弊端:生命周期过长。
访问出现局限性。(静态虽好,只能访问静态。)

什么使用静态?

要从两方面下手:
因为静态修饰的内容有成员变量和函数。
什么时候定义静态变量(类变量)呢?
当对象中出现共享数据时,该数据被静态所修饰。
对象中的特有数据要定义成非静态存在于堆内存中。

什么时候定义静态函数呢?

当功能内部没有访问到肺静态数据(对象的特有数据),
那么该功能可以定义成静态的。

class Person
{
    String name;
    static String country = "cn";
    public  static void show()
    {
        System.out.println(contry+"haha");    
    }

}


class  
{
    public static void main(String[] args) 
    {
        Person p = new Person();
        p.show();
        //Person .show();
    }

}

main()函数解析

public static void main(String[] args)

主函数:是一个特殊的函数。作为程序的入口,可以被jvm调用。

主函数的定义:
public:代表着该函数访问权限是最大的。
static:代表主函数随着类的加载就已经存在了。
void:主函数没有具体的返回值。
main:不是关键字,但是是一个特殊的单词,可以被jvm识别。
(String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组。

主函数是固定格式的:jvm识别。

jvm在调用主函数时,传入的是new String[0];

静态代码块。

格式:
static
{
静态代码块中的执行语句。
}

特点:随着类的加载而执行,只执行一次,并优先于主函数。
用于给类进行初始化的。

class StaticCode
{
    int num = 9;
    StaticCode()
    {
        System.out.println("b");
    }

    static
    {
        System.out.println("a");
    }
    {
        System.out.println("c"+this.num);
    }

    StaticCode(int x)
    {
        System.out.println("d");
    }
    public static void show()
    {
        System.out.println("show run");
    }
}

class StaticCodeDemo 
{
    static
    {
        //System.out.println("b");
    }
    public static void main(String[] args) 
    {
        new StaticCode(4);//a c d 
        //new StaticCode();
        //new StaticCode();
        //System.out.println("over");
        //StaticCode.show();
        //StaticCode s = null;
        //s = new StaticCode();

        //StaticCode.show();


    }
    static
    {
        ///System.out.println("c");
    }
}
//d:\>java0217\day06>java StaticCodeDemo
//b c a over
View Code

构造代码块。

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

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

构造代码快中定义的是不同对象共性的初始化内容。

class Person
{
    private String name;
    private int age;
    
    /*
构造代码块。

    作用:给对象进行初始化。
    对象一建立就运行,而且优先于构造函数执行。
    和构造函数的区别:
    构造代码块是给所有对象进行统一初始化,
    而构造函数是给对应的对象初始化。

    构造代码快中定义的是不同对象共性的初始化内容。

    */
    {
        //System.out.println("person code run");
        cry();
    }

    Person()
    {
        System.out.println("A: name="+name+",,age="+age);
        
    }
    /**/
    Person(String n)
    {
        name = n;
        System.out.println("B: name="+name+",,age="+age);

        //cry();
        
    }
    /*
    public void setName(String n)
    {
        name  = n;
    }
    public String getName()
    {
        return name;
    }
    */
    Person(String n,int a)
    {
        name = n;
        age = a;
        System.out.println("C: name="+name+",,age="+age);
        //cry();
    }

    public void cry()
    {
        
        System.out.println("cry......");
    }
}

class  PersonDemo2
{
    public static void main(String[] args) 
    {
        Person p1 = new Person();

        

        Person p2 = new Person("lisi");
    
        //System.out.println(p2.getName());

        //Person p3 = new Person("wnagu",10);
    
        
    }
}
View Code
原文地址:https://www.cnblogs.com/suihui/p/3125989.html