类与对象
对象:
万物皆对象,就是现实中一个实体。
其特征如下:对象的标识(名称)唯一
对象的状态(属性)
对象的行为
类:
相当于一个模板,定义了一类事物的状态和行为
类与对象的关系:
类与对象是抽象与具体的关系。类是创建对象的模板,对象是类的具体实例(人类是类,某个具体的人是对象)
类(class)是总称,对象是个体,因此对象(object)也叫实例(instance)。
类与对象小结:需求中提取类,即抽象的过程。
创建一个类就是创建一个新的数据类型,实例化一个类,就得到一个对象。
类是由两个部分构成:成员变量和成员方法。
类的成员变量可以是基本数据类型或者是数组,可以是类的对象。
类的成员方法用于处理该类的数据,是用户与对象之间或者对象之间的接口。
类的定义[类修饰符] class 类名 extends 基类 implements 接口列表{
[数据成员定义]
[成员方法定义]
}
成员变量的定义[修饰符] 变量的数据类型 变量名 [=初始值]
成员方法的定义[修饰符] 返回值类型 方法名([形参说明])[throws 例外名1,例外名2....]{
局部变量声明;
执行语句组;
}
修饰符的比较:
类的设计原则:名字有意义
数据尽量设计为私有属性
变量尽量进行初始化
类的功能尽量单一
对象的生成、使用和清除
构造函数(constructor)
特殊的成员方法,使用new关键字对新创建的对象进行初始化。
特点:和类同名
没有返回值
构造函数实例化类对象的格式:类名 对象名 = new 构造函数(实际参数)
new关键字的作用:为对象分配内存空间
引起对象构造方法的调用
为对象返回一个引用
对象的声明和初始化:用这个类去定义一个对象BoseCatCat BoseCat;
2.用new为其开辟存储空间BoseCat = new Cat();
3.定义类对象并为其开辟空间Cat BoseCat = new Cat();
4.无参构造函数创建对象时,成员变量的值被赋予了数据类型的缺省初始值
各种数据类型的默认值:
每个类中如果没有显式的编写构造函数那么都有一个默认的无参的构造函数,当一个类中给定了指定的构造函数后,那么这个无参的构造函数将消失
对象由两部分组成:对象的实体
对象的引用Person p1 = new Person("Jack","Male",23);
Person p1 = new Person("Jack","Male",23);
Person p2 = p1;
p1和p2指向同一个对象
Person p1 = new Person("Jack","Male",23);
Person p3 = new Person("Jack","Male",23);
p1和p3指向不同的对象
类的静态属性和静态方法
程序运行时的内存占用:代码区(code area)存放程序的代码部分
数据区(>
堆区(heap area) 存放程序动态申请的数据
栈区(stack area)存放程序的局部数据和参数
static: 静态
static 可以修饰类(内部类) 、修饰属性、修饰方法
static修饰的属性:
类属性、类变量、静态变量 可以通过类名直接访问
static修饰的方法:
静态方法、类方法 可以通过类名直接访问静态方法中只能调用静态变量和静态方法
静态代码块与非静态代码块的异同点:
一、相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个。
一般在代码块中对一些static变量进行赋值。
二、不同点:静态代码块在非静态代码块之前进行执行:静态代码块>非静态代码块>构造方法静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new一次就执行一次。public class PuTong {
public PuTong() {
System.out.print("默认构造方法!-->");/
}
// 非静态代码块
{
System.out.print("非静态代码块!-->");
}
// 静态代码块
static {
System.out.print("静态代码块!-->");
}
//静态成员方法
public static void test() {
System.out.println("普通方法中的代码块!");
}
public static void main(String[] args) {
PuTong c1 = new PuTong();
test();
PuTong c2 = new PuTong();/
test();
PuTong c3 = new PuTong();/
test();
}
}
静态代码块拓展:静态代码块只能定义在类里面,它独立于任何方法,不能定义在方法里。
静态代码块里面的变量都是局部变量,只能在本块内有效。
静态代码块会在类被加载时自动执行,而无论加载者是JVM还是其他的类。
一个类中允许定义多个静态代码块,顺序执行。
静态代码块只能访问类的静态成员,而不允许访问实例成员。public class staticBlock {
private static int counter;
private int number;
// 定义一个静态代码块
static {
System.out.println("This is static block.");
counter = 0; //这是一个静态全局变量
int ID=100;// 这是一个局部变量,只在本块内有效
}
// 定义一个普通的main()方法
public static void main(String args[]) {
System.out.println("This is main method.");
System.out.println("counter="+counter);
staticBlock test=new staticBlock();
System.out.println("counter="+test.number);
}
}
访问控制修饰符——JAVA封装
封装可以理解成一个车间制造产品的过程,一般人不需要去关心其生产的过程是什么样的,只关心其成品。在Java中封装是指隐藏对象的属性和实现细节,仅仅对外公开接口。
封装特性是通过访问控制符号来实现的
java访问控制符:public
private
protected
默认
java提供的访问控制范围有四种:同一个类
同一个包
不同包的子类
不同包的非子类
一般情况下:java中的成员变量应声明为private,成员方法应声明为public,构造方法大多数情况下被声明为public,也有时被声明为private。public class Student {
private String name;
private char sex;
protected String birthday;
private int compScore, engScore;
public Student(String name, char sex, String birthday) {
this.name =name ;
this.sex = sex;
this.birthday =birthday ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public void setCompScore(int >) {
compScore = data;
}
public int getCompScore() {
return compScore;
}
public void setEngScore(int data) {
engScore = data;
}
public int getEngScore() {
return engScore;
}
public double getAverScore() {
return (compScore + engScore) / 2.0;
}
public int getMaxScore() {
int max;
if (compScore > engScore)
max = compScore;
else
max = engScore;
return max;
}
public String toString() {
return "姓名" + name + ";性别" + sex + ";出生年月;" + birthday;
}
}public class TestStudent {
public static void main(String args[]) {
Student stu1 = new Student("Mary", "F", "1990.8.8");/
System.out.println(stu1.toString());
stu1.birthday="1990.7.9";
System.out.println(stu1.toString());
stu1.setCompScore(98);
stu1.setEngScore(82);
System.out.println("计算机成绩:" + stu1.getCompScore());
System.out.println("英语成绩:" + stu1.getEngScore());
System.out.println("平均成绩:" + stu1.getAverScore());
System.out.println("单科最高分:" + stu1.getMaxScore());
}
}推荐阅读1. JAVA基础 | java基础2(流程控制)2. Java基础 | java基础1(标识符、关键字、数据类型、类型转换、运算符、变量)