Java 学习之路 Week02

如果把 “变懒” 看做 熵变,而逆熵变需要 很大的毅力呀。白天在“放羊”,现在是时候总结上一周我这菜鸟到底学了些什么。

java中的堆和栈

(个人理解)
对象放在堆中,方法放在方法区中,栈区中存放变量和 main方法所在类的方法调用时的指针和指向对象的指针。
调用对象时:堆区中的对象保存所有的属性值和指向方法的指针,而对象的名称对应的变量存放的是栈中的地址。
(如果想对 java 的堆 和栈 更加了解 点击这里跳转)

对象

(个人理解:物以类聚,象从类出)
java是一个完全面向对象的编程语言,不像c是面向过程的。“对象” 这个名词对很多人来说可能都难以理解,因为它是一个抽象而又现实的概念,世上一切皆对象。我个人觉得在java中应该先理解类的概念,“类” 是人们对一系列(或单个事物)具有共同特征的事物 的抽象(物以“类”聚)。而“对象” 则是类的实例,对象具有又状态和行为(属性和方法)。创建对象的过程叫做 类的实例化(象从类出)。
Java中创建一个对象的语法

类名 对象名 = new 类的构造方法 ;例如:
Dog  d  = new Dog("wangcai", 2); //创建一个狗类的对象d,并初始化d的属性。

创建对象需要以下三步:

  1. 声明:声明一个对象,包括对象名称和对象类型。
  2. 实例化:使用关键字new来创建一个对象。
  3. 初始化:使用new创建对象时,会调用构造方法初始化对象。

匿名对象

通常来说对象除了具有属性和方法,还有其标识符(引用/名称),但在创建对象的时候可以不给 对象名称(不引用对象),这就是匿名对象。

new 类的构造方法   ;例如:
new Dog(); //创建一个狗类的对象,并初始化的属性。

类是一个模板,它描述一类对象的行为、状态和功能,是对象的抽象。

Java中定义一个类的语法:

修饰符 class 类名{ 类体 }  

类中可以包含 属性(变量)方法

成员变量:是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。如果没有给属性赋值,属性的默认值为对应类型的默认值。
类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。

方法

Java方法是语句的集合,它们在一起构成了对象的一个功能 。
方法的定义语法:

修饰符 返回值类型 方法名(参数表){方法体} 

说明:

  1. 修饰符:(这是可选的)定义了该方法的访问类型,限制方法的使用范围和使用方式。(public static)
  2. 返回值类型 :声明方法返回值类型,是方法执行后返回结果的数据类型。有些方法执行所需的操作,但没有返回值,没有返回值的类型关键字是void。
  3. 方法名:是方法的实际名称。方法名和参数表共同构成方法签名,用来调用方法。
  4. 参数表:声明调用方法时需要给方法传递参数的类型,以及传入参数在方法体重的变量名。也就是说参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
  5. 方法体:方法体包含具体的语句,方法的实现。
  6. return:是一个特殊的语句,结束方法的运行,给调用者返回执行方法后的结果 (当方法的返回值类型不是void 时,方法必须return语句以便返回结果。。如果是没有返回值(void)的方法可以写return语句,但是不可以带返回值。)
  7. 可变参数:方法的参数表的参数不确定时可以用可变参数来实现(可变参数可以是0个,或多个),可变参数的语法是:数据类型 ... 参数名称 其实可变参数就是一个一维数组,这个数组的名称就是 三个点后的名称。 //定参和变参 可以混合使用, 可变参数必须放在所有定参 的后面,而且一个方法只能有一个变参。

方法中的参数是数组时,方法中可以修改原来数组的数据,但如果参数是普通类型的数据,方法中不可修改原来的数据类型。(这句话有点绕,其实原因就是数组是被引用的。)看一下例子:

