1:成员属性封装
问题:类中的属性并没进行封装处理时,外部可以直接调用,但是有可能所设置的数据是错误的数据;要想解决这样的问题可以利用private关键字对属性进行封装处理。
类中的属性和方法:
a:方法一般是对外提供服务的,所以是不会进行封装处理的;
b:属性由于其需要较高的安全性,所有往往需要对其进行保护(采用封装性);
属性封装之后外部不能直接访问:对外部不可见,类内部是可见的,想让外部可以访问封装的属性,如下:
2:构造方法与匿名对象
问题的引出:先看程序执行的步骤:
a:声明实例化对象,对象中的属性并没有任何的数据存在,都是其对应数据类型的默认值;
b:需要一系列的setter方法为类中的属性设置内容
也就是想获得一个可以正常使用的实例化对象,必须经过两个步骤可以完成;但是类中的属性有很多,这时候需要很多的setter方法,代码太过繁琐了。
在Java中为了考虑对象初始化的问题,提供有构造方法,这样就可以通过构造方法实现实例化对象中的属性初始化处理。
Java中构造方法如下:
名称必须与类名称一致;
不允许设置任何的返回值类型(没有返回值);
是使用关键字new实例化对象的时候自动调用的;
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();
}
}
只要是方法都可以传递任意的数据类型(基本数据类型,引用数据类型)
4:this关键字
使用this可以实现三类结构的描述:
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对象就表示要发送消息
}
}