文章目录
第一章 面向对象
1.1 包
- 在Java中,使用包来管理类,就像在资源管理器中使用文件夹管理文件一样
- 在同一个包中,类名不能重名,在不同包中类名可以相同
我们这一阶段涉及的包:
- java.lang: java语言基础包,系统会自动导入
- java.util: 工具类
- java.io: 输入输出相关的类
- java.text: 文本处理相关的类
- java.net: 网络相关的类
- java.nath: 数学相关的类
1.1.1 包的定义
package com.bjpowernode.chapter01.packages.p1;
/*
1)使用package关键字定义包,package定义包的语句必须作为源文件的第一条语句
2)包名的命名规则:
公司域名的倒序.项目名.模块名.子模块名
包名一般情况下所有字母都小写
3)编译
javac -d . Test01.java
javac的-d参数可以指定生成字节码文件的目录
小点.代表当前目录
编译后,系统会在当前目录生成与包名对应的文件夹,把字节码文件储存在该文件夹中
4)运行
java命令后面跟完整类名
5)包名.类名.就是完整类名,即com.bjpowernode.chapter01.p1.Test01就是一个完整类名
Test01就是简易类名
*/
class Test01{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
package com.bjpowernode.chapter01.packages.p3;
public class MyUtil{
public static void sm(){
System.out.println("我是p3包中的MyUtil类的静态方法sm");
}
}
1.1.2 使用其他包的类
/*
需求:
在当前包中,使用p3包中的MyUtil类,调用它的静态方法
前提:
被使用的类必须定义为public修饰的公共类
使用方式:
1)直接使用完整类名
2)先通过import导入被使用的类,再通过简易类名访问
*/
class Test02{
public static void main(String[] args){
System.out.println("在p1包中调用p3包中的MyUtil类的静态方法");//在p1包中调用p3包中的MyUtil类的静态方法
//1)直接通过完整类名调用
com.bjpowernode.chapter01.packages.p3.MyUtil.sm();//我是p3包中的MyUtil类的静态方法sm
//2)先把其他包中的类导入,再使用简易类名调用
MyUtil.sm();//我是p3包中的MyUtil类的静态方法sm
}
}
定义的包和自带的包重复:
package com.bjpowernode.chapter01.packages.p5;
public class Rectangle {
int width;
int height;
public void show(){
System.out.println("width = "+width+", height = "+height);
System.out.println("area = "+width * height);
}
}
package com.bjpowernode.chapter01.packages.p5;
import java.awt.Rectangle;
public class Test {
public static void main(String[] args) {
//1)使用java.awt包中的Rectangle定义对象
Rectangle rect1 = new Rectangle();
//2)还想使用当前包中的Rectangle类,可以使用完整类名
com.bjpowernode.chapter01.packages.p5.Rectangle rect2 = null;
}
}
1.2 Ecilpse
1.2.1 准备工作
- 下载Ecilpse
- Eclipse neon JDK8
- Eclipse Oxygen JDK9
- Eclipse Photon JDK10
- 安装
- 不需要安装,只要解压缩即可
- 检查JDK版本是否JDK8:java -vertion
- 查看是否安装了公共的JRE:在安装目录中查看,处理jdk目录外,是否还有jre目录,如果有表示安装了公共的jre,建议重新安装JDK,不安装公共的jre
- 查看是否配置classpath环境变量
set classpath
,如果已经配置,建议你删除该环境变量
1.2.2 Eclipse的基本配置
- 设置工作区目录
Select a directory as workspase
工作区,就是创建项目默认的存储位置 - 切换java SE透视图
1.2.3 项目创建与运行
- 创建项目
在Eclipse环境中,需要把类放在项目中才能运行
保证java文件生成的字节码文件自动保存在bin目录下 - 添加类
- 运行程序
1.2.4 Eclipse首选项常用设置
1.2.5 在项目中添加已有的类
- 直接把java源文件复制到scr目录中对应的包下
- 把源码复制到scr目录中,系统会创建对应的包与源文件
在项目中添加已有的源文件,可能出现乱码,出现乱码的原因是源文件保存时编码格式与当前工作区使用的编码格式不兼容。
ANSI编码不是一种具体的文件编码,在中文windows操作系统中ANSI是默认的中文编码GBK,如果是日文操作系统ANSI编码就是日文的一种默认编码。
打开文件,另存为,选择文件的编码格式与当前工作区的编码格式一致(UTF-8),重新复制粘贴到当前项目中
1.2.6 在工作区中导入已有的项目
1.3 访问权限
1.3.1 类的访问权限
- 类的访问权限:公共类和非公共类
- 使用public修饰的类就是公共类
- 公共类的应用场景:
如果这个类想再其他包中使用,需要定义公共类;如果这个类没有使用public修饰,这个类只能在当前包中使用
1.3.2 类成员的访问权限
访问权限 | 当前类 | 当前包 | 不在当前包中的派生类 | 其他包 |
---|---|---|---|---|
私有的private | 可以 | 不 | 不 | 不 |
默认的没有权限修饰符 | 可以 | 可以 | 不 | 不 |
受保护的protected修饰 | 可以 | 可以 | 可以 | 不 |
公共的public | 可以 | 可以 | 可以 | 可以 |
访问权限遵循权限最小化原则
- 想在任意位置都可以访问就定义public公共的
- 在当前类和派生类中可以直接访问就定义为protected受保护的
package com.bjpowernode.chapter01.privilage.p3;
//在当前类中可以使用所有访问权限的成员
public class Father {
public int xx = 10; //公共的
protected int yy = 20; //受保护的
int zz = 30; //默认权限
private int tt = 40; //私有的
//在当前类中直接使用这些成员变量
public void m1(){
System.out.println(xx);
System.out.println(yy);
System.out.println(zz);
System.out.println(tt);
}
}
package com.bjpowernode.chapter01.privilage.p3;
//测试访问当前包中Father类的成员
public class Test01 {
public static void main(String[] args){
Father f = new Father();
System.out.println(f.xx);//公共的
System.out.println(f.yy);//受保护的
System.out.println(f.zz);//默认的
//System.out.println(f.tt);//私有的 :The field Father.tt is not visible
}
}
package com.bjpowernode.chapter01.privilage.p4;
import com.bjpowernode.chapter01.privilage.p3.Father;
/*
定义一个子类,继承p3包中的Father类
子类继承父类,就自动拥有了实例变量和实例方法
Son类从Father类继承了实例变量:xx,yy,zz,tt 和一个实例方法:mi()
*/
public class Son extends Father{
//在子类的方法中,访问从父类继承的成员
public void sm1(){
System.out.println(xx);//公共的
System.out.println(yy);//受保护的
//System.out.println(zz);//默认的:只能在当前包中使用
//System.out.println(tt);//私有的,只能在当前类中使用
}
}
package com.bjpowernode.chapter01.privilage.p4;
/*
* 程序调试(debug)
* 调试目的:查看程序的运行过程,以及在运行过程中各个变量的取值
* 如何调试:
* 1.添加断点
* 在某一行前面空白处双击
* run-->toggle breakpoint
* Ctrl+Shift+B
* 2.启动调试
* run-->debug
* F11
* 常用工具栏中的调试按钮
*/
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Son s = new Son();
}
}
package com.bjpowernode.chapter01.privilage.p4;
import com.bjpowernode.chapter01.privilage.p3.Father;
public class Test02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father f = new Father();
System.out.println(f.xx);//公共的
//System.out.println(f.yy);//受保护的
//System.out.println(f.zz);//默认的
//System.out.println(f.tt);//私有的
}
}
1.4 Object
Object类是java中所有类得根父类,Java中的类要么直接继承Object,要么间接继承Object类
java中类的继承是可传递的,Object类定义的方法,所有的类都能继承到
- toString方法
作用是吧对象转为字符串
应用场景:
使用System.out.println(obj)打印一个对象时,会调用对象的toString()方法,想显示对象的各个字段值,需要重写toString()
package com.bjpowernode.chapter01.object;
public class Person {
String name;
int age;
String gender;
public Person(String name, int age, String gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
//重写toString()方法
@Override
public String toString(){
return "姓名:"+name+",年龄"+age+"性别:"+gender;
}
}
package com.bjpowernode.chapter01.object;
//测试打印对象时测试对象的toString方法
public class Test01 {
public static void main(String[] args) {
// 创建Person对象
Person feifei = new Person("feifei",28,"女");
//直接把feifei打印到屏幕上
System.out.println(feifei);//com.bjpowernode.chapter01.object.Person@15db9742
System.out.println(feifei.toString());
/*
* 运行结果:com.bjpowernode.chapter01.object.Person@15db9742
* 完整类名@十六进制数
* 分析:
* 1)使用System.out.println(obj)打印一个对象,在println()方法中,会先把对象转换成字符串再打印
* 调用了String.valueof(x)方法把对象转换为字符串
* 2)在String类的valueof(x)方法中调用了对象的toString()方法把对象转换为字符串
* 3)toString是从Object类继承的,在Object类中的toString方法返回一下内容:
* getClass().getName()+"@"+Integer.toHexString(hashCode())
* 完整类名+"@"+哈希码的十六进制
* 结论:
* 使用System.out.println(obj)打印一个对象时,会调用对象的toString()方法
* 需求:
* 想打印对象时显示对象的各个字段值
* 解决方法:
* 重写toString()方法
*/
String text = "deyouli";
System.out.println(text);//deyouli,说明String类重写了toString()方法
//打印一个类的对象时如果结果显示的不是完整类名@十六进制,肯定重写了toString()方法
Integer num = new Integer("456");
System.out.println(num);//456
}
}