• 理解java面向对象基础


    1. 类和对象

    一切皆对象,这可以说是面向对象的核心思想了。

    类,就是具有相同性质对象的抽象。 而类的每一个具体的实例就是一个对象。 

    我们可以定义一个Person类,这个Person类就是所有的人的抽象,而我们知道,每个人应该有名字(name),年龄(age)等属性,我们把这个抽象提取出来:

    class Person
    {
    	private String name;
    	private int age;
    }

    如果要获得一个人类的具体的实例(对象),我们可以使用new关键字:

    // 定义一个Person变量
    Person p;	
    // 调用构造器,返回一个Person实例(在堆内存中为对象开辟空间)
    // 将该Person实例赋值给p变量
    p = new Person();

    可以直接写出: Person p = new Person();

    2. 类的成员

    类中应该有哪些东西呢?我们可以思考,人类应该拥有的东西:名字,年龄...... 这些被称为属性,当然,人还应该拥有通用的一些动作行为,比如说话,吃饭,睡觉等等,这些行为动作就是方法。

    所以比较完整的类可以如下定义:

    class Person
    {
    	// 属性
    	private String name;
    	private int age;
    
    	// 方法
    	private void say(){}
    
    	private void sleep(){}
    }

    当然,除此之外,类的成员还有: 构造器,内部类。

    3. 通过对象访问属性

    对象是类的实例,所以说,对象拥有访问类中所有东西(属性、方法)的权利,访问方式: 对象.属性 、 对象.方法;

    此外,如果类中的成员使用了static修饰(即类成员),则可以直接通过类名.属性/方法 进行访问。 

    4. this

    This作为对象的默认引用有两种情形:

    1)构造器中引用该构造器正在初始化的对象

    2)方法里引用调用方法的对象。 

    1)的理解:

    构造器的作用是什么呢,说白了,就是为了初始化属性数据的;所以,我们一般利用构造器,传入相关的属性数据,为要初始化的对象的属性赋初始值。

    public Person(String name,int age){
    this.name = name;
    this.age = age;
    }

    构造器中,我们使用this关键字,表示正在初始化的对象。this.name = name;的意思就是正在初始化对象的name属性为传递过来的name值。 

    2)的理解:

    说白了就是在调用方法的过程中,如果哪个对象调用了该方法,则该方法里的this表示该对象。

    // 方法
    private void say(){
    this.sleep();	此处的this就表示正在调用say()方法的对象。该对象继续调用sleep()方法
    }	private void sleep(){
    System.out.println("this 调用sleep方法 ");
    }

    5. 方法

    1)关于方法,有实例方法和类方法之分,这个要看有没有使用static修饰。

    2)含有参数的方法在调用过程中使用的值传递方式,传递的是原有值的复制的值或者是引用。

    3)参数可变的方法private void listBooks(String... books ){}

    对于参数可变的方法,我们可以通过foreach循环获取里面的值:

    private void listBooks(String... books ){
    for(String book:books){
    System.out.println(book);
    }
    }

    4)方法的递归。

    public static int fn(int n)
    {
    if (n == 0)
    {
    return 1;
    }
    else if (n == 1)
    {
    return 4;
    }
    else
    {
    //方法中调用它自身,就是方法递归
    return 2 * fn(n - 1) + fn(n - 2);
    }
    }
    public static void main(String[] args) 
    {
    //输出fn(10)的结果
    System.out.println(fn(10));
    }

    5)方法重载

    方法重载发生在同一个类里,要求是在类里定义了名字相同的方法,但是要求方法的参数列表不同。至于其它的部分,返回值类型和限定修饰符,与重载没有关系。

    public void test(){
    System.out.println("无参数");
    }
    public void test(String msg){
    System.out.println("重载的方法,参数:"+msg);
    }

    6. 成员变量和局部变量

    成员变量分为实例变量和类变量,区别在于是否使用static修饰;其中使用static修饰的变量为类变量,可以使用类名直接访问。

    局部变量是指形参、方法局部变量、代码块中的局部变量。 

    7. 变量的初始化时机

    成员变量的初始化时机: 当系统加载类或者为该类创建实例时,系统会自动为该成员变量分配内存空间,并在分配内存后,自动为成员变量指定初始值。

    加载类时,为类变量指定初始值; 创建类的实例时,为成员变量指定初始值。

    // 类属性
    public static int eyeNum;
    // 实例属性
    public String name;
     
    public static void main(String[] args){
    Person p1 = new Person();
    Person p2 = new Person();
     
    p1.name = "张三";
    p2.name = "李四";
     
    p1.eyeNum =2;
    p2.eyeNum =3;
    }

    对于上面一段代码,如果该Person类是第一次加载进JVM的时候(该类只要使用了也就被加载了),则会先初始化该Person类的eyeNum属性,为该属性分配空间,赋初始值0

    接下来,创建了类的实例p1p2,这个时候,系统会为该实例的属性进行初始化赋值,因为name属性是属于实例的,所以p1namep2name不是一回事(不在同一个内存里哦)。

    可以通过对象去访问类属性,但是,因为类属性是属于类的,所以即使是不同的实例,操作的依然是同一个类属性。 

    局部变量的初始化时机:局部变量必须经过显示初始化才能使用,系统并不会为局部变量执行初始化。局部变量的值存储在方法栈中,栈内存中的变量无需系统垃圾回收,往往随着方法和代码块的运行结束而结束。

  • 相关阅读:
    一万字详解 Redis Cluster Gossip 协议
    Java使用多线程异步执行批量更新操作
    闲鱼是如何实践一套完整的埋点自动化验证方案的?
    OSS 阿里云存储操作实例以及错误案例
    OSS 阿里云存储操作实例以及错误案例
    Java知识体系总结(2021版)
    倪文迪陪你学蓝桥杯2021寒假每日一题:1.11日(2017省赛A第9题)
    七分之一在线评论都有假,人工智能救一把?
    太委屈!曾一举击败英伟达,却因坚持研发背负骂名的国际 IT 大佬
    SpringBoot四大核心之自动装配——源码解析
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330049.html
Copyright © 2020-2023  润新知