java面向对象

一:概念

类是java中最基本的单位;一个java文件可以定义多个类;同一个包下类名不能重复。

:是一组成员变量和成员方法的集合,可以吧类看作一个抽象的概念。一个java文件中只能有一个类被public修饰只需要记住被public修饰的类规范是要与java文件名一致。

对象:是该类的具体表现,具体到一个个体。

成员变量:用于描述事物的信息。

成员方法:用于描述事物能够做什么。

成员变量与局部变量的区别:
    1、在类中定义的位置不同
        成员变量:类中,但是在方法外
        局部变量:定义在方法内部
    2、在内存中的位置也不同
        成员变量:在堆内存中
        局部变量:在栈内存中
    3、初始化值也不同
        成员变量:系统会给予默认值
        局部变量:没有系统给的默认值,必须在定义的时候赋值,亦或者在方法中使用之前赋值,然后才能使用。
    4、生命周期不同
        成员变量的生命周期:随着对象的创建而创建,随着对象的消失而消失
        局部变量的生命周期:随着方法的调用而创建,随着方法的调用完毕而消失

   注意事项:
        1、局部变量的名字可以和成员变量的名字一样,在方法中使用的时候,采用就近原则
            方法中使用的变量,会现在方法内部查找,如果方法内部没有,去成员变量中查找。
        2、方法与方法之间里面的局部变量变量,不能互相调用。

二:类的使用

类名 对象名称 = new 类名(..);

使用前要先new一个对象,才能使用main方法里运用(对象名称.成员变量或者对象名称.方法名)

匿名对象:可以直接用  new 类名().成员变量或方法名去调用,new 类名()称为匿名对象。

                  注意,当调用多次的时候,不适合,每次new的时候都是一个新的匿名对象,会频繁的在堆内存中开辟空间

(1)当两个引用指向同一个对象

class Phone3{
    //成员变量
    String brand;
    int price;
    String color;

    //成员方法
    public void call(String s){
        System.out.println("打电话给"+s);
    }

    public void sendMessage(){
        System.out.println("发信息");
    }

    public void listenMusic(){
        System.out.println("听音乐");
    }
}


public class PhoneTest3 {
    public static void main(String[] args) {
        //定义一个手机类
        Phone3 p1 = new Phone3();
        //给手机对象p1成员变量赋值
        p1.brand = "小米";
        p1.price = 1999;
        p1.color = "白色";
        System.out.println(p1.brand+"---"+p1.price+"---"+p1.color);
        p1.call("雷军");
        p1.sendMessage();
        p1.listenMusic();

        
        //创建第二个手机对象,将第一个对象名赋值给它
        Phone3 p2 = p1;  //p1中存的是地址,赋值后p2也指向它
        p2.brand = "华为";
        p2.price = 19999;
        p2.color = "蓝色";
        System.out.println(p1.brand+"---"+p1.price+"---"+p1.color);//地址没变,数值改变,p1也会输出以上内容
    }
}

(2)当方法中的参数是基本数据类型和引用数据类型。


class Demo2 {
    public int getSum(int a,int b) {
        a=100;
        b=200;
        return a + b;
    }
}

class Student2{
    String name;
    public void speak(){
        System.out.println("我热爱学习");
    }
}

class StudentTest2{
    /**
     * 如果将来你看到一个方法的形式参数是一个类的类型,说明他是一个引用数据类型
     * 这里其实需要的是该类的对象
     * 调用的时候,把main方法中创建好的对象名传过来,实际上传的就是对象的地址值
     */
    public void function(Student2 s){ //Student2 s = st3 = new Student2();
        s.name = "小王";
        s.speak();
    }
}


public class XingShiCanShuDemo {
    public static void main(String[] args) {
        Demo2 d = new Demo2();
        int a = 10;
        int b = 20;
        System.out.println(d.getSum(a,b));//方法传入的是常量值,或者是该类型的变量
        System.out.println("a:"+a+",b:"+b);//当形式参数是基本数据类型的时候,在方法中对变量做修改,不会影响到外部实际的栈内存中的值。

        //要想调用function(),就必须创建StudentTest2对象
        StudentTest2 st2 = new StudentTest2();

        Student2 st3 = new Student2();
        System.out.println(st3.name);
        st2.function(st3);//这里实际上传的是地址值;
        System.out.println(st3.name);// 当形式参数是引用数据类型的时候,在方法中对变量做修改,会影响到外部实际的堆内存中的值。
    }
}

三:封装

1、概述:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

2、优点:隐藏实现细节,提供公共的访问方式 提高了代码的复用性 提高安全性。

3、private关键字:是一个权限修饰符;

                               可以修饰成员(成员变量和成员方法);

                               被private修饰的成员只在本类中才能访问,相当于在main方法中被隐藏了。

     private最常见的应用:把成员变量用private修饰;提供对应的 获取值方法:getXxx() ;赋值方法:setXxx()

例:

public class Teacher {
    //定义成员变量
    private String name;
    private int age;

    //提供公共的getXxx()和setXxx()方法
    public void setName(String s) {
        name = s;
    }

    public String getName() {
        return name;
    }

    public void setAge(int a) {
        age = a;
    }

    public int getAge(){
        return age;
    }

    //提供一个方法打印所有的成员变量值
    public void show() {
        System.out.println("姓名:" + name + ",年龄:" + age);
    }
}

class TeacherTest{
    public static void main(String[] args){
        //创建一个老师对象
        Teacher t1 = new Teacher();
        //使用成员变量
        //不能直接获取,因为它们都被private修饰了
        //通过公共的方法来获取成员变量
        System.out.println(t1.getName()+"---"+t1.getAge());

        //给成员变量赋值
        t1.setName("刘志城");
        t1.setAge(18);
        System.out.println(t1.getName()+"---"+t1.getAge());
        t1.show();

    }
}

4.this:代表所在类的对象引用

class Doctor {
    private String name;//成员变量
    public void setName(String name) {//用name是为了更好的赋值,使用方法更方便。
        this.name = name;//为了区分方法中定义的name和成员变量,this.name代表成员变量。
    }
    public String getName() {
        return name;
    }
    
    public void show() {
        System.out.println("姓名:" + name );
    }
}

public class DoctorDemo {
    public static void main(String[] args) {
        //创建一个医生对象
        Doctor d = new Doctor();
        d.setName("王宇");
        
        d.show();
    }
}

上一篇:Java面向对象1


下一篇:C++进程的内存空间