1、面向过程和面向对象的区别
面向过程:
面向对象:
C语言是纯面向过程的、C++是半面向对象的、java是纯面向对象的
面向对象更加符合人的思维方式
采用面向对象的编程语言开发一个软件,生命周期当中:
【1】类:
【2】对象:
【3】实例化与抽象:
语法结构:
[修饰符列表] class 类名{
属性;
方法;
}
学生类,描述所有学生对象的共同特征:
学生类属于引用数据类型,不属于基本数据类型。
1、学生对象有哪些状态信息:
2、学生对象有哪些动作信息:
重点:属性通常是采用一个变量的形式来完成定义的
在这里插入代码片
引用数据类型:
String.class 【SUM提供的】
Student.class 【SUM提供的】
User.class 【程序员自定义的】
Product.class 【程序员自定义的】
Customer.class 【程序员自定义的】
......
类体=属性+方法
实例化对象的语法:
new 类名();
public static void main(String[] args) {
//Student是一个引用数据类型
//s是一个变量名,是引用,里面存放的是对象在堆内存当中的地址
//new Student()是一个学生对象
Student s=new Student();
}
数据类型 | 默认值 |
---|---|
byte,short,int,long | 0 |
float,double | 0.0 |
boolean | false |
char | \u0000 |
引用数据类型 | null(和void不同,void的返回值类型为空) |
引用:引用是一个变量,只不过这个变量当中保存了另一个java对象的内存地址
java程序员要访问堆内存当中的数据,必须通过引用
访问实例变量的语法格式:
读取数据:引用.变量名
修改数据:引用.变量名 = 值
public static void main(String[] args) {
//Student是一个引用数据类型
//s是一个变量名
//new Student()是一个学生对象
Student s=new Student();
int stuNo=s.no;
String stuName=s.name;
int stuAge=s.age;
boolean stuSex=s.sex;
String stuAddr=s.address;
//修改内存
s.no=10;
s.name="jack";
s.age=20;
s.sex=true;
s.address="北京";
//再通过类实例化一个全新的对象
//stu是一个引用,同时也是一个局部变量
//Student是变量的数据类型
Student stu=new Student();
}
//此时编译报错,因为no这个实例变量不能直接采用类名的方式访问
//no是实例变量,对象级别的变量,变量存储在java内部,必须先有对象
//需要通过对象才能访问no这个实例变量
System.out.println(Student.no);
//测试类
public class OOTest2 {
public static void main(String[] args) {
//创建User对象
User u=new User();
//修改User对象内部实例变量的值
u.no=100;
u.name="jack";
u.addr=new Address();
u.addr.city="北京";
u.addr.street="朝阳";
u.addr.zipcode="10001";
System.out.println(u.name+"居住在哪个城市:"+u.addr.city);
}
}
1、JVM(JAVA虚拟机)主要包括三块内存空间,分别是:栈内存,堆内存,方法区内存
2、堆内存和方法区内存各有一个,一个线程一个栈内存
3、方法调用的时候,该方法所需要的内存空间在栈内存中分配,称为压栈。方法执行结束之后,该方法所属的内存空间释放,称为出栈。
4、栈中主要存储的是方法体当中的局部变量
5、方法的代码片段以及整个类的代码片段都被存储到方法区内存当中,在类加载的时候这些代码片段会带入
6、在程序执行过程中使用new运算创建java对象,存储在堆内存当中,对象内部有实例变量,所以实例变量存储在堆内存当中
7、变量的分类:
8、静态变量存储在方法区内存当中
9、三块内存当中,最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收器主要针对的是堆内存
10、垃圾回收器:
空引用访问实例相关的数据,一定会出现空指针异常:java.lang.NullPointerException
实例相关的数据:表示这个数据访问的时候必须有对象的参与。这种数据就是实例相关的数据。
public class OOTest2 {
public static void main(String[] args) {
//创建User对象
User u=new User();
System.out.println(u.no);
u=null;
System.out.println(u.no);
}
}
1、所有属性私有化,使用private关键字进行修饰,private表示私有的,修饰的所有的数据只能在本类当中访问。
2、对外提供简单的操作入口,也就是说,外部程序想要访问age属性,必须通过这些简单的入口进行访问
3、一个属性通常的访问包括两种访问形式:
第一种方式:读取这个属性的值【get】
第二种方式:修改这个属性的值【set】
1、set方法的命名规范
pulic void set+属性名首字母大写(形参){
}
public void setAge(int a){
age=a;
}
2、get方法的命名规范
pulic void get+属性名首字母大写(形参){
}
public void getAge(){
return age;
}
注意:
public class User {
private int age;
//set方法没有返回值,因为set方法只负责修改数据
public void setAge(int a){
if(a<0||a>150){
System.out.println("输入的年龄不合法");
return ;
}
age=a;//java的就近原则
}
public int getAge(){
return age;
}
}
public class UserTest {
public static void main(String[] args) {
//创建User1对象
User1 u=new User1();
//修改
u.setAge(100);
//读取
System.out.println(u.getAge());
}
}
需求:
定义一个计算机类【电脑/笔记本】,计算机类有哪些属性:
定义一个学生类,学生类有哪些属性:
请编写程序来表示以上的类,然后分别将类创建为对象,对象的数量不限,然后让其中的一个学生去使用其中的一台笔记本电脑。
class Computer {
String label;
String type;
String color;
}
class Student {
int no;
String name;
Computer c;
}
public class Test {
public static void main(String[] args) {
Student s=new Student();
Computer c=new Computer();
c.label="ThinkPad";
c.type="big";
c.color="yellow";
s.no=123;
s.name="susie";
/* s.c.color="black";
s.c.label="ThinkPad";
s.c.type="medium";*/
System.out.println(s.name+"使用"+s.c.color+"的"+s.c.type+"大小的"+s.c.label);
}
}