类
类的概念:类是用来对一个实体(对象)进行描述的,主要描述该对象的属性,功能等。
类的定义和实例化
定义
定义类需要用到class关键字
(大驼峰定义)for example:class Dog...
初步了解一下:
Dog为名字,{}内部为类的主体
class Dog{
public int a;
private double b;
float c;
public Dog(int a,double b,float c){
this.a=a;
this.b=b
this.c=c;
}
public int setA(int a){
return a;
}
...
}
类中的变量称之为成员变量;
要与局部变量做区分,局部变量需要手动初始化才能使用,成员变量如果没有初始化系统将使用默认初始化:
初始化分为就地初始化(创建时直接赋值)、默认初始化,运用构造方法
类中的方法称之为成员方法,类中还有构造方法等
鼠标右键点击包,然后NEw,然后Java class创建类
public class Dog {
public String color;
public String gender;
public int age;
public String name;
public Dog(String color, String gender, int age, String name) {
this.color = color;
this.gender = gender;
this.age = age;
this.name = name;
}
}
构造方法
这里面有构造方法和成员变量;
构造方法:名字需要与类名一样。
构造方法作用:用于初始化成员变量
类的实例化
用类创建出对象就是类的实例化
实例化对象需要用到new关键字,举例如下:
使用“.”去访问类中的属性和方法(如dog1.age)
this关键字
这两个类区别在于第二个中构造方法中的参数列表名字与成员变量相同;这就涉及到了this关键字。如果没有这个关键字,那么第二个类中初始化就会不成功;this引用指向当前对象(成员方法运行时调用该成员方法的对象)
就像这样,我明明初始化age为18,但就是输出个0;
但我用this后:
用之后相同的名字所代表的含义是不同的,这里this.age指的是dog1中的age
this只能出现在成员方法中,且只能引用当前对象不能引用其他对象,this也不能用于静态区,否则报错 。this依赖于对象!!!!
当this出现在构造方法中,若引用其他构造方法必须在第一行(形式为(this(type x...)),否则报错
封装
访问限定符
可以用于变量,方法,类,(什么不写就是default)
包
在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:
个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
导包
Java 中已经提供了很多现成的类供我们使用. 例如Date类:可以使用 java.util.Date 导入 java.util 这个包中的 Date类.
public class Test {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
但是这种写法比较麻烦一些, 可以使用 import语句导入包.
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date date = new Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
自定义包
在文件的最上方加上一个 package 语句指定该代码在哪个包中.
包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.bit.demo1 ).在文件的最上方加上一个 package 语句指定该代码在哪个包中.
包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.bit.demo1 ).
3. 在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可
static关键字
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3. 类变量存储在方法区当中
4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。
1. 不属于某个具体的对象,是类方法
2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
3. 不能在静态方法中访问任何非静态成员变量
public static String getClassRoom(){
System.out.println(this);
return classRoom;
}
// 编译失败:Error:(35, 28) java: 无法从静态上下文中引用非静态 变量 this
public static String getClassRoom(){
age += 1;
return classRoom;
}
// 编译失败:Error:(35, 9) Java:java: 无法从静态上下文中引用非静态 变量 age
代码块
使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:
普通代码块、构造块、静态块、同步代码块。
普通代码块:定义在方法中的代码块
构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
静态代码块不管生成多少个对象,其只会执行一次
静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
实例代码块只有在创建对象时才会执行