//file name : funcTest02.java
import java.util.Arrays;
public class funcTest02 {
    public static void main(String[] args) {
        int a = 12;
        int[] b = {12, 13, 14, 15};
        test01(a);   test02(b);
        //打印输出变量a,a 并没有改变
        //打印输出数组b,b 已经被改变。  
        System.out.println(a);
        System.out.println(Arrays.toString(b));
        //原因是数组存放在内存中, 而b是一个声明数组在内存中位置的一个变量,这个变量存在于 栈 中
        //所以方法中修改了数组, 其实真正的修改了数组在内存中的值。而普通的变量在方法中使用的只是变量的一个副本。
    }
    public static void test01(int a){a = 13;}
    public static void test02(int[] d){d[d.length - 1] = 1000;}

}
//结果为
//12
//[12, 13, 14, 1000]

构造方法

构造方法的一个功能:初始化属性的,创建对象的时候使用构造方法,通过构造方法给属性赋值。

定义: 访问权限 类名(属性类型 属性名, 属性类型 属性名, …….){方法体}//构造方法的方法名 和 类名一样。

在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法(方法的重载),参数表一般为类的属性。
每个类都有构造方法如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法但是这个默认构造方法 没有参数表

当存在自定义的构造方法后,默认的构造方法就不存在,如果此时需要使用没有参数表的构造方法则需要重新定义。

可以在 构造方法 中调用其他 构造方法 时要用this来代替类名,当调用类型的其他构造方法时调用语句要放在构造方法的第一行。
当构造方法被声明为private 权限时 , 外部是不能使用这个构造方法。如果一个类中 所有的构造方法都是private 权限时,则不能实例化(对象将不能创建)(?单例模式?本人还没学到不好解析)。

//eclipse 自动生成构造方法: Source –> Generate Constructor using Field –> select field to initialize –> Insertion point –> Access modifier —> OK

方法的递归

方法调用自己的方法。 (注意递归一定要有出口,至少有一个参数可以让方法返回一个确定的值避免栈溢出)

//使用递归求 5的阶乘。通过这个例子来熟悉递归
//file name: RecursionTest.java
public class RecursionTest {
    public static void main(String[] args) {
        int resultOfFactorial = funcRecursion(5);
        System.out.println(resultOfFactorial);
    }
    public static int funcRecursion( int num){
        if (num ==1){
            //递归的出口,避免栈溢出
            return 1;
        }else {
            //递归使用 funcRecursion
            return (num * funcRecursion(num -1));
        }
    }
}

方法的重载(overload)

方法的重载overload:同一个类中,存在方法名相同的,参数表不相同的,返回值无关的方法。这些方法互相成为重载方法。

方法的覆写(override)

当父类的方法没办法满足子类的需求,子类可以对父类的方法进行覆写。子类的方法和父类的方法名相同,参数表相同返回值相同,这样两个方法叫 方法覆写(重写 )。
方法覆写要满足 参数表相同和返回值类型相同 两个条件。
方法的覆写:方法复写后,子类的方法访问权限要大于等于 父类的方法(对于同名方法,子类的方法优先)

继承(extends)

当一个类型使用继承从另外一个类型中派生出来的话,这个新的类型就继承了原来的类型(父类)的所有public 和protected方法和属性。
子类一般都比父类功能多,通常称为子类是父类的拓展,子类可以有自己的属性和方法。

在方法调用的过程中,先在子类中寻找需要执行的方法,如果子类中没有相应名字的方法则通过super到父类中寻找方法。(也就是说对于子类和父类 方法同名时,优先调用子类的方法(当然通过super直接调用父类方法除外))。

java 单继承: (子类可以有自己的子类)java 中只有父子类型之分,java只允许单继承,也就是说java的子类只能有一个父类。

this 关键字

