一.类的定义和使用
1.定义类的格式
//关键字 //类名
Class ClassName{
field; //字段/属性/成员变量(前面写public)
method; //行为/成员方法(不带static)
}
package Dog;
import java.util.Scanner;
class Doggs{
//成员变量,可以不赋初值
public String name;//默认为null
public String color;
public int age;//默认为0
public boolean male;//默认为false
//成员方法
public void show(){
int bone=3;//局部变量,需要赋初值
System.out.println("姓名:"+name+" 颜色:"+color+" 年龄:"+age);
System.out.println("有"+bone+"根骨头");
}
public void eat(){
System.out.println(name+"正在吃饭");
}
}
2.注意
1.一般一个文件中只定义一个类;
2.main方法所在的类一般要使用public修饰(Eclipse默认会在public修饰的类中找main方法);
3.public所修饰的类名必须要和文件名相同;
4.不要轻易修改public所修饰的类的名称,要通过开发工具修改;
5.类中定义的成员变量都有默认值;
6.类的命名规则:使用有意义的大驼单词命名法,每个单词的首字母都要大写;
二.类的实例化
1.概念
定义了一个类,就相当于在计算机中定义了一种新的类型,用类类型创建对象的过程,称为类的实例化。
public class Dog{
public static void main(String[] args) {
Doggs dog1=new Doggs();
Scanner scan = new Scanner(System.in);
dog1.name=scan.next();
dog1.color=scan.next();
dog1.age=scan.nextInt();
dog1.show();
dog1.eat();
Doggs dog2=new Doggs();
dog2.show();
dog2.eat();
}
}
2.注意
1.使用.(点操作符)访问对象的属性和方法;
2.同一个类可以创建多个实例;//如:同样是狗,颜色和年龄可能有所不同
3.说明
1.类只是一个模型一样的东西;
2.类是一种自定义类型,可以用来定义变量;
3.一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,储存类成员变量;
三.this引用
1.概念
this引用指向当前对象(成员方法运行时调用该成员方法的对象)。在成员方法中所有成员变量的操作,都是该引用去访问。
2.特性
1.this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型;
2.只能在成员方法中使用;
3.在成员方法中,this只能引用当前对象,不能再调用其他对象;
4.this是成员方法第一个隐藏的参数,编译器会自动传递,在成员方法执行时编译器会负责将调用成员方法对象的引用传递给该成员,this负责接收;
四.对象的构造及即初始化
1.如何初始化对象
(1)默认初始化
Dog dog3=new Dog("小白","白色",2,false);
在JVM层面:
1.检测对象对应的类是否加载了,如果没有加载则加载;
2.为对象分配内存空间;
3.处理并发安全问题;
4.设置对象头信息;
5.调用构造方法,给对象中的各个成员赋值
(2)就地初始化
即在声明成员变量时就直接给出初始值
//注:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中
2.构造方法
1.绝大多数情况下用public修饰,特殊情况下会被private修饰
2.构造方法可以重载
public Dog(){
this.name="大黄";
this.age=3;
}
public Dog(String name,int age){
this.name=name;
this.age=age;
}
3.可以通过调用其他构造方法来简化代码
public Dog(){
this("大黄",40);
}
public Dog(String name,int age){
this.name=name;
this.age=age;
}
3.注意
1.构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间;
2.名字和类相同,没有返回值类型(设为void也不行);
3.一般情况下用public修饰;
4.创建对象时由编译器自动调用,并在对象的生命周期内只调用一次;
5.可以重载;
6.没有写构造方法时,编译器会默认存在一个;只要存在任何一种构造方法,编译器都不会再提供不带参数的构造方法;
五.封装
1.概念
简单来说是用罩子屏蔽细节;
将数据和操作数据的方法有机结合,隐藏对象的属性和细节,仅对外公开接口来和对象进行交互。
2.访问限定符
范围\限定符 | private | default | protected | public |
同包同类 | √ | √ | √ | √ |
同包异类 | √ | √ | √ | |
异包子类 | √ | √ | ||
异包非子类 | √ |
3.说明
1.protected主要用在继承当中;
2.default权限指什么都不写时的访问权限;
3.访问权限除了可以限定类中成员的可见性,也可以控制类的可见性;
4.包(扩展)
(1)概念
包是对类、接口等的封装机制的体现,是一种对类或者接口等是很好的组织方式;在同一个工程中允许存在相同名称的类,只要处在不同的包中即可(如果不同包有同名类,后续使用时可能会出现歧义导致编译出错,详见下(2))
(2)导入包中的类
public class Time {
public static void main(String[] args) {
java.util.Date date =new java.util.Date();
System.out.println(date.getTime());
}
}
import java.util.Date;
public class Time{
public static void main(String[] args) {
Date date=new Date();
System.out.println(date.getTime());
}
}
import java.util.*;//导入了java.util中的所有类,但是用到哪个才会调用哪个
public class Time{
public static void main(String[] args) {
Date date=new Date();
System.out.println(date.getTime());
}
}
//容易出现冲突(异包同名类)
import java.util.*;
import java.util.sql.*;
public class Time{
public static void main(String[] args) {
Date date=new Date();
System.out.println(date.getTime());
}
}
import static java.lang.Math.*;
public class math{
public static void main(String[] args) {
double x=30,y=40;
double ret=sqrt(pow(x,2)+pow(y,2));
System.out.println(ret);
}
}
//import和C++中的include差别很大,C++必须用include引入其他文件内容,但是java不需要。import只是为了写代码更加方便,类似于using namespace
(3)自定义包
1.在文件最上方加一个package语句指定该代码在哪个包中;
2.包名需要尽量指定唯一的名字,通常会用公司域名的颠倒形式(如:com.baidu.www);
3.包名要和代码的路径相匹配;
4.如果一个类没有package包,则该类被放到一个默认包中
(4)包的访问控制权限举例
(5)常见的包
包名 | 作用 |
java。util | 这个包下包含java的大量工具类/接口和集合框架类/接口。如Arrays和List、Set等。 |
java.io | 这个包含了一些Java输入/输出编程相关的类/接口。 |
java.net | 这个包下包含了一些Java网络编程相关的类/接口。 |
java.sql | 这个包下包含了java进行JDBC数据库编程的相关类/接口。 |
javax.swing | 这个包下包含了Swing图形用户界面编程的相关类/接口,这些可用于构建平台无关的GUI程序。 |
java.awt | 这个包下包含了抽象窗口工具集(Abstract Window Toolkits) 的相关类/接口, 这些类主要用于构建图形用户界面(GUI)程序。 |
java.text | 这个包下包含一些Java格式化相关的类。 |
java.lang | 这个包下包含了Java语言的核心类,如String、Math、Sytem和Thread类等,使用这个包无需使用import语句导入,系统会自动导入这个包中的所有类。 |
六.static成员
1.static修饰成员变量
1.static修饰的成员变量称为静态成员变量/类变量
2.注意
(1)static修饰的成员变量不属于某个具体的对象,不依赖于对象,不储存在某个对象的空间中,而是所有对象所共享的,是类的属性;
(2)可以通过对象访问,也可以通过类名访问(更推荐后者);
(3)类变量储存在方法区中;
(4)类变量的生命周期伴随类的一生(类加载时创建,结束时销毁);
2.static修饰成员方法
//静态的方法不需要对象调用,如果直接调用一个需要对象的——不行!
//在依赖于对象的方法中,可以调用一个静态方法