作者:gqk
本章内容:
1、 this关键字的使用
2、 引用传递的深入掌握
3、 static关键字的作用
4、 内部类
this 关键字(重点)
this这个关键字个人认为在自学中是最痛苦的,因为市面没有一本书可以把 this讲明白的,在 Java 中 this 可以作为以 下的操作使用:
访问属性、调用方法(包含了构造)、 表示当前对象。
------演示get/set中的this的用法
this()可以调用空的构造方法,this可以调用构造方法
如果使用 this 调用本类中其他构造方法的 话,则此语句必须放在构造方法的首行。
一个类中如果有多个构造方法的话,则肯定保留有一个是不用
this调用其他构造的情况,以作为出口
将 参数少的构造方法放在最前面,参数多的构造方法放在最后面。
表示当前:
this的最大用法实际上就只有一个: “表示当前对象”,包括以上的访问属性或者是调用构造等等,实际上都是此概念 的体现。当前调用类中方法的对象称为当前对象。
习题:
编写一个公司员工类 · 数据成员:员工号、姓名、薪水、部门
· 方法:、
|- 利用构造方法完成设置信息:
A 、 单 参, 只传递员工号,则员工姓名:无名氏,薪水:0,部门:未定
B 、 双 参, 传递员工号,姓名,则员工薪水为 1000,部门:后勤
C 、 四 参, 传递员工号,姓名,部门,薪水
D 、无参,则均为空值
|- 显示信息
引用传递(重点)
引用传递肯定是 Java 的核心问题,引用传递的操作的核心就是内存地址的传递,那么下面通过几道题目以及一些实 际的问题,来分析一下引用传递的作用。
class Demo{
private String str = "hello" ;
public void setStr(String str){
this.str = str ;
}
public String getStr(){
return this.str ;
}
};
public class RefDemo03 {
public static void main(String args[]){
Demo d1 = new Demo() ;
d1.setStr("world") ;
fun(d1) ;
System.out.println(d1.getStr()) ;
}
public static void fun(Demo d2){
d2.setStr("!!!") ;
}
};
--------案例 司机张三开着红色的宝马车带着女朋友rose去新疆
-------案例 分析员工和部门的关系
对象比较(重点):对象的比较就是判断两个对象的内容或者引用地址是否相同;
package demo;
public class Person {
private String name;
private int age ;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public static void main(String[] args) {
Person p1 = new Person("张三", 18);
Person p2 = new Person("张三", 18);
System.out.println(p1.equals(p2));
System.out.println(p1==p2);
}
}
static 关键字(重点)
static关键字在类中可以声明属性或方法。声明的属性将称为全局属性,声明的方法将成为类方法。
class Person {
private String name ;
private int age ;
String country = "A城" ;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public String getInfo(){
return "姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country ;
}
};
public class StaticDemo01{
public static void main(String args[]){
Person per1 = new Person("张三",20) ;
Person per2 = new Person("李四",21) ;
Person per3 = new Person("王五",22) ;
System.out.println(per1.getInfo()) ;
System.out.println(per2.getInfo()) ;
System.out.println(per3.getInfo()) ;
}
};
但是以上的程序存在了一个问题,现在的所有人的城市都是在 A 城,但是后来这个城市的名字修改成了 X 城,那么 如果现在已经产生了 500000 个Person 对象,肯定现在要修改 50000 次对象中的 country属性,因为按照内存的分配来讲, 每一个对象都单独占着各自的 country属性。
现在以上的设计根本就无法满足,因为对于 country属性而言,肯定是所有对象都是一样的,而且如果按照以上的设 计,每个对象占用每个对象自己的 country属性的话,则肯定会造成内存空间的浪费,那么就可以将 country属性设置成一 个公共属性,那么公共属性就可以使用static进行操作。
这个时候的 country属性就成为了一个公共属性,所有的对象可以同时拥有,但是一般而言这些公共属性虽然可以使 用普通的对象调用,可一般不这样操作,而是通过所有对象的最大级 —— 类,完成调用。
//static修饰属性为类的共享
package demo;
public class Person {
private static int count = 0;
public void add(){
this.count=++this.count;
System.out.println(this.count);
}
public static void main(String[] args) {
Person p = new Person();
Person p1 = new Person();
p.add();
p1.add();
}
}
static也可以修饰方法:
对于属性而言,不管是何种属性都要考虑封装,对于全局属性也不例外,那么既然全局属性可以通过类名称访问, 那么也可以使用static定义一个“类方法”,很明显此方法也可以通过类名称直接访问
static本身声明方法或声明属性,但是在方法的访问上本身也存在着问题。
1 、使用 static声明的方法,不能访问非static的操作(属性或方法)
2 、非 static声明的方法,可以访问static声明的属性或方法
主方法的组成:
public static void main(String args[])
实际上每一个修饰符或参数都是有意义的:
· public:表示外部都可以访问
· static:方法可以由类直接调用
· void:程序的起点,一旦开始了就没回头路
· main:系统规定好的默认的方法名称
· String args[]:是一个字符串数组,用于接收参数 在主方法中,可以在一个程序运行时输入多个参数,每个参数之间使用空格分隔,所有的参数都靠 String args[]进行 接收。
public class Person {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
};
习题:
现在要求完成一个用户的登陆程序,通过初始化参数,输入登陆的用户名和密码
例 如 : java LoginDemo 用户名 密码 如果用户名是 hello,密码是 gqk的话,则表示登陆成功,显示登陆欢迎的信息,如果登陆失败,则显示登陆 失败的信息
//先做简单的
//封装验证,登陆
//客户端调用
代码块:(理解)
在程序中使用“{}”括起来的一段代码就称为代码块,根据代码块出现的位置或声明的关键字的不同,分为四种:
普 通 代码块:在一个方法中定义的代码块,称为普通代码块
构造块:在一个类中定义的代码块
静 态 块 :使用static关键字声明的代码块
内部类
所谓的内部类就是指一个类的内部还包含了另外的一个操作类,被包含的类称为内部类,包含的类称为外部类。
从以上的代码中可以观察到内部类的特点:
缺 点 : 破坏了一个程序的标准结构;
优 点 :可以方便的访问外部类中的私有成员。