类与对象

定义类

class 类名称{
属性名称;
返回值类型
方法名称(){}
}

定义对象

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

访问类中的属性或方法

声明对象:Horse horse;
// 表示声明了一个对象,但是此对象无法使用,horse没有具体的内存指向
实例化对象:new Horse() ; // 表示实例化了对象,可以使用
实例化对象:horse = new Horse() ;
//通过对象调用方法: horse.eat()
//匿名对象调用方法: new Horse().eat
访问类中的属性:
对象.属性 ;
调用类中的方法:
对象.方法() ;

对象内存分析

1、new 关键字表示创建一个对象
2、new 关键字表示实例化对象
3、new 关键字表示申请内存空间
注意:如果使用一个没有申请内存空间的对象,会报空指针异常: java.lang.NullPointerException

对象必须被实例化之后才能使用
对象间的引用传递,实际上传递的是堆内存空间的使用权

对象的封装

1、封装性是面向对象思想的三大特征之一。
2、封装就是隐藏实现细节,仅对外提供访问接口。 封装有: 属性的封装、方法的封装、类的封装、组件的封装、模块化封装、系统级封装
二、封装的好处 1、模块化 2、信息隐藏 3、代码重用 4、插件化易于调试 5、具有安全性
封装缺点: 会影响执行效率
封装之前:

  1. class Person{
  2. String name;
  3. int age;
  4. }

封装之后:

class Person{ 
 //属性是成员变量 
    private String name; 
    private int age; 
    //参数及方法内定义的变量是局部变量 
    public void setName(String name){ 
        this.name = name;} 
    public String getName(){ 
        return name;} 
}

成员变量和局部变量

1、在类中的位置不同
成员变量:在类中定义 局部变量:在方法中定义或者方法的参数
2、在内存中的位置不同
成员变量:在堆内存(成员变量属于对象,对象进堆内存)
局部变量:在栈内存(局部变量属于方法,方法进栈内存)
3、生命周期不同
成员变量:随着对象的创建而存在,随着对象的销毁而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
4、初始化值不同
成员变量:有默认初始化值,引用类型默认为null
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用
注意: 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。

构造方法

1、构造方法就是类构造对象时调用的方法,用于对象的初始化工 作 2、构造方法是实例化一个类的对象时,也就是new 的时候,最先调用的方法。

构造方法重载:
无参构造方法:
public Dog(){}
带一个参数的构造方法:
public Dog(String name){
this.name = name;
}
带多个参数的构造方法:
public Dog(String name,int age){
this.name = name;
this.age = age;
}

(1)构造方法名称与类名相同,没有返回值声明(包括 void)
(2)构造方法用于初始化数据(属性)
(3)每一个类中都会有一个默认的无参的构造方法
(4)如果类中有显示的构造方法,那么默认构造方法将无效
(5)如果有显示的构造方法,还想保留默认构造 方法,需要显示的写出来。
(6)构造方法可以有多个,但参数不一样,称为构造方法的重载
(7)在构造方法中调用另一个构造方法,使用this(…),该句代码必须在第一句。
(8)构造方法之间的调用,必须要有出口。
(9)给对象初始化数据可以使用构造方法或setter方法,通常情况下,两者都会保留。 (10)一个好的编程习惯是要保留默认的构造方法。(为了方便一些框架代码使用反射来创建对象)
(11)private Dog(){},构造方法私有化,当我们的需求是为了 保正该类只有一个对象时。 什么时候一个类只需要一个对象?比如,工具类(没有属性的类,只有行为)并且该工具对象被频繁使用。 权衡只用一个对象与产生多个对象的内存使用,来确定该类是否要定义为只需要一个对象。

this关键字

在Java基础中,this关键字是一个最重要的概念。
使用this关键字可以完成以下的操作:
调用类中的属性
调用类中的方法或构造方法
表示当前对象
image.png
image.png

值传递与引用传递

值传递

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 RefDemo1{
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;
}
}
class Duck{
int age = 2; //省略封装
}