欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 面向对象

程序员文章站 2022-06-07 20:10:10
...

面向对象

  1. 在实际开发当中,我们还需要存储其他的数据那么我们该怎么做呢?

  2. 我们学习编程语言,就是为了模拟现实世界的事物,实现信息化因此Java为我们提供了类。

  3. 现实生活中如何描述一个事物呢:

    属性 该事物的特征描述
    方法 该事物的动作行为
    举例:表示一条狗
    属性 狗的品种,狗的颜色,狗的体重
    方法 跑,跳,叫,睡
    我们学习的Java语言最基本单位是类,所以,使用类来描述事物。

  4. 类的定义

    [访问权限修饰符] class 类名 {
    属性/ 成员变量/ 字段
    行为/ 成员方法
    }

  5. 类的理解:

    1.类是用来描述现实事物的,是Java语言的最基本单位
    2.类是抽象的,是由多个对象抽象想象的部分而来
    3.类可以理解为一个模板,数属性和行为的集合,可以通过类的模板创建具体的对象
    4.Java使用class来描述一个类

  6. List item

    5.类的本质用来组织代码(方法归类),封装数据的(理解提高成员变量的安全性)。

  7. 对象的理解:

    1.对象是客观存在的,万事万物皆是对象
    2.对象是在类的基础上创建的
    3.对象又称为 实例/引用/变量/对象

  8. 创建一个对象

    格式: 类名 对象名 = new 类名();

  9. 访问一个对象

    访问成员
    对象.成员变量
    对象.成员方法

  10. 定义一个类的步骤
    1、定义类名
    2、编写类的属性
    3、编写类的方法
    4、创建对象
    5、通过对象访问成员

    public class OOPDemo01 {
    	public static void main(String[] args) {
    		Student xiaoLi = new Student();
    		System.out.println(xiaoLi.name);	
    		System.out.println(xiaoLi.age);	
    		System.out.println(xiaoLi.height);	
    		System.out.println(xiaoLi.gender);	
    		System.out.println(xiaoLi.isMarried);	
    		
    		xiaoLi.name = "小丽";
    		xiaoLi.age = 18;
    		xiaoLi.height = 1.8;
    		xiaoLi.gender = "男";
    		xiaoLi.isMarried = true;
    		
    		System.out.println(xiaoLi.name);	
    		System.out.println(xiaoLi.age);	
    		System.out.println(xiaoLi.height);	
    		System.out.println(xiaoLi.gender);	
    		System.out.println(xiaoLi.isMarried);
    		
    		int result = xiaoLi.add(10, 30);
    		System.out.println(result);
    		
    		xiaoLi.print99MulTable();
    		
    		xiaoLi.sleep();
    		
    		Student s = null;
    		System.out.println(s.name);
    		
    	}
    }
    
    class Student {
    	// 成员变量
    	// 姓名
    	String name;
    	// 年龄
    	int age;
    	// 身高
    	double height;
    	// 性别
    	String gender;
    	// 是否已婚
    	boolean isMarried;
    	
    	// 成员方法 之前的static去掉,之前怎么写方法的,现在就怎么写!!
    	public int add(int a, int b) {
    		return a + b;
    	}
    	
    	// 打印九九乘法表
    	public void print99MulTable() {
    		for (int i = 1; i <= 9; i++) {
    			for (int j = 1; j <= i; j++) {
    				System.out.print(j + "x" + i + "=" + (i*j) + "\t");
    			}
    			System.out.println();
    		}
    	}
    	
    	public void sleep() {
    		System.out.println("睡");
    	}
    }

成员变量和局部变量

1.定义的位置不同
成员变量: 类体以内,方法体以外
局部变量: 方法的声明上,或者方法体内

2.在内存的位置不一样
成员变量: 在堆区分配内存
局部变量: 在栈区分配内存

3.初始化值不一样
成员变量: 系统赋予初始值
byte short int long 0
float double 0.0
boolean false
char \u0000
引用类型 null
局部变量: 方法的声明上,或者方法体内
没有默认值,必须先声明再赋值再使用

4.变量的生命周期不一样
生命周期: 变量从开始创建到销毁的全过程
成员变量: 随着对象的创建而创建,随着垃圾回收器回收对象的时候销毁
局部变量: 随着方法的调用而创建,随着方法调用结束而销毁

5.当成员变量和局部变量重名的时候,局部变量优先,就近原则
如果希望访问成员变量,需要使用this关键字
匿名对象
概念: 没有名字的对象,本质还是一个对象

匿名对象的特点:
1.既然是对象,同样可以访问成员
2.匿名对象只能够使用一次,如果需要使用多次,必须使用变量接收
3.匿名对象一旦使用一次完毕,立刻成为垃圾对象,等待垃圾回收期在空闲的时候回收,节约内存资源
4.匿名对象在Java里一般用于访问一次的情况,简化代码,在Android里节约内存资源

public class OOPDemo04 {
   @SuppressWarnings("resource")
   public static void main(String[] args) {
   	Student s1 = new Student(); 
   	
//		new Student();
//		
//		System.out.println(new Student().name);
//		
//		new Student().print99MulTable();
   	
   	new Student().name = "隔壁老王";
   	System.out.println(new Student().name); // null
   	
   	String line = new Scanner(System.in).next();
   	System.out.println(line);
   	
   	new Test().method(new Student());
   }
}

class Test {
   public void method(Student s) {
   	System.out.println(s.name);
   }
}

