1、Java面向对象
简单理解为OOA、OOD和OOP,即面向对象分析(Object-Oriented Analysis)、面向对象设计(Object-Oriented Design)、面向对象编程(Object Oriented Programming)。相信不难想到,要想完成OOP必须经历OOA和OOD;即通过分析用户需求从需求出发,提取抽象出Java中的类(class),通过开发者权衡协调各个类的关系进行设计,最后通过Java语言完成面向对象的程序设计(面向对象编程/OOP);(还有三大特征,继承,封装,多态)
2、关于对象
对象(object),一个实实在在存在的个体(你的客户、你的甲方粑粑),把具有共性的对象汇聚在一起,他们是一类有共同特征的人(对你提无理要求的人),这时开发者就可以把这类人抽象为一个类(class).也就是说类是按图索骥的“图”,对象是按图索骥的“骥”,国画注重写意,类也是,是抽象的,不具体的,代表具有类中共性的一个集合,而对象是具体的,就是可以找到的“千里马”。
类(class),由成员方法、成员属性和构造方法组成,其中成员方法是对具体的对象的共有行为的描述,成员属性则是对具体的对象共有属性的描述。
2.1 构造方法
//下面是一个简单定义的类
public class Student {
private int id;
private String name;
//无参的构造方法
//其中系统默认的构造方法是无参的,但是如果开发者设计了有参的构造方法
//那么系统默认的无参构造方法将被覆盖掉,即没有无参的构造方法
//此时如果我们需要我们应该在构造方法中加上这个无参的构造方法
//有参的构造方法
public Student(){
}
public Student(int id,String name){
this.id = id;
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Student std = new Student(6,"jzh");//有参的
std.setName("Uzi");
System.out.println(std.id);
System.out.println(std.name);
Student std1 = new Student();//无参的
System.out.println(std1.id);
System.out.println(std1.name);
}
}
/*
6
Uzi
0
null
*/
//Person类未自行定义构造方法
public class Person {
private String name;
private int id;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
//测试类
public class PersonTest {
public static void main(String[] args) {
Person person = new Person();
person.setId(006);
person.setName("Uzi");
System.out.println(person.getId() + " " + person.getName());
}
}
/*
6 Uzi
*/
//从上述代码我们可以看出在没有自行定义构造函数的时候,类中应该是默认存在一个无参的构造方法的即Person()
关于构造方法的定义和性质:
1、构造方法的方法名和所在的类名是一致的
2、构造方法没有返回值
3、构造方法可以有参数,也可以没有参数,它是一个重载了的方法,它的参数最少可以是零,最多是成员属性所 具有的个数,超出成员属性个数就无法通过编译。
4、当构造方法具有参数时,它的参数列表应该和成员属性的参数类型相对应(匹配)
关于构造方法的作用
1、在堆内存中生成对象,并对成员属性赋值
2、如果是无参的构造方法,不同数据类型的成员属性将会被赋上不同的初始值(即默认值)
也就是说只有在构造方法被执行后才会生成对象且对对象赋上初试值,由此可见构造方法是十分重要的
//就以下代码模拟在JVM虚拟机上构造方法的实现
public class User {
private String name;
private int id;
}
public class UserTest {
public static void main(String[] args) {
User user = new User();
}
}
//即在没有其他操作的过程中,我们通过系统默认的构造方法(无参构造方法)所new的对象在,由系统在堆内存空间中分配
//地址和与成员属性相匹配的空间大小并赋值
//下面是通过getId()和getName()拿到的user.id和user.name的值(注意user是引用而不是对象本身)
public class User {
private String name;
private int id;
public int getId() {
return id;
}
public String getName() {
return name;
}
}
public class UserTest {
public static void main(String[] args) {
User user = new User();
System.out.println(user.getId());
System.out.println(user.getName());
}
}
/*输出结果
0
null
*/
2.2成员属性和成员方法
//下面是一个关于Student的类和测试类
import java.util.Scanner;
//-------------------------------成员属性
public class Student_classTest {
private String name;//名字 成员属性
private int age;//年龄 成员属性
private String id;//学号 成员属性
private boolean sex;//性别 成员属性
private int grade;//考试分数 成员属性
//Scanner sc;
//-------------------------------set 和 get 方法
public void setGrade(int grade){
//this.grade = sc.nextInt();
this.grade = grade;
}
public int getGrade() {
return grade;
}
public void setName(String nameStd){
this.name = nameStd;
}
public String getName() {
return name;
}
//-------------------------------成员方法
public void test(int grade1){
if(grade1 < 60 && grade1 >= 0){
System.out.println("恭喜你再来一次,并且获得了完美的大学生活");
}else if(grade1 <= 100){
System.out.println("你的大学生活到目前为止是不完美的");
}else {
System.out.println("别乱搞");
}
}
/*public Student_classTest(){
this.sc = new Scanner(System.in);
}
*/
}
//-------------------------------测试类
public class Test {
public static void main(String[] args) {
Student_classTest start = new Student_classTest();
start.setName("爽爽");
System.out.println(start.getName());
start.setGrade(100);
start.test(start.getGrade());
}
}
//运行结果
/*
爽爽
你的大学生活到目前为止是不完美的
*/
//下面展示"爽爽"赋值给对象在JVM上的模拟概念图
//Student_classTest start = new Student_classTest();运行到此的内存模拟概念图
//start.setName("爽爽");
//运行到此的内存模拟概念图
/*在上述的代码中我们还使用了getxxx()和setxxx()的方法,我们通过这种方法实现对私有的成员属性的操作
当然对于private修饰的成员属性应该通过在与之在同一个类中的public修饰的方法实现在这个类外部调用。
这也体现了Java对于数据的安全性。*/
// User类中有Student类型的成员属性,Student类中有Address类型的成员属性,Address类中有String addressName 成员属性。
// 要求成员属性是private的,要求写get、set方法来操作和访问成员属性。
/* 现对上述内容实现代码实现 */
//-------------------User类
public class User{
Student student1 = new Student();
}
//-------------------Student类
public class Student{
Address name2 = new Address();
}
//------------------Address类
public class Address{
private String addressName;
public void setAddressName(String addressName) {
this.addressName = addressName;
}
public String getAddressName() {
return addressName;
}
}
//-------------------测试类
public class Test {
public static void main(String[] args) {
User user = new User();
user.student1.name2.setAddressName("花花");
String resultName = user.student1.name2.getAddressName();
System.out.println(resultName);
}
}
//下面是在内存中的概念图
由上面的代码和要求我们可以知道User类型中有一个Student类型的成员属性(变量),
而这个Student变量中又有Address类型的成员属性,最后Address类型中有一个private修饰的String类型的成员属性,
因为User、Student和Address都是一种自定义的类型所以在使用的时候都选择了new一个,在上述的代码中也体现了,
最后我们在对private修饰的成员属性操作时,也是在该成员属性所属的类中定义了setxxx()和getxxx()方法来进行操作,
其中的构造方法是采用了系统默认的无参构造方法。