java基础————面向对象

----------- android培训java培训、java学习型技术博客、期待与您交流!------------

 

 

面向对象的引入---->>

    当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。
    可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了,这时
    就开始思索,能不能把这些步骤和功能在进行封装,封装时根据不同的功能,
    进行不同的封装,功能类似的封装在一起。这样结构就清晰了很多。用的时候,
    找到对应的类就可以了。

面向对象的思想---->>
        
        面向过程:    关注的是步骤和过程
        面向对象:    关注的是对象
                    面向对象是基于面向过程的
                    指挥对象做事情 , 创建对象调用方法

 类与对象及其应用---->>
        
        事物                   类
            属性                成员变量
            行为                成员方法
        
        属性:    就是事物的描述信息
        行为:    就是这个事物可以做什么事情

        成员变量:    和之前定义变量一样 , 只不过位置不同 , 在类中方法外
        成员方法:    和之前定义方法一样 , 只不过去掉static

        类:        是一组相关属性和行为的集合 , 是一个抽象的东西
        对象:    就是该类的一个具体的体现
        举例:
                学生            类
                班长            对象

        类的定义:    定义该的成员变量和成员方法

下面我们来定义一个学生类

//这是我的学生类
class Student {
    //定义变量
    //姓名
    String name;
    //年龄
    int age;
    //地址
    String address;
    
    //定义方法
    //学习的方法
    public void study() {
        System.out.println("学生爱学习");
    }
    
    //吃饭的方法
    public void eat() {
        System.out.println("学习饿了,要吃饭");
    }
    
    //睡觉的方法
    public void sleep() {
        System.out.println("学习累了,要睡觉");
    }
}

 

 

 


类的使用:---->>
        类是一个抽象的东西, 我们就不能直接使用, 如果我们想使用这个类,我们需要使用该类的一个具体的体现(对象)
        如何获取某一个类的对象呢?
            格式:    类名 对象名 = new 类名() ;
        如何使用这个对象的成员变量?
            格式:    对象名.变量名 ;
        如何使用这个对象的成员方法?
            格式:    对象名.方法名(...) ;
如:学生类是一个抽象的概念,没什么意义。我们通过 new 就可以得到他的具体对象
    这样我们就得到了张峰这个具体的对象了

 

 

 

 

class  StudentTest{

    public static void main(String[] args){

        //创建对象
        Student s = new Student();
        

        //对成员变量赋值
        s.name = "张峰";
        s.age = 18;
        s.address = "北京"

        System.out.println("姓名是:" + s.name);
        System.out.println("年龄是:" + s.age);
        System.out.println("家住:" + s.address);
        
        //调用方法
        s.eat();
        s.study();
        s.sleep();

    }
}






对象的内存分布--->>
        
        java语言的内存分配
            a: 栈:    存储的都是局部变量
                    局部变量: 就是在方法定义中或者方法声明上的变量
            b: 堆:  存储的都是new出来的东西
                    (1): 每一个new出来的东西系统都会为其分配一个地址值
                    (2): 每一个元素系统都会为其分配默认的初始化值
                         byte , short , int , long     ---- 0
                         float , double                 ---- 0.0
                         char                         ---- '\u0000'
                         boolean                     ---- false
                         引用数据类型                 ---- null
                    (3): 使用完毕以后就变成的垃圾,等待垃圾回收器对其回收

            c: 方法区(面向对象部分研究)
            d: 本地方法区(和系统相关)
            e: 寄存器(CPU)


成员变量和局部变量的区别--->>
            
        (1): 在类中的位置不同
             成员变量: 在类中方法外
             局部变量: 在方法定义中或者方法声明上
        (2): 在内存中的位置不同
             成员变量:    在堆内存中
             局部变量:  在栈内存中
        (3): 生命周期的不同:
             成员变量:    随着对象的创建而产生,随着对象的消失而消失
             局部变量:    随着方法的调用而产生 , 随着方法的消失而消失
        (4): 默认值的问题:
             成员变量:    有默认的初始化值
             局部变量:    没有默认的初始化值 , 使用之前,必须对其赋值
匿名对象---->>
       
       概述: 就是没有名字的对象
       举例:    new Student() ;
       作用:
            a.调用方法 , 当我们调用方法时,这个方法仅仅是调用一次的时候
            b.作为参数传递
            
       调用方法的格式:
                new Student().show();

举例:厨师叫服务员端菜。
    这个案例中厨师叫服务员端菜,并没有指定那个服务员,而且只需要端一次。
    所以我们可以使用匿名对象

 

 

 

class  CookTest{

