目录
e.JavaBean类的定义******************************
一 面向对象思想
1.概述
面向过程思想: 遇到一个问题,一步一步的去解决他,强调的是过程(典型代表语言是C语言)
面向对象思想: 遇到一个问题,找一个可以解决问题的对象(可以是人,也可以是别的),强调是对象(典型代表语言Java)
案例1: 洗衣服
面向过程思想: a.收集衣服 b.加水洗衣液 c.泡一会 d.搓 e.漂洗 f.拧干 d.晾衣服
面向对象思想: 1.找个全自动洗衣机,把衣服丢进去
2.找一个人,把衣服给他
2.面向对象的三大特征
继承 ---复用
封装 ---安全
多态 ---拓展
3.类和对象
Java中必须先有类,才能有对象
类是什么?
一群具有相同属性和行为事物的集合,比如人类,狗类,猫类
对象又是什么?
就是类中的一个具体存在,也称为实例。
举例:
车(类) 宝马车(类) 我家那辆三轮车(对象)
动物(类) 狗(类) 大黄狗(类) 我家那只狗(对象)
4.类和对象的关系
对象 是以 类 作为 模板 创建出来的
所以类中有什么,那么对象就应该有什么(属性、方法)
5.类的定义
类的定义:包括类名,类的属性(变量),类的行为(方法)三部分
格式:
public class 类名{ //类名大驼峰
//类的属性(成员变量)
数据类型 成员变量名1;
数据类型 成员变量名2;
...
//类的行为(成员方法) 没有static关键字
public 返回值类型 方法名(参数列表){
方法体
return 返回值;
}
}
默认值问题:
成员变量是有默认值的!!!!
6.成员变量和局部变量
成员变量:直接定义在类中的变量
局部变量:定义类中的方法中的变量
成员变量和局部变量的五点区别:
a.定义位置不同
b.初始值不同/默认值不同
局部变量 没有默认值 ,不赋值不能使用
成员变量 有默认值,不同的数据类型不同的默认值
c.作用域不同(有效范围)
局部变量 只能在局部使用,在哪个方法中定义的只能在该方法中使用
成员变量 在该类中都可以使用
d.内存位置
局部变量 跟随方法的调用,进入栈中
成员变量 跟随对象的创建,进入堆中
e.生命周期
局部变量 跟随方法的调用而出现,跟随方法的结束而销毁
成员变量 跟随对象的创建而出现,跟随对象的销毁而销毁
7.对象的使用格式
类名 对象名 = new 类名();
对象名.成员变量;
对象名.成员方法();
public class Test01_Student {
public static void main(String[] args) {
//创建对象格式:类名 对象名 = new 类名();
Student s = new Student();
System.out.println("s:"+s); //地址
//直接输出成员变量值
System.out.println("姓名:"+s.name); //null
System.out.println("年龄:"+s.age); //0
System.out.println("‐‐‐‐‐‐‐‐‐‐");
//给成员变量赋值
s.name = "C罗";
s.age = 18;
//再次输出成员变量的值
System.out.println("姓名:"+s.name); //C罗
System.out.println("年龄:"+s.age); //18
System.out.println("‐‐‐‐‐‐‐‐‐‐");
//调用成员方法
s.study();
s.eat();
}
8.对象内存图
1.单个对象调用方法
在栈内存中运行的方法,遵循"先进后出,后进先出"的原则。变量p指向堆内存中的空间,寻找方法信息,去执行该方法。
但是,这里依然有问题存在。创建多个对象时,如果每个对象内部都保存一份方法信息,这就非常浪费内存了,因为所有对象的方法信息都是一样的。那么如何解决这个问题呢?
2.多个对象调用方法
对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息
只保存一份,节约内存空间
二.封装
1.封装的概述
封装就是对我们写的对象的一种保护,防止数据被随意访问和修改
2.封装的原则
a.把需要隐藏的属性 隐藏起来
b.对外提供一种公共访问方式
3.封装的步骤
a.java提供关键字,private 用来修饰成员变量
b.提供一对get/set方法,通过该方法可以访问成员变量
4.private关键字的作用
a.private是一种最小的权限修饰符
b.能修饰成员变量和成员方法
c.被private修饰的成员,只能在类的内部访问
5.private的使用格式
格式: private 数据类型 成员变量名;
public class Dog{
private int age; //成员变量私有化了
//get方法,获取值,没有参数,有返回值
public int getAge(){
return age;
}
//set方法,修改值,没有返回值,有参数
public void setAge(int a){
age = a;
}
}
6.this关键字(this和super下次整吧)
public class Dog{
private int age; //成员变量私有化了
//get方法,获取值,没有参数,有返回值
public int getAge(){
return age;
}
//set方法,修改值,没有返回值,有参数
public void setAge(int age){
age = age; //如果这么写,就是局部变量自己给自己赋值了,这是java的就近原则
this.age = age;//把局部变量age,赋值给成员变量this.age
}
}
tip: 1.idea生成get和set方法快捷键: alt+INS 点击 Getter and Setter
2.eclipse 右键鼠标——Generate——getter and setter
三.构造方法
a.什么是构造方法
给对象的成员变量默认值的方法
b.构造方法的格式:
public 类名(){
作用: 给成员变量赋默认值的
}
注意:构造方法没有返回值,不写返回值类型(不是void!!!!)
注意:其实我们以前说的固定格式
类名 对象名 = new 类名();//这里的类名() 其实就是调用了无参数构造方法
类名 对象名 = new 类名(参数);//调用有参构造方法
c.构造方法的重载
重载的构造方法:
public class Dog{
private int age; //成员变量私有化了
private String name;//
//无参构造
public Dog(){
}
//重载构造
public Dog(int age){
this.age = age;
}
public Dog(String name){
this.name = name;
}
public Dog(int age,String name){
this.age = age;
this.name = name;
}
}
d.构造方法的注意事项
i.如果一个类中没有写任何构造,那么默认有一个无参构造
ii.如果我们写了构造,那么系统就不会生成无参构造
iii.构造方法也可以重载
e.JavaBean类的定义******************************
JavaBean是Java中定义类的标准
i.所有成员变量必须私有化(private)
ii.为私有化的成员变量提供Getter/Setter
iii.标准的JavaBean中必须有无参构造
iv. 标准的JavaBena中一般还会提供全参构造
总结 JavaBean = private+get/set+无参构造+全参构造+(一般还会自己加toString()方法)
完整版JavaBean:
package com.gty.vip;
public class Person
{
//成员变量
public int age;
public String name;
//无参构造方法
public Person(){}
//有参构造方法
public Person(int age, String name){
this.age=age;
this.name=name;
}
//getset
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//toString()方法,也是可以快速生成的 @Override是java的注解
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
/* 主方法main()这里不写啊!!!因为没有main()方法,所以是不能运行的
我们都是在别的类中调用的
public static void main(String[] args) {
}*/
}