javaSE面向对象初级02
作者: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关键字声明的代码块
内部类
所谓的内部类就是指一个类的内部还包含了另外的一个操作类,被包含的类称为内部类,包含的类称为外部类。
从以上的代码中可以观察到内部类的特点:
缺 点 : 破坏了一个程序的标准结构;
优 点 :可以方便的访问外部类中的私有成员。