垃圾对象

垃圾对象:没有地址引用的对象称为垃圾对象
什么情况下会成为垃圾对象?
1.当指向某个堆区的空间的对象被赋值为null
2.匿名对象第一次使用完毕
3.对象所在的方法调用完毕
4.对象被重新赋值新的地址

public class OOPDemo05 {
   public static void main(String[] args) {
   	Student s1 = new Student();
   	
   	// 1.当指向某个堆区的空间的对象被赋值为null
   	// s1 = null;
   	
   	// 2.匿名对象第一次使用完毕
   	new Student().sleep();
   	
   	// 3.对象所在的方法调用完毕
   	Demo d = new Demo();
   	d.method();
   	
   	// 4.对象被重新赋值新的地址
   	s1 = new Student();
   }
}

class Demo {
   public void method() {
   	Student s = new Student();
   }
}

封装

1.希望外界不能够直接访问类里的一些属性
2.希望外界传递给类的内部的数据能够得到数据校验,例如年龄必须在0~100岁之间

封装的概念
对数据进行访问权限控制,主要依赖的就是访问权限修饰符
访问权限修饰符: public protected [default] private

如何来对数据进行封装?
1.对需要封装的数据成员使用访问权限修饰符(private)加以修饰
2.在类的内部提供对外访问渠道 (set get方法)
3.使用代码对数据做数据校验 (一般省略不写,看需求实现)

类的组成:
class 类 {
成员变量
成员方法
普通方法
读写方法 (get/set方法)
}
一个JavaBean
bean domain pojo entity

public class PrivateDemo01 {
   public static void main(String[] args) {
   	Student s1 = new Student();
   	s1.setName("小花");
   	s1.setAge(35);
   	
   	s1.showStudentInfo();		
   	Student s2 = new Student();
   	s2.setName("小李");
   	s2.setAge(25);
   	s2.showStudentInfo();
   }
}

class Student {
   private String name;
   private int age;
   private String gender;
   
//	在类体以内,方法体以外只能够定义成员,不能够触碰逻辑代码
//	if(age < 0 || age > 100) {
//		System.out.println("年龄不合法!!!");
//	}
   
   public void setName(String name) {
   	this.name = name;
   }
   
   public String getName() {
   	return name;
   }
   
   public void study() {
   	System.out.println("Student.study()");
//		public int num;
   }
   
   public void showStudentInfo() {
   	System.out.println(getName() + "," + getAge());
   }
   
   // 读
   /*
    * 功能: 对外界提供年龄值
    * 返回值类型: int
    * 参数列表: 无参
    * 方法名: getAge
    */
   public int getAge() {
   	if (age >= 18) {
   		return 18;
   	} else {
   		return age;
   	}
   	
   }
   
   // 写
   /*
    * 功能: 外界修改内部年龄的值
    * 返回值类型: void
    * 参数列表: int innerAge
    * 方法名: setAge
    */
   public void setAge(int outAge) {
   	if(outAge < 0 || outAge > 100) {
   		System.out.println("年龄不合法!!!");
   	} else {
   		age = outAge;
   	}
   }
   public String getGender() {
   	return gender;
   }

   public void setGender(String gender) {
   	this.gender = gender;
   }
}

this关键字

当局部变量和成员变量重名的时候,可以考虑使用this来区分
this关键字
this代表当前对象,
this的特点:
1.成员变量和局部变量重名的时候使用this
2.创建任何一个对象都会创建一个this引用和对象指向同一个堆区的空间
3.this代表当前对象,谁调用了this就是指得谁
4.this只能够出现在类的内部
5.this的设计代表现实生活中代词的概念 (“我的”)
6.默认访问类的成员都可以使用this来访问,如果访问成员没有书写this,默认系统会加上this
构造方法
1.假设一个类中有100个属性,一个一个set很麻烦
构造方法: 构造方法本身就是一个特殊的方法而已
1.能够快速初始化成员变量的值
2.能够为对象分配内存空间 + new

构造方法的格式:
[访问权限修饰符] 方法名(参数列表) {
方法体;
return;

构造方法的特点:
1.构造方法没有返回值,连void都没有
2.构造方法也是方法,存在方法重载
3.构造方法是用来给成员快速初始化的
4.构造方法方法名必须和类名保持一致

构造方法的注意事项:
1.如果我们没有书写构造方法,系统会帮我们书写一个无参构造方法
2.如果你一旦书写了一个带参构造方法,就会覆盖系统的无参构造方法
3.养成一个好习惯: 每次书写一个bean的时候,都写上无参构造方法
好处:
1.无参构造方法能够初始化默认成员的值
2.反射中调用的就是无参构造方法,很多框架中都会利用反射技术创建对象,反射大部分都是依赖无参构造方法

类的组成
class 类 {
成员变量
构造方法
构造方法重载
成员方法
普通方法
读写方法 (get/set方法)
}
一个JavaBean
bean domain pojo entity

public class ConstructorDemo01 {
	public static void main(String[] args) {
		Student s = new Student();
		s.setName("张三");
		s.setAge(18);
		s.show();
		
		Student s2 = new Student("李四", 20, "男");
		s2.show();
		
	}
}

class Student {
	private String name;
	private int age;
	private String gender;
	
	public Student() {
	}
	
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public Student(String name, int age, String gender) {
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public void show() {
		System.out.println("Student [name=" + name + ", age=" + age + ", gender=" + gender + "]");
	}
}
相关标签: Java 面向对象