文章目录
第四章 Java面向对象基础
面向对象与面向过程
- 面向过程:用于结局简单问题(仅有 封装性【封装功能】)
- 面向对象:用于解决复杂问题 时面向过程的集合(封装性【功能,数据】、继承性、多态性)
对象与类
- 对象:是具体实例
- 类 :是对象的抽象化模型
类(class)
- 属性 (field):刻画对象模型特征参数
- 方法(method):刻画对象的行为特征 以及 实现的功能(就是 的类要实现的功能)
- 构造方法/构造器(constructor):对 对象的初始化
对构造方法我个人理解是:(包含构造方法的重载)
将不定属性包装整合成一个固定 集合 用于以后方法的调用与实现;
Student stu_0= new Student(sno,'name','sex');
猜测 :干啥非要包装集合(非要构造方法),个人感觉这样直接传参(可能多个构造方法)可以不用调用类中没有用的属性和方法???
类与构造方法 的几个注意点与特征:
- 一个Java文件可以有多个类
- 但是一个Java文件 只能包含一个 public class类并且必须 类名与文件名一致
-
- 构造方法名 必须与 类名 一致
- 一个类没有自定义 则会自动生成一个 无参的 构造方法
- 构造方法通过 new 关键字调用
- 构造方法不能定义返回值类型(返回值有 且 类型为 类本身类型 )
- 构造方法的重载 规则、限制 与 普通方法一样
实例:
public class User {
int id; // id
String name; // 账户名
String pwd; // 密码
public User() {
}
public User(int id, String name) {
super();
this.id = id;
this.name = name;
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public static void main(String[] args) {
User u1 = new User();
User u2 = new User(101, "高小七");
User u3 = new User(100, "高淇", "123456");
}
}
4.8 this关键字以及对象创建过程
this. 当方法参数 和 对象参数 重名时
- 在一般方法中 指向 对象变量
- 在构造方法中指向 正要初始化的对象
- 在调用重载的构造方法,并且必须放在第一位上
- this不能用于 static
对象的创建过程
-
分配对象空间,并将对象成员变量初始化为0或空
-
执行属性值的显示初始化
-
执行构造方法
-
返回对象的地址给相关的变量
//一般方法
public class User {
int id; //id
String name; //账户名
String pwd; //密码
public User() {
}
public User(int id, String name) {
System.out.println("正在初始化已经创建好的对象:"+this);
this.id = id; //不写this,无法区分局部变量id和成员变量id
this.name = name;
}
public void login(){
System.out.println(this.name+",要登录!"); //不写this效果一样
}
public static void main(String[] args) {
User u3 = new User(101,"高小七");
System.out.println("打印高小七对象:"+u3);
u3.login();
}
}
//调用重载构造方法
public class TestThis {
int a, b, c;
TestThis() {
System.out.println("正要初始化一个Hello对象");
}
TestThis(int a, int b) {
// TestThis(); //这样是无法调用构造方法的!
this(); // 调用无参的构造方法,并且必须位于第一行!
a = a;// 这里都是指的局部变量而不是成员变量
// 这样就区分了成员变量和局部变量. 这种情况占了this使用情况大多数!
this.a = a;
this.b = b;
}
TestThis(int a, int b, int c) {
this(a, b); // 调用带参的构造方法,并且必须位于第一行!
this.c = c;
}
void sing() {
}
void eat() {
this.sing(); // 调用本类中的sing();
System.out.println("你妈妈喊你回家吃饭!");
}
public static void main(String[] args) {
TestThis hi = new TestThis(2, 3);
hi.eat();
}
}
4.9 static 关键字
static 修饰的成员变量 为静态成员变量(类变量)生命周期与类一样
成员:方法/属性
特征
- 为该类的公用变量,并被该类的所有实例共享
- 静态成员变量只有一个,并被所有实例共用
- 类名.类属性/类方法
核心内容
- static 修饰的方法内只能调用 static 修饰的成员(方法/属性)
- 一般方法可以调用static 修饰的成员
- static修饰的成员变量和方法,从属于类。
- 普通变量和方法从属于对象的。
4.10 静态初始化块
static{
//只要调用或者创建 static所属的类就会执行
//这中间的内容
}
例子
public class User3 {
int id; //id
String name; //账户名
String pwd; //密码
static String company; //公司名称
static {
System.out.println("执行类的初始化工作");
company = "北京尚学堂";
printCompany();
}
public static void printCompany(){
System.out.println(company);
}
public static void main(String[] args) {
User3 u3 = new User3();
}
}
执行结果:
4.11 参数传值机制
总结
- 传递的是参数的地址 当传递中改变值时 被传递的参数的 值 也将 被改变
- 当传递过程中 new时 是的地址 改变 不会改变原本的被传递参数的 值
/**
* 测试参数传值机制
* @author 高淇
*
*/
public class User4 {
int id; //id
String name; //账户名
String pwd; //密码
public User4(int id, String name) {
this.id = id;
this.name = name;
}
public void testParameterTransfer01(User4 u){
u.name="高小八";
}
public void testParameterTransfer02(User4 u){
u = new User4(200,"高三");
}
public static void main(String[] args) {
User4 u1 = new User4(100, "高小七");
u1.testParameterTransfer01(u1);
System.out.println(u1.name);
u1.testParameterTransfer02(u1);
System.out.println(u1.name);
}
}
4.13.1 JDK中的主要包
表4-3 JDK中的主要包 |
---|
Java中的常用包 | 说明 |
---|---|
java.lang | 包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。 |
java.awt | 包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。 |
java.net | 包含执行与网络相关的操作的类。 |
java.io | 包含能提供多种输入/输出功能的类。 |
java.util | 包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。 |
4.13.2 导入类import
- 当导入中有重名时:
java.util.Date,java.sql.Date
使用精确调用 - 当要调用包中所有类时:
java.until *
但会加大 编译速度,不会增加运行速度
import java.sql.Date;
import java.util.*;//导入该包下所有的类。会降低编译速度,但不会降低运行速度。
public class Test{
public static void main(String[] args) {
//这里指的是java.sql.Date
Date now;
//java.util.Date因为和java.sql.Date类同名,需要完整路径
java.util.Date now2 = new java.util.Date();
System.out.println(now2);
//java.util包的非同名类不需要完整路径
Scanner input = new Scanner(System.in);
}
}
4.13.3 静态导入
静态导入(static import)是在JDK1.5新增加的功能,其作用是用于导入指定类的静态属性,这样我们可以直接使用静态属性。
比如之前我们调用PI需要用到 Math.PI()
现在导入后直接使用PI
即可
第四章 课后部分练习题
3.在Java中关于静态方法,以下说法中正确的是( )。(选择二项)
A.静态方法中不能直接调用非静态方法
B.非静态方法中不能直接调用静态方法
C.静态方法可以用类名直接调用
D.静态方法里可以使用this
4.下列选项中关于Java中类方法的说法错误的是( )。(选择二项)
A.在类方法中可用this来调用本类的类方法
B.在类方法中调用本类的类方法时可直接调用
C.在类方法中只能调用本类中的类方法
D.在类方法中调用实例方法需要先创建对象
5.分析如下Java程序的代码所示,则编译运行后的输出结果是( )。(选择一项)
public class Test {
int count=9;
public void count1(){
count=10;
System.out.print("count1="+count);
}
public void count2(){
System.out.print("count2="+count);
}
public static void main(String[ ] args) {
Test t=new Test();
t.count1();
t.count2();
}
}
A.count1=9; count2=9;
B.count1=10;count2=9;
C.count1=10; count2=10;
D.count1=9; count2=10;