小白学习JavaSE-day05-类与对象

一、数组的内容图解

1、内存模型

在通过JVM中的java命令启动JVM之后,首先JVM会在内存中划分5片区域。

  • 栈:它的主要功能是负责方法运行。方法进入栈内存(方法压栈),方法执行完出栈(方法弹栈)
  • 堆:只要是通过new关键字创建出来的都在堆中,并且堆中的空间必须有初始化默认值。
  • 方法区:主要存储class字节码、各种常量池
  • 本地方法区:只要运行JVM与系统之间交互等相关的方法
  • 寄存器:高速缓存,提供给CPU使用。

2、数组内存图

class Demo
{
    public static void main(String[] args)
    {
        int x = 123;
        int[] arr = new int[5];
        System.out.println(arr);
        arr[0] = 1;
        arr[1] = 11;        
    }
}

在这里插入图片描述

二、面向对象基础

1、什么是面向对象

面向对象:它是思考问题的方式。在遇到问题(需求)时不要先考虑自己如何去一步一步的实现,而是寻求有没有已经存在的解决方案,复用这些方案达到预期的目标。

面向过程:在实现需求的过程中,自己参与到其中每个步骤。

2、Java中的类和对象

在Java中任何的程序都必须放在类中。

2.1、类

在Java中使用类来封装(描述)生活中的某些事物(个体)。

如果需要用类描述某个群体,需要分析这个群体一些共性的特点:

  • 属性:表示群体共性的某个特征值
  • 行为:群体共性的一个动作

例如:分析Person

  • 属性:年龄、身高、性别等等
  • 行为:吃饭、睡觉、打豆豆

分析之后,所有的属性使用变量(定义在类成员位置上)表示行为使用方法表示

public class Student {
	//	年龄
	int age;
	//	姓名
	String name;
	//	成绩
	double score;
	
	//	学习
	public void study() {
		System.out.println("good good study day day up");
	}
	//	休息
	public void sleep() {
		System.out.println("sleep...........");
	}
}

2.2、对象

使用class定义了类,需要通过Java中的new 关键字创建出来类的一个实例(个体、对象instance),才能去调用类中定义的属性或行为。

public class StudentTest {
	public static void main(String[] args) {
		int x = 123;
		//	需要使用某个类,必须先new对象
		Student s = new Student();
		s.age = 23;
		s.name = "张三";
		
		s.study();
		s.sleep();
		
	}
}

2.3、类和对象的关系

类:对象抽象的描述,描述群体共性特点的。

对象:类的实例化,基于模板而创建出来最终在程序被使用的。

2.4、对象的内存图

public class StudentTest {
	public static void main(String[] args) {
		int x = 123;
		//	需要使用某个类,必须先new对象
		Student s = new Student();
		s.age = 23;
		s.name = "张三";
		s.study();
		s.sleep();
	}
}

在这里插入图片描述

只要基于某个类创建对象,堆内存中会分配这个对象的空间,同时类中的所有的属性(成员变量)都会在当前的对象所在的堆内存中开辟空间。

3、值传递和引用传递区别

public class Test {
	public static void main(String[] args) {
		Demo d = new Demo();
		System.out.println("d.x =" + d.x);
		method( d , d.x );
		System.out.println("d.x =" + d.x);
	}
	public static void method( Demo d , int x ) {
		x += x;
		d.x = d.x + 100;
	}
}

方法传递参数:

  • 如果传递的具体的数据,那么在方法中有变量接受到这个数据之后,不管在方法中如何去处理这个数据,对原始的变量中的数据没有。
  • 如果传递的是数据所在的地址(引用),这是在方法中可以通过地址(引用)去操作指定空间中的数据,会对原始数据产生影响。

4、private关键字

面向对象三大特征:封装、继承、多态。

封装:将不需要外界使用的内容全部隐藏起来,对外只提供部分访问的接口。

Java中封装的体现:

类:本身就是一个封装体,将某个群体属性、行为等进行包裹。然后外界可以通过new对象,去使用类中的属性和行为。

方法:将某些特定功能的代码进行封装,然后再需要的时候调用。

封装:尽可能将所有细节隐藏,需要对外暴露如何使用的接口。

一个类中如果要隐藏不需要外界访问的内容,需要使用权限访问修饰符private。

public class Person {
	private int age;
	private char sex;
	// alt + shift + s
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public char getSex() {
		return sex;
	}
	public void setSex(char sex) {
		this.sex = sex;
	}
}

