Java 04

1.面向对象概述


我们学习编程语言最终目的是用程序去模拟现实生活中的事物,让事物与事物之间产生关系,然后模拟现实生活中的场景。
属性:就是对事物的描述    -------成员变量
行为:就是事物能够做什么事情 -------成员方法


成员变量:在类中方法外定义的变量都叫成员变量

语句定义格式:修饰符 数据类型 变量名;

成员方法:在类中定义

定义的格式与我们在学习是规范的定义语法是一样:

修饰符  返回值类型 方法名(参数类型1 参数名1,....){
        方法体;
        return  xxx;
    }
注意:现在开始将static去掉!!!!


通过类去创建对象
//语句定义格式:
//类名 对象名 = new 类名();
//根据Person类创建一个人对象 Person p1=new Person();

对象内存图

 

对象内存图

class Student {
    //成员变量
    String name;
    //    int age;
    private int age;
 
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int a) {
        if (a > 0 & a < 100) {
            age = a;
        } else {
            System.out.println("========================");
            System.out.println("=======年龄有误!!=======");
            System.out.println("========================");
        }
    }
 
    //成员方法
    public void study() {
        System.out.println("学习");
    }
 
    public void eat() {
        System.out.println("吃饭");
    }
}
 
public class StudentDemo {
    public static void main(String[] args) {
        //创建一个学生对象
        Student s1 = new Student();
        //给成员变量进行赋值
        s1.name = "reynolds";
        s1.setAge(18);
        System.out.println("姓名:" + s1.name + ", 年龄:" + s1.getAge());
 
 
    }
}

2.成员变量与 局部变量的区别


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

匿名对象:就是没有名字的对象。 是对象的一种简化表示形式

匿名对象的两种使用情况 1.对象调用方法仅仅一次的时候 2.作为实际参数传递
例:new Demo2().fun2(new Demo())

 

3.三大特征
3.1 封装
3.1.1封装概述


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

好处:

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

封装原则:

将不需要对外提供的内容都隐藏起来。 把属性隐藏,提供公共方法对其访问。

3.1.2 private关键字 


private关键字: 是一个权限修饰符。 可以修饰成员(成员变量和成员方法) 被private修饰的成员只在本类中才能访问。

private最常见的应用: 把成员变量用private修饰 提供对应的getXxx()/setXxx()方法 一个标准的案例的使用

x

//对于同一个文件夹下的类,类名不能重复
class Student2 {
    //成员变量
    private String name;
    private int age;
 
    public void setName(String s) {
        name = s;
    }
 
    public String getName() {
        return name;
    }
 
    public void setAge(int i) {
        age = i;
    }
 
    public int getAge() {
        return age;
    }
 
    //打印所有的成员变量值
    public void show() {
        System.out.println("姓名:" + name + ",年龄:" + age);
    }
}
 
public class StudentDemo2 {
    public static void main(String[] args) {
        //创建一个学生对象
        Student2 s1 = new Student2();
//        s1.name=
        s1.setName("reynolds");
        s1.setAge(18);
 
        String name = s1.getName();
        int age = s1.getAge();
        System.out.println("姓名:" + name + ",年龄:" + age);
        System.out.println("=========================================");
        s1.show();
 
    }
}

3.1.3 this关键字 


this:代表所在类的对象引用 记住: 方法被哪个对象调用,this就代表那个对象

什么时候使用this呢?     局部变量隐藏成员变量

变量使用的就近原则:先在本方法中找,如果找不到再去成员变量中去找

class Student3{
    //成员变量
    private String name;
    private int age;
 
    public void setName(String name) { //String name = "刘璇"
        //变量使用遵循:就近原则
        this.name = name;
    }
 
    public String getName() {
        return name;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public int getAge() {
        return age;
    }
 
    //打印所有的成员变量值
    public void show() {
        this.fun();
        System.out.println("姓名:" + this.name + ",年龄:" + this.age);
    }
 
    public void fun(){
        System.out.println("今天天气不错!!");
    }
 
    private void fun2(){
        System.out.println("这是被private修饰fun2方法");
    }
 
    public void fun3(){
        fun2();
    }
}
 
public class StudentDemo3 {
    public static void main(String[] args) {
        //创建一个学生对象
        Student3 s1 = new Student3();
//        s1.name=
        s1.setName("reynolds");
        s1.setAge(18);
 
        String name = s1.getName();
        int age = s1.getAge();
        System.out.println("姓名:" + name + ",年龄:" + age);
        System.out.println("=========================================");
        s1.show();
//        s1.fun2();
        s1.fun3();
    }
}

3.1.4 构造方法


作用:给对象的数据进行初始化

语句定义格式

1)构造方法的方法名与类名一致

2)没有返回值,连void都不能出现

构造方法注意事项

如果你不提供构造方法,系统会给出默认构造方法

如果你提供了构造方法,系统将不再提供,最好俩个有参无参都定义一下

构造方法也是可以重载的 

Student() {
        System.out.println("=============你好=============");
    }
 
    Student(String name, int age) {
//        System.out.println("这是重载的方法"+s);
        this.name = name;
        this.age = age;
    }


使用alt+insert快捷键可以快速写构造方法和get,set方法 

实例:

//以面向对象的思想,编写自定义类描述图书信息。设定属性包括:书名,作者,出  版社名,价格;方法包括:信息介绍 show()
//要求:
//1)设置属性的私有访问权限,通过公有的 get,set 方法实现对属性的访问
//2)限定价格必须大于 10,如果无效进行提示
//3)限定作者,书名为只读属性
//4)设计构造方法实现对属性赋值
//5)信息介绍方法描述图书所有信息
//编写测试类,测试图书类的对象及相关方法(测试数据信息自定)
class Book{
    String bname;
    String author;
    String press;
    int price;
 
