第六章 面向对象基础(20210622-20210624)

1.类

类是由现实中真实存在事务抽象归类而来
类组成部分:属性方法代码块内部类

[类修饰符] class 类名{
       类的成员
       ...  
}

简例

public class Demo {// 首字母大写命名
    public int a;//属性 驼峰命名
    public void show(){//方法 驼峰命名
    }
    //内部类
	class D{
	}
	//代码块
	{
		System.out.println("执行了 Demo类中的 代码块!!!");
	}
}
2.属性
  • 属性也叫成员变量,全局变量

  • 属性定义在类中,方法外
    在本类的方法中可以直接使用属性名,对该属性进行操作

  • 属性声明后有默认值
    属性的默认值与数组的默认值相同,因此属性即使不赋值直接使用也不会报错。

3.局部变量
  • 在方法体中定义的变量,方法的形参都是局部变量
  • 局部变量仅限在当前方法中使用
  • 局部变量没有默认值 使用前必须赋值
4.局部变量和属性区别与联系
  1. 定义位置不同
    局部变量定义在方法中,必须在调用前定义;
    属性定义在类中,可以定义在类的任何位置
  2. 默认值不同
  3. 适用范围不同
  4. 在sts中颜色不同
    属性:蓝色
    局部变量:褐色

允许在方法体中定义与属性同名的局部变量,但在方法体内部访问时局部变量优先级高,如果一定要访问属性时,在变量名前加this.。(此处可以解释set()方法,this.作用)

5.创建对象
类名   对象名 = new   类名();

创建类是不占用内存
创建对象后才占用内存

  • 匿名对象
    没有对象名的对象,一般方法或者属性只执行一次的时候利用匿名对象
    下例为两只不同的狗狗,且第一只狗狗吃完就找不到了,第二只睡饱也找不到了。
    所以也就是说匿名对象使用后就会变成垃圾
new Dog().eat();
new Dog().sleep();
6.垃圾回收机制

垃圾回收机制是将无法使用的对象或数组所占用的内存空间回收。
在这里插入图片描述
如何判断是否为垃圾?
答:某一个对象或数组的地址没有被任何一个引用变量所存储,它既是垃圾对象。

  • 生命周期结束(for循环)
  • 匿名对象

在java虚拟机中有一个回收的程序,负责回收垃圾对象
只有当堆区空间达到临界值时,才会启动垃圾回收

7.构造方法/构造器Constructor
类名   对象名 = new   构造方法();
构造器特点
  • 构造方法 与 类 同名
    注意:普通方法也可以与类同名,但是定义普通方法时必须声明返回值类型
  • 定义方法时,不写返回值类型(也没有void)
  • 不能用return返回一个值,但是可以写return
构造器の豆知識

1.在Java中,每个类都至少要有一个构造器
如果程序员没有定义构造器,编译阶段会默认增加一个无参空构造器;如果程序员定义了一个构造器,java默认的无参空构造器就不在提供了。
在实际应用中一个类最好定义两个构造器:
一个无参空构造器

	public Pet(){
	}

