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关键字声明的代码块    

 


内部类

所谓的内部类就是指一个类的内部还包含了另外的一个操作类,被包含的类称为内部类,包含的类称为外部类。

从以上的代码中可以观察到内部类的特点: 
 缺 点 : 破坏了一个程序的标准结构;   
 优 点 :可以方便的访问外部类中的私有成员。

 

posted @ 2018-09-11 15:14  少侠gqk  阅读(615)  评论(0编辑  收藏  举报