    public static void main(String[] args){

        //创建厨师对象

        Cook c = new Cook();

        c.make();

        //创建服务员对象
        Waiter cuiHua = new Waiter();
        //如果你的参数是一个类名,实际传递的应该是类的对象
        //c.call(cuiHua);

        c.call(new Waiter());
        

    }
}
//厨师类
class Cook{
    //成员方法
    //做菜
    public void make(){
        System.out.println("厨师能做菜");    
    }

    //叫服务员
    public void call(Waiter waiter){
        waiter.duanCai();
    }

}

//服务员类
class Waiter{

    public void duanCai(){
        System.out.println("狗肉汤来了!~~~~~~");
    }
}

 




    
封装(private):
        
            private: 表示的意思的私有的

            private的特点:
                (1): private 是一个修饰符
                (2): private 可以修饰成员变量和成员方法
                (3): 被private修饰的的成员只能在本类中方法

            private 最常见的应用场景:    
                把成员变量使用private修饰,然后提供对象的get和set方法


 this关键字 :
        
        使用场景:    当我们的局部变量隐藏了成员变量的时候,我们可以使用this关键字,来明确我们访问的是成员变量

        this: 表示的是本类对象的一个引用 , 谁调用我方法中的this就代表谁

java语言的参数传递问题:
        
        基本数据类型的参数传递,形式参数的改变对实际参数没有影响
        引用数据类型的参数传递,形式参数的改变对实际参数的是有直接影响的

        虽然String是引用数据类型,但是在传递的时候是按照基本数据类型的特点进行传递的,传递其实是具体的字符串对应的值

        类名在作为参数的时候我们如何调用?
        
        如果以后看到一个方法上需要一个类类型的变量, 那么我们在调用的使用,其实我们需要给其传递一个该类的对象

        public void show(Student s) {                    // 在调用这个方法的时候,需要传递一个Student类的对象
            System.out.println("show.......") ;
        }



        
    构造方法------->>
        特点:    
            (1): 方法名和类名相同
            (2): 没有返回值类型 , 连void也没有
            (3): 没有具体的返回值

        作用:
            对类的成员变量初始化
        注意事项:
            (1): 如果我们没有给出构造方法,系统将会提供一个默认的无参的构造方法
            (2): 如果我们给出构造方法 , 系统将不会在通过默认的无参的构造方法
                 这个时候如果我们还想使用无参的构造方法,那么这个时候我们需要自己给出(建议: 都是自己给出)
    对象的创建步骤
        
        Student s = new Student() ;
        
        (1): 加载Student的字节码文件到方法区
        (2): 在栈内存中为s开辟空间
        (3): 在堆内存中为new Student()开辟空间
        (4): 给Student的成员变量进行默认初始化
        (5): 给Student的成员变量进行显式初始化
        (6): 通过构造方法对成员变量进行初始化
        (7): 把堆内存中产生的地址值赋值给栈内存中的应用变量s

        举例:

 

 

 

 

 

 

class Student {
    
        //成员变量
        private String name;
        private int age;
        private String studyNum;
            
        //构造方法
            //无参
            Student(){}
            //有参
            Student(String name, int age,String studyNum){
                this.name = name;
                this.age =age;
                this.studyNum = studyNum;
            }
        //成员方法
            //get /set

            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 getStudyNum(){
                return studyNum;        
            }
            public void setStudyNum(String studyNum){
                this.studyNum = studyNum;
            }

            //特有方法

            public void study(){
                System.out.println("好好学习");
            }

            public void eat(String food){
                System.out.println(name + "同学爱吃" + food);
            }

            public void sleep(){
                System.out.println("好好睡觉~~~");
            }
    }

 

 




    static关键字:

        static 的意思是静态的
        特点:
            a: 随着类的加载而加载
            b: 优先于对象存在
            c: 被类的所有的对象所共享
            d: 可以通过类名调用,其本身也可以通过对象名调用
                建议使用类名调用

        注意事项:
            静态只能访问静态 , 非静态可以访问静态也可以访问非静态
    

    代码块
        概述:    在java语言中使用{}括起来的内容
        分类:    
                局部代码块 , 构造代码块 , 静态代码块 , 同步代码块(多线程在讲解)
        
        局部代码块:    在局部位置        作用: 用来限定变量的生命周期,提早释放内存,提高内存的使用率
        构造代码块: 在类中方法外    作用: 我们可以将多个构造方法都要执行的代码方法构造代码块中
                    特点:    每一次创建对象的时候都要执行 , 并且它的执行优先于构造方法
        静态代码块:
                    在类中方法外 , 前面需要添加一个static关键字
                    作用:
                        可以对类进行初始化 , 如果我们现在加载这个类的时候做一些事情
                    特点:    随着类的加载而执行 , 并且是执行一次 , 优先于构造代码块执行
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值