一个有参构造器(通过参数的传递给属性赋初值

	public Pet(String name, String breed) {
		//super();
		this.name = name;
		this.breed = breed;
	}

2.sts可以自动生成构造方法
无参构造器:
//右键→source→Generate Constructor from supperclass
有参构造器:
//右键→source→Generate Constructor using Fields

3.构造方法可以像普通方法一样发生重载
与普通方法相同,要求参数不同。

4.在无参构造器中调用重载的有参构造器
作用:可以在对象调用无参构造器后,给属性赋一个合理的初值
注意:只能在本类的构造方法中,调用其他重载的构造方法。使用this关键字,并且代码只能在构造方法的第一行

	public Pet() {
		
		this("无","无");//必须在第一行
		
	}
	public Pet(String name, String breed) {
		//super();
		this.name = name;
		this.breed = breed;
	}


8.包名规范
  • 包名是反向域名
    例:com.neusoft.javase.ch06
    com:company(cn:china,jp:japanse…)
    neusoft:公司名-东软
    javase:项目名-java基础项目
    ch06:模块名-第六章
  • 可以通过import关键字导包。
  • java.lang包不需要导包。
  • 如果想要使用与当前包下同名的其他包的类,需要import到具体的类名。
9.封装
封装的意义:隐藏属性,公开方法
  • 使用private修饰属性,使属性在非本类不能直接访问
  • 对外提供get/set方法用于修改属性。在使用set方法为属性赋值时,可以通过控制语句判断该赋值是否合理,对于赋值可以进行人为干预以避免不合法数据的输入。
  • 封装是对数据(成员属性,局部变量)的保护
  • 访问权限控制(封装关键字)是用来控制封装强弱的强度
	public void setAge(int age) {
		if(age>=18 && age <=60) {//员工年龄
			this.age = age;
		} else {
			System.out.println("年龄输入错误");
		}
	}
封装关键字

在这里插入图片描述

10.定义类的步骤
  1. 定义私有属性
  2. 提供两个构造方法(有参,无参)
  3. 提供get/set方法
  4. 定义其他方法
11.静态(static)
  • static修饰属性
    被static修饰的属性被称为静态变量或类变量
    注意:static不可以修饰局部变量,也就是static只能修饰中的成员
    静态属性意义:全类所有对象共享整个类只需要一个数据时,要定义成静态属性。
    静态属性可以通过‘’类 . 属性名‘’ 来访问。
public class Chinese{
	static String country = "中国"...
}
	main() {
		Chinese.country = "china";
	}
	//起来....

如果一个类定义了静态属性,则虚拟机就会在方法区开辟空间存储静态属性,在类加载时就存储,且只存一次,后续建立对象时不再存储,所以静态属性在内存中只有一个空间。

  • static修饰方法
    被static修饰的方法不用创建对象,可以通过’’类 . 方法‘’直接调用。
    注意:
    1.静态方法不能访问非静态属性(由于加载静态方法时,非静态属性还没有加载,所以访问不到)。
    2.static不能修饰构造器
    3.静态方法只能访问静态属性和方法
    静态方法意义:工具类方法一般都是静态方法
public class Chinese{
	...
	public static void sing() {
		System.out.println("起来....");
	}
	...
}
	main() {
		Chinese.sing();
	}
	//起来....
  • static修饰代码块
    被static修饰的代码块被称为静态代码块
    当类被加载时(也就是系统第一次运行这个类的时候),静态代码块运行,且只运行一次(由于加载类也只加载一次)。由于静态代码块在类加载时运行,所以静态代码块优先于所有关于该类的运行。
	static {
		System.out.println("chinese 类 加载完毕,可以放心使用");
	}

在这里插入图片描述

12.作业小提示

该方法需要改变属性值时需要传参,否则不需要传参
下列的getArea(),getPer(),showAll()都不需要改变属性值,所以不传参数

package com.neusoft.javase.ch06.homework;
/*
 * 2、定义一个矩形类Rectangle:
 * 2.1  定义三个方法:getArea()求面积、getPer()求周长,showAll()分别在控制台输出长、宽、面积、周长。
 * 2.2  有2个属性:长length、宽width
 * 2.3  通过构造方法Rectangle(int width, int length),分别给两个属性赋值
 * 2.4  创建一个Rectangle对象,并输出相关信息
*/
public class Rectangle {
	
	int length ;//长度
	int width ;//宽度
	
	public Rectangle() {
		super();
		// TODO Auto-generated constructor stub
	}

	public int getLength() {
		return length;
	}

	public void setLength(int length) {
		if(length>0) {
		this.length = length;
		}else {
			System.out.println("矩形长度不能小于0");
		}
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		if(width>0) {
		this.width = width;
		}else {
			System.out.println("矩形宽度不能小于0");
		}
	}

	public Rectangle(int length, int width) {
		super();
		this.length = length;
		this.width = width;
	}
	
	//该方法需要改变属性值时需要传参,否则不需要传参
	//下列的getArea(),getPer(),showAll()都不需要改变属性值,
	//所以不传参数
	
	public int getArea(){
		//求面积
		return  length * width;
	}
	
	public int getPer(){
		//求周长
		return  2*(length + width);
	}
	
	public void showAll() {
		//输出长、宽、面积、周长
		int area = getArea();//面积
		int perimeter = getPer();//周长
		System.out.println("这个长方形的长是"+length);
		System.out.println("这个长方形的宽是"+width);
		System.out.println("这个长方形的面积是"+area);
		System.out.println("这个长方形的周长是"+perimeter);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值