类中不需要外界直接访问的内容(变量和方法)都需要被private。

private修饰的变量或方法,只能在本类中使用,类以外的其他程序中都无法直接使用。

如果类中的成员变量被private修饰了,一般都要求针对这些成员变量提供相应的setter或getter方法。

class Student{
    private String name;
    
    public void setName( String nm ){ name = nm; }
    public String getName() { return name; }
}

5、构造方法

5.1、构造方法演示

构造方法的定义格式:

修饰符  类名( 数据类型  变量名, 数据类型  变量名,........... )
{
    方法体;    
}

构造方法方法要求:

  • 方法名必须和类名一致
  • 不能书写任何的返回值类型(void也不行)
/*
 * 	使用Person表人这类群体,但是实际生活中只要有人存在
 * 	那么必须会有年龄和性别
 */
public class Person {
	//	表示姓名
	private String name;
	// 	性别
	private String sex;
	// 	年龄
	private int age;
	//	构造方法
	public Person( String nm , String s , int a ) {
		System.out.println("............");
		name = nm;
		sex = s;
		age = a;
	}
	
	public void say() {
		System.out.println("name = " + name + ",age = " + age + ",sex = " + sex);
	}	
}
public class PersonTest {
	public static void main(String[] args) {
		//	创建Person对象
		Person p = new Person( "张三" , "男" ,44 );
		System.out.println(p);
		p.say();
	}
}

5.2、构造方法使用

在创建对象的过程中,如果对象需要明确具体的成员变量的数据,那么就可以通过构造方法完成。

构造方法是在对象new的过程中被JVM调用的。并且将相关参数传递给与之对应的构造方法,进而完成成员变量的赋值操作。
在这里插入图片描述

5.3、构造方法练习

需求:描述矩形,提供计算面积的方法。

/*
 * 	需求:描述矩形,提供计算面积的方法。
 *	分析:
 *		图形只要被创建,一定会携带一些固有的初始化参数(矩形:长和宽)
 *		
 */
public class Rectangle {
	private double width;
	private double length;
	
	public Rectangle( double  w , double len ) {
		width = w ;
		length = len;
	}
	
	public double getArea() {
		return width * length;
	}	
}
/*
 * 	测试类型
 */
public class RectangleTest {
	public static void main(String[] args) {
		Rectangle r = new Rectangle( 3 , 5 );		
		double area = r.getArea();
		System.out.println(area);
	}
}

5.4、构造方法使用细节

  • 构造方法在创建对象过程中执行,对象创建好之后是否可以手动调用构造方法。不可以。因为构造方法只是在构建对象时执行。

  • 构造方法的方法名必须与类名一致,那么如果将一个一般的方法名书写为类名会怎样?程序运行存在,这个方法就是一个普通的方法,也可以在创建好对对象之后被调用,但是开发中不建议这么写。

  • 一个类中是否可以存在多个构造方法?可以,它们是以重载的形式存在。

    public class Rectangle {
    	private double width;
    	private int length;
        public Rectangle( double w ) {
            width = w;
        }
        public Rectangle( int len ) {
            length = len;
        }
        public Rectangle( double  w , int len ) {
            width = w ;
            length = len;
        }
    }
    

    可以保证以不同形式创建出这个类的对象,并进行初始化操作。

  • 在构造方法中能不能调用一般的方法?能。直接通过方法名调用。

5.5、默认构造方法

任何一个类如果不手动添加任何的构造方法,在编译之后编译器会自动的给class文件中添加一个空参数的公开的构造方法。

如果一旦人为给类中提交了构造方法,那么编译之后不会再生成默认构造方法。

public class Student {
	private String name;
	private int age;
	
	public Student() {
	}
	
	public Student(String nm , int a) {
		name = nm;
		age = a;
	}
}

6、this关键字

6.1、this介绍

this:它在程序表示的是一个对象。可以将其理解为一个引用变量。

public class Student {
	private String name;
	private int age;
	
	public Student() {
		System.out.println(this);
	}
	public Student(String nm , int a) {
		name = nm;
		age = a;
	}
	public void say() {
		System.out.println("say == ==" + this);
	}
}

当某个方法被执行的时候,一定是通过对象调用的,这时方法中有个隐藏的this关键字来记录当前具体调用的那个对象。谁调用方法,this就是谁。

