Java SE day03_面向对象

面向对象思想

面向过程:我—洗衣服—做饭----刷碗-----拖地
面向对象:我—找一个对象—帮我洗衣服,做饭,刷碗,拖地

类与对象

A:现实世界的事物
属性 事物的基本描述
行为 事物的功能

B:Java语言中最基本的单位是类。所以,我们要用类来体现事物

C:类
成员变量 事物属性
成员方法 事物行为

D:类:是一组相关的属性和行为的集合。是一个抽象的概念。
对象:是该类事物的具体存在,是一个具体的实例。(对象)

类的定义及使用

  • A:类的定义

    成员变量 定义格式和以前一样,就是位置不同,在类中,方法外。
    成员方法 定义格式和以前一样,就是去掉了static。

  • B:使用类的内容

    a:创建对象? 格式
    类名 对象名 = new 类名();
    b:如何使用成员变量和成员方法呢
    对象名.成员变量
    对象名.成员方法()

简单的对象图解

成员变量和局部变量的区别(理解)

  • (1)在类中的位置不同
    成员变量:类中方法外
    局部变量:方法定义中或者方法声明上
  • (2)在内存中的位置不同
    成员变量:在堆中
    局部变量:在栈中
  • (3)生命周期不同
    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
  • (4)初始化值不同
    成员变量:有默认值
    局部变量:没有默认值,必须定义,赋值,然后才能使用

形式参数问题_案例

/*
		形式参数的问题:
			基本类型:形式参数的改变不影响实际参数
			引用类型:形式参数的改变直接影响实际参数
	*/
	//形式参数是基本类型
	class Demo {
		public int sum(int a,int b) {
			return a + b;
		}
	}
	
	//形式参数是引用类型
	class Student {
		public void show() {
			System.out.println("我爱学习");
		}
	}
	
	class StudentDemo {
		//如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。
		public void method(Student s) { //调用的时候,把main方法中的s的地址传递到了这里 Student s = new Student();
			s.show();
		}
	}
	
	class ArgsTest {
		public static void main(String[] args) {
			//形式参数是基本类型的调用
			Demo d = new Demo();
			int result = d.sum(10,20);
			System.out.println("result:"+result);
			System.out.println("--------------");
			
			//形式参数是引用类型的调用
			//需求:我要调用StudentDemo类中的method()方法
			StudentDemo sd = new StudentDemo();
			//创建学生对象
			Student s = new Student();
			sd.method(s); //把s的地址给到了这里
			//匿名对象作为实际参数使用
			sd.method(new Student());
		}
	}

封装(理解)

(1)隐藏实现细节,提供公共的访问方式
(2)好处:

A:隐藏实现细节,提供公共的访问方式
B:提高代码的复用性
C:提高代码的安全性

(3)设计原则

把不想让外界知道的实现细节给隐藏起来,提供公共的访问方式

(4)private是封装的一种体现。

封装:类,方法,private修饰成员变量

关键字

private关键字(掌握)

(1)私有的意义,可以修饰成员变量和成员方法

(2)特点:
被private修饰的后的成员只能在本类中被访问

(3)private的应用:
以后再写一个类的时候:
把所有的成员变量给private了
提供对应的getXxx()/setXxx()方法

this关键字(掌握)

(1)代表当前类的引用对象
记住:哪个对象调用方法,该方法内部的this就代表那个对象

(2)this的应用场景:
A:解决了局部变量隐藏成员变量的问题
B:其实this还有其他的应用

this关键字图解

1.加载方法区,class文件类,和student的方法区
2.栈加载main,加载s1
3.堆就new student() 地址、this,成员变量、方法区的地址
4.栈加载s1.setName的方法从this(s1)覆盖了s1堆里面的name,然后方法消失
5.栈加载setAge的方法从this(s1)覆盖了(s1)堆里面的age,然后消失

static的特点

(它可以修饰成员变量,还可以修饰成员方法)
A:随着类的加载而加载
回想main方法。

B:优先于对象存在

C:被类的所有对象共享
举例:咱们班级的学生应该共用同一个班级编号。
其实这个特点也是在告诉我们什么时候使用静态?
如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
举例:
饮水机(用静态修饰)
水杯(不能用静态修饰)

D:可以通过类名调用
其实它本身也可以通过对象名调用。
推荐使用类名调用。

静态修饰的内容一般我们称其为:与类相关的,类成员

(3)静态的内存图
静态的内容在方法区的静态区

静态的注意事项;

  • A:在静态方法中是没有this关键字的
    如何理解呢?
    静态是随着类的加载而加载,this是随着对象的创建而存在。
    静态比对象先存在。

  • B:静态方法只能访问静态的成员变量和静态的成员方法

      静态方法:
      	成员变量:只能访问静态变量
      	成员方法:只能访问静态成员方法
      非静态方法:
      	成员变量:可以是静态的,也可以是非静态的
      	成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
      简单记:
      静态只能访问静态。
    

(5)静态变量和成员变量的区别

  • A:所属不同
    静态变量:属于类,类变量
    成员变量:属于对象,对象变量,实例变量
  • B:内存位置不同
    静态变量:方法区的静态区
    成员变量:堆内存
  • C:生命周期不同
    静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
    成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
  • D:调用不同
    静态变量:可以通过对象名调用,也可以通过类名调用
    成员变量:只能通过对象名调用

(6)main方法是静态的
public:权限最大
static:不用创建对象调用
void:返回值给jvm没有意义
main:就是一个常见的名称。
String[] args:可以接收数据,提供程序的灵活性

static的图解

构造方法

/*
		构造方法:
			给对象的数据进行初始化
	
		格式:
			A:方法名与类名相同
			B:没有返回值类型,连void都没有
			C:没有具体的返回值
	*/
	class Student {
		private String name; //null
		private int age; //0
		
		public Student() {
			System.out.println("这是构造方法");
		}
		/*public Student() {
			//无参构造方法
		}*/
	}
	
	class ConstructDemo {
		public static void main(String[] args) {
			//创建对象
			Student s = new Student();
			System.out.println(s); //Student@e5bbd6
		}
	}
结果:
		这是构造方法
		Student@e5bbd6

构造方法标准案例

class Student {
			private String name;
			private int age;
			//这是构造代码块
			{}
			public Student(){}
			
			public Student(String name,int age) {
				this.name = name;
				this.age = age;
			}
			
			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;
			}
		}
		
		//测试:
		class StudentDemo {
			public static void main(String[] args) {
				//方式1
				Student s1 = new Student();
				s1.setName("林青霞");
				s1.setAge(27);
				System.out.println(s1.getName()+"---"+s1.getAge());
				
				//方式2
				Student s2 = new Student("刘意",30);
				System.out.println(s2.getName()+"---"+s2.getAge());
			}
		}
代码:Student s = new Student();做了哪些事情?(理解)
(1)把Student.class文件加载到内存
(2)在栈内存为s开辟空间
(3)在堆内存为学生对象申请空间
(4)给学生的成员变量进行默认初始化。null,0
(5)给学生的成员变量进行显示初始化。林青霞,27
(6)通过构造方法给成员变量进行初始化。刘意,30
(7)对象构造完毕,把地址赋值给s变量

构造方法的注意事项

  • A:不想让对象访问工具类中的static方法,可以在工具类里面的构造方法加私有化,
    然后通过类名访问工具类里面的方法。

  • B:如果我们没写构造方法,系统将提供一个默认的无参构造方法

  • C:如果我们给出了构造方法,系统将不再提供默认构造方法
    如果这个时候,我们要使用无参构造方法,就必须自己给出。
    推荐:永远手动自己给出无参构造方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值