Java基础(七)

1:成员属性封装

问题:类中的属性并没进行封装处理时,外部可以直接调用,但是有可能所设置的数据是错误的数据;要想解决这样的问题可以利用private关键字对属性进行封装处理。

类中的属性和方法:

a:方法一般是对外提供服务的,所以是不会进行封装处理的;
b:属性由于其需要较高的安全性,所有往往需要对其进行保护(采用封装性);

属性封装之后外部不能直接访问:对外部不可见,类内部是可见的,想让外部可以访问封装的属性,如下:

Java基础(七)

Java基础(七)

2:构造方法与匿名对象

问题的引出:先看程序执行的步骤:

a:声明实例化对象,对象中的属性并没有任何的数据存在,都是其对应数据类型的默认值;
b:需要一系列的setter方法为类中的属性设置内容

也就是想获得一个可以正常使用的实例化对象,必须经过两个步骤可以完成;但是类中的属性有很多,这时候需要很多的setter方法,代码太过繁琐了。

在Java中为了考虑对象初始化的问题,提供有构造方法,这样就可以通过构造方法实现实例化对象中的属性初始化处理。

Java中构造方法如下:

	名称必须与类名称一致;
	
	不允许设置任何的返回值类型(没有返回值);

	是使用关键字new实例化对象的时候自动调用的;

Java基础(七)
Java基础(七)

Java基础(七)

Java所有的类中都会提供有构造方法,类中没有定义任何构造方法,那一定会默认提供一个无参的,什么都不做的构造方法

a:Java程序考虑到程序结构的完整性;

b:这个默认的构造方法是在程序编译的时候自动创建的;

c:如果在类中明确定义有一个构造方法的时候,默认的构造函数将不会被自动创建。

d :一个类总至少存在一个构造方法,永恒存在。

构造方法和普通方法的区别

a:构造方法没有返回值,而且《不可以用void》标记;

b:构造方法是在类实例化的时候调用的,而普通方法是在类对象实例化产生后调用的。

注意:构造方法是实例化对象的时候为属性设置初始化内容,而setter除了拥有设置数据功能,还有修改数据的功能。

3:匿名对象

定义:只是通过实例化对象进行类的操作,而这种形式的对象由于没有名字就成为匿名对象。

new Person("张三",10).tell(); 

//但是由于此对象没有任何的引用名称,所以该对象使用一次后就成为了垃圾,而所有的垃圾被GC进行回收与释放。



匿名对象举例:

class Message{
	private Strng title;
	public Message(String t){
		titlle = t;
	}
	public String getTitle(){
		return title;
	}
	public void setTitle(String t){
		title = t;
	}
}
class Person{
	private String name;
	private int age;
	public Person(Message msg,int a){
		name = msg.getTitle();
		age = a;
	}
	public Message getInfo(){
		return new Message(name+":" +age);//匿名对象出现
	}
}
public class Demo{
	public static void main(String args[]){
		Message msg = new Message("mldn");
		Person per = new Person(msg,20);
		msg = per.getInfo();
	}
}

Java基础(七)
只要是方法都可以传递任意的数据类型(基本数据类型,引用数据类型)

4:this关键字

使用this可以实现三类结构的描述:

Java基础(七)

1:this.属性

在Java程序中“{ }”是作为一个结构体的边界符,那么在程序里面当进行变量(参数,属性都成为变量),使用的时候都会以“{ }”作为一个查找边界,所以按照就近取用的原则。

class Person{
	private String name;
	private int age;
	public Person(String name,int age){
		this.name = name;
		this.age = age;
	}
}

2:使用this调用方法

2-1:构造方法调用:使用关键字new实例化对象的时候才会调用构造方法;所以对于构造方法的调用,肯定要放在构造方法中执行。

现在有一个需求:一个类中定义了三个构造方法,但是要求不管调用哪个构造方法,都执行一行输出语句“一个新的实例化对象”。

a:不用this的做法:

class Person {
	private String name ;
	private int age ;
	public Person() {
		System.out.println("*** 一个新的Person类对象实例化了。") ;
	}
	public Person(String name) {
		System.out.println("*** 一个新的Person类对象实例化了。") ;
		this.name = name ;
	}
	public Person(String name,int age) {
		System.out.println("*** 一个新的Person类对象实例化了。") ;
		this.name = name ;
		this.age = age ;
	}
	public void tell() {
		System.out.println("姓名:" + this.name + "、年龄:" + this.age) ;
	}
	// setter、getter略
}
public class JavaDemo {	// 主类
	public static void main(String args[]) {
		Person per = new Person("王五") ;
		per.tell() ;
	}
} 

b:用this的做法(
this语句只允许放在构造方法的首行;
构造方法互相调用时请保留有程序的入口,别形成死循环。

class Person {
	private String name ;
	private int age ;
	public Person() {
		System.out.println("*** 一个新的Person类对象实例化了。") ;
	}
	public Person(String name) {
		this() ;	// 调用本类无参构造
		this.name = name ;
	}
	public Person(String name,int age) {
		this(name) ;	// 调用单参构造
		this.age = age ;
	}
	public void tell() {
		System.out.println("姓名:" + this.name + "、年龄:" + this.age) ;
	}
	// setter、getter略
}
public class JavaDemo {	// 主类
	public static void main(String args[]) {
		Person per = new Person("王五",10) ;
		per.tell() ;
	}
} 

总结:
a:代码的结构可以重用,提供的是一个中间独立的支持;
b:我们的目标:没有重复。

2-2:普通方法调用(this.方法名称):实例化对象产生之后就可以调用普通方法。

class Person{
	private Person name;
	private int age;
	public Person(String name,int age){
		this.setName(name);
		set.Age(age);  //加不加都表示本类方法
	}
	public void setName(String name){
		this.name = name ;
	}
	public void setAge(int age){
		this.age = age;
	}
}

3:this表示当前对象

定义:对于当前正在访问类中方法的对象就可以称为当前对象,而this就可以描述出当前对象的内容。

class Message {
	private Channel channel ; // 保存消息发送通道
	private String title ;	// 消息标题
	private String content ;	// 消息内容
	// 4、调用此构造实例化,此时的channel = 主类ch
	public Message(Channel channel,String title,String content) {
		this.channel = channel ; // 保存消息通道
		this.title = title ;
		this.content = content ;
	}
	public void send() {
		// 6、判断当前通道是否可用,那么此时的this.channel就是主类中的ch
		if (this.channel.isConnect()) {	// 如果连接成功
			System.out.println("【消息发送】title = " + this.title + "、content = " + this.content) ;
		} else {	// 没有连接
			System.out.println("【ERROR】没有可用的连接通道,无法进行消息发送。") ;
		}
	}
}
class Channel {
	private Message message ;	// 消息发送由Message负责
	// 2、实例化Channel类对象,调用构造
	public Channel(String title,String content) {
		// 3、实例化Message,但是需要将主类中的ch传递到Message中、this = ch
		this.message = new Message(this,title,content) ;
		// 5、消息发送
		this.message.send() ;	// 发送消息
	}
	// 以后在进行方法创建的时候如果某一个方法的名称以is开头一般都返回boolean值
	public boolean isConnect() {	// 判断连接是否创建,如果创建可以发送
		return true ;
	}
}
public class JavaDemo {
	public static void main(String args[]) {
		// 1、实例化一个Channel对象
		Channel ch = new Channel("MLDN运动会","大家一起跑步30公里。") ; // 实例化Channel对象就表示要发送消息
	}
}