6.2、this的使用场景

  • 区分局部变量和成员变量同名 (成员变量:this.变量名 )
  • 调用本类的其他方法 (调用一般法方法:this.方法名( ) )
  • 调用本类的其他构造方法 (调用构造:this( ) )
    • 如果通过this调用本类其他构造方法,必须放在构造方法中的第一行。
    • 一个类如果有多个构造方法,不能形成嵌套调用。在一个类中肯定有一个构造方法中不会存在this调用别的构造方法。

7、匿名对象

7.1、匿名对象介绍

创建的对象,但是没有赋值给任何的引用。这个对象属于匿名对象。

public class Demo {
	int x = 12;
	
	public void run() {
		System.out.println("run..... x = " + x);
	}
}
public class Test {
	public static void main(String[] args) {
		
		//	d是一个引用变量,存放的Demo对象的地址(引用)
		Demo d = new Demo();
		d.x = 22;
		//	通过d引用操作对象
		d.run();
		
		//	下面直接创建Demo对象,没有将对象的引用赋值给任何变量
		//	只要程序执行过去了,当前的对象立刻就变成垃圾
		new Demo().x = 33;
		new Demo().run();
	}
}

7.2、匿名对象使用场景

  • 在方法传递参数的时候,需要一个对象

  • 如果类的对象只使用一次,以后不再使用

  • 如果程序中大量匿名对象,会导致程序中的垃圾对象变多,匿名对象只要使用结束,就称为垃圾

    public class Test {
    	public static void main(String[] args) {
    		method( new Demo() );
    		
    		new Demo().run();
    	}	
    	public static void method( Demo d ) {
    		
    	}
    
    }
    

7.3、垃圾回收

在JVM中有一个垃圾回收机制gc。它是一个不定时执行的程序,在适当的时间会自动的启动,扫描内存中的垃圾并自动清理。可以通过程序手动的通知垃圾回收机制收垃圾,但是也不一定立刻就收。

System.gc( ) ; // 通知垃圾回收器收垃圾

一般开发中,只关注具体业务实现,垃圾交给JVM处理。

7.4、强制将一个对象变成垃圾

public class Test3 {
	public static void main(String[] args) {
		Demo d = new Demo();
		d.x = 123;
		d.run();
		
		//	其他逻辑
		//	将引用赋值给null,引用不再指向任何的对象,对象就成为垃圾
		d = null;
	}
}

8、总结

1、分析相关的事物特点,然后总结共性内容

2、使用Java中的类描述这个事物:

​ 事物的属性:使用类中的成员变量表示

​ 事物的行为:使用类中的方法表示

3、通过new关键字创建这个类的对象,调用类中的相关属性或者方法

4、如果一个类的对象在创建过程中需要明确具体的初始化参数,需要给这个类中提供相关的构造方法。

5、类中的所有成员变量应该private,然后提供getXxx或setXxx方法

6、this关键字:1)区分成员变量和局部变量同名;2)调用类中其他方法;3)调用本类其他构造方法

9、思考:

类中已经书写了相关的构造方法,对成员变量进行初始化,那么是否可以省略setXxx方法呢?


public class Person {
	private String name;
	private int age;
	
	public void setName(String name) {
		this.name = name;
	}
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public Person() {
	}
	
	public void run() {
		System.out.println("name = " + name);
	}
}

public class Test4 {
	public static void main(String[] args) {
		
		Person p = new Person( "9527" , 11 );
		p.run();
		//	下面的代码是重新new了一个新的对象,并不是给上面的Person对象改名	
		//p = new Person( "小书童" , 11 );
		//p.run();
		p.setName("小书童");
		p.run();
	}
}

构造方法:是在对象创建的时候给成员变量进行初始化操作。

setXxx方法:是在对象已经创建完成(已经存在),然后给成员变量修改数据。

String name, int age) {
		this.name = name;
		this.age = age;
	}
	public Person() {
	}
	
	public void run() {
		System.out.println("name = " + name);
	}
}

public class Test4 {
	public static void main(String[] args) {
		
		Person p = new Person( "9527" , 11 );
		p.run();
		//	下面的代码是重新new了一个新的对象,并不是给上面的Person对象改名	
		//p = new Person( "小书童" , 11 );
		//p.run();
		p.setName("小书童");
		p.run();
	}
}

构造方法:是在对象创建的时候给成员变量进行初始化操作。

setXxx方法:是在对象已经创建完成(已经存在),然后给成员变量修改数据。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值