    public Book(String bname, String author, String press, int price) {
        this.bname = bname;
        this.author = author;
        this.press = press;
        if(price>10){
            this.price = price;
        }else{
            System.out.println("价格无效");
        }
    }
 
    public void setPrice(int price) {
        this.price = price;
    }
 
    public void setBname(String bname) {
        this.bname = bname;
    }
 
    public String getBname() {
        return bname;
    }
 
    public String getAuthor() {
        return author;
    }
 
    public String getPress() {
        return press;
    }
 
    public int getPrice() {
        return price;
    }
 
    public void show(){
        System.out.println("书名:"+bname+"\n作者:"+author+"\n出版社:"+press+"\n价格:"+price);
    }
 
}
public class Booktest {
    public static void main(String[] args) {
        Book b1=new Book("鹿鼎记","金庸","人民文学出版社",55);
        b1.show();
        System.out.println("-------------------------------------");
        Book b2=new Book("  ","古龙","人民文学出版社",55);
        b2.setBname("绝代双骄");
        b2.setPrice(100);
        b2.show();
 
    }
}

类的初始化过程 

 

 3.1.5 static关键字


可以修饰成员变量和成员方法 

java中将所有对象共享的成员,使用一个关键字进行修饰:static(静态的)

 static关键字特点

随着类的加载而加载

优先于对象存在

被类的所有对象共享 这也是我们判断是否使用静态关键字的条件

可以通过类名调用

static的使用

1、可以修饰成员变量,成员方法

2、被static修饰的成员,属于类成员(静态成员),可以使用类名.的方式直接调用,不需要创建对象

3、静态的成员方法只能访问静态的成员(包括成员变量,成员方法)

4、非静态的成员方法既可以访问静态的成员,也可以访问非静态的成员

5、static不能修饰构造方法

6、被static修饰的成员方法中不允许出现this关键字, 因为被static修饰成员是属于类本身是优先于对象而存在的,但是呢this关键字代表的是当前对象,所以两者意思上冲突了。

 静态区的使用

 

解释main方法的每一个单词
//public是公共的意思,指最大权限,因为main方法是由JVM所调用,所以权限一定要够大
//static,静态的意思,也就意味着不需要创建对象就可以被调用起来
//void:表示没有返回值的意思,因为main方法是由JVM所调用,给了返回值其实给的是JVM,没有意义
//main:方法的名字,定死的
//String[] args:方法的参数列表,是一个一维数组,元素类型是String类型的


 3.1.6 制作帮助文档


写法实例:

package com.shujia.wyh.day06;
 
 
/**
 *
 * 这个类是专门对数组做操作的类,封装了比如打印数组、获取最大值等等方法,后续持续更新....
 * @author xiaohu
 * @version 1.0
 *
 */
public class ArrayTool {
 
    private ArrayTool(){
 
    }
 
    /**
     * 这个方法是获取int类型的一维数组中的最大值
     * @param arr arr是一维数组,元素是int类型的,参数的名字叫做arr
     * @return 返回值是int类型的元素,返回的是数组中的最大值
     */
    public static int getMaxNumber(int[] arr) {
        int maxNum = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > maxNum) {
                maxNum = arr[i];
            }
        }
 
        return maxNum;
    }
 
    /**
     * 这个方法用作以指定的输出格式打印int类型一维数组
     * 输出的格式为:[元素1,元素2,...]
     * @param arr arr是一维数组,元素是int类型的,参数的名字叫做arr
     */
    public static void printArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            if (i == 0) {
                System.out.print("[" + arr[i] + ",");
            } else if (i == arr.length - 1) {
                System.out.println(arr[i] + "]");
            } else {
                System.out.print(arr[i] + ",");
            }
        }
    }
}

在文件夹下运行     javadoc -d 目录 -author -version ArrayTool.java

生成帮助文档

3.1.7 代码块


在Java中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,
       可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)。

       局部代码块
           在方法中出现;限定变量生命周期(作用域),及早释放,提高内存利用率
       构造代码块
           在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
       静态代码块 在类中方法外出现,加了static修饰
           在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且值执行一次。和创建对象无关。


       静态代码块(多个静态代码块之间是按照定义的顺序执行,自上而下)--->构造代码块(多个构造代码块之间是按照定义的顺序执行,自上而下)--->构造方法

 

public class CodeKuaiDemo {
    //在类中方法外出现,并加上static修饰
    static {
        System.out.println("这是静态代码块2。。。。");
    }
 
    CodeKuaiDemo(){
        System.out.println("这是我们自己提供的构造方法");
    }
 
    //构造代码块定义在类中方法外的,这个在创建对象的时候执行
    {
        int a = 10;
        System.out.println("hello World2构造代码块");
    }
 
    //在类中方法外出现,并加上static修饰
    static {
        System.out.println("这是静态代码块3。。。。");
    }
 
    //构造代码块定义在类中方法外的,这个在创建对象的时候执行
    {
        int a = 10;
        System.out.println("hello World3构造代码块");
    }
 
    //在类中方法外出现,并加上static修饰
    static {
        System.out.println("这是静态代码块1。。。。");
    }
 
 
 
    public static void main(String[] args) {
        //局部代码块,在方法中出现
//        {
//            int a = 10;
//            System.out.println("hello World");
//        }
//        System.out.println(a);
        CodeKuaiDemo codeKuaiDemo = new CodeKuaiDemo();
        System.out.println("=========================");
        CodeKuaiDemo codeKuaiDemo2 = new CodeKuaiDemo();
 
 
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值