1.类
类是由现实中真实存在事务抽象归类而来
类组成部分:属性,方法,代码块,内部类
[类修饰符] class 类名{
类的成员
...
}
简例
public class Demo {// 首字母大写命名
public int a;//属性 驼峰命名
public void show(){//方法 驼峰命名
}
//内部类
class D{
}
//代码块
{
System.out.println("执行了 Demo类中的 代码块!!!");
}
}
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.定义类的步骤
- 定义私有属性
- 提供两个构造方法(有参,无参)
- 提供get/set方法
- 定义其他方法
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);
}
}