this 只能在类的方法 中使用,this 指向对象的本身,也就是对象的起始地址 (引用本身)
this 可以用来访问对象的属性和方法
this 指向 调用方法的对象。因为在对象实例化的时候,对象的名称其实真正存储的是一个对象实例化后在内存中的地址, this 就是和对象名一样的功能,指向对象实例化后在内存中的起始地址。
this 调用方法的时候一般可省略(但是对编译器而言 默认this是存在的)
当局部变量的名字和 属性名字(成员变量)相同时优先使用局部变量,为了区分属性和局部变量可以用 “this.属性名” 来调用 属性,避免因局部变量和属性名相同导致的错误。

println 在打印 this 的时候,会先查找toString 方法,如果没有打印输出对象的名称和对象在内存中的地址。 
eclipse 自动生成toString 方法: Source –> Generate toString() –> select fiield and methods… –> Insertion point —> OK

Setter和Getter

对于private属性应该提供 设置器和读取器
设置器和读取去的命名规则:
设置器setter:setName(String n), setAge(int a), setSex(char x) , 设置器返回void
读取器getter:getName() ,getAge() ,读取器返回值类型 是 属性(成员变量)的类型
一个属性(成员变量)可以 有或没有 设置器或读取器。

//eclipse 自动生成getter和setter 步骤: Source –> Generate Getters and Setters… –> Select getter and setter to create(选择要生成getter 和setter 的属性,每个变量名前面有一个三角符,可以选择单独生成getter 或 setter) –> Insertion point(选择getter 和setter 插入的位置) –>OK

JavaBean

(莫名其妙的解析)
是一种编程规则,一个类型所有的属性都是私有属性,私有属性通过setter和getter 来访问和使用的,具有默认构造方法,这样的类就叫做javaBean。
(详情见百度百科)

非访问修饰符 static(要理解:公共区)

static 修饰符,用来修饰 类方法和类变量。
Static 关键字用来声明独立于对象的静态变量,无论一个类实例化为多少个对象,它的静态变量只有一份拷贝(加载类的时候静态变量拷贝到公共区)。
静态变量也被称为类变量。局部变量不能被声明为 static 变量。
Static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量,也不能使用类中非静态的方法。静态方法从参数列表得到数据,然后计算这些数据。(指向静态方法的指针放在公共区)

对于类的静态变量和静态方法可以不创建 对象(不实例化)也可以调用(使用)。
对类变量和方法的访问可以直接使用 classname.variablename 和 classname.methodname 的方式访问。

访问控制修饰符

public 、 private、 default、protected
Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。
默认的,也称为 default,在同一包内可见,不使用任何修饰符。
私有的,以 private 修饰符指定,在同一类内可见。
共有的,以 public 修饰符指定,对所有类可见。
受保护的,以 protected 修饰符指定,对同一包内的类和所有子类可见。

修饰符同一个类同一个包子孙类其他包
publicYYYY
protectedYYYN
defaultYYNN
privateYNNN

方便对类的管理,存放类文件和编译好的.class ,有效的防止类型重名 等等功能
所有放在包中的类型第一行都需要package 关键字,加上包名来定义。
当使用包中的类的时候,必须使用import 加上“包名+类名”来引用这个类型(在同一个包中引用例外)
当不声明包的时候,会建立一个默认包(default package);

在一个类中只能通过import 引用 一个同名的类型(假如有两个同名的类,在另外一个类中只能引用其中一个)。可以类的全名使用(全名= “包名 + 类名”)。

包的命名规则
1、按照领导要求做
2、全小写:公司的域名倒过来 + 模块功能名 (例如:com.baidu.www.socket_tools)
3、包名中的单词必须符合Java变量的命名规则(每个. 分割命名 ,例如com.123gonson.www 和 命名是不合法的 )

数组

数组的概念:管理若干个相同类型的元素,数组对于每一门编程语言来说都是重要的数据结构之一
二维数组(多维数组)
二维 通俗的解释就是 一维数组的数组,三维数组 是二维数组的数组,依次类推。
关于数组详情请看 《Java 学习笔记 Day006》

java类型库

java自带的完好的类型,提供给程序员调用。通过API来学习各个类。Java API文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值