Java-6 类和对象 封装

目录

一、类定义和使用

1.1类的定义格式

1.2类的实例化

二、this引用 

三、对象的构造及初始化 

构造方法

四、封装

封装扩展之包 

五、static成员

5.1static修饰成员变量

5.2static修饰成员方法

5.3static成员变量初始化 

六、代码块 

6.1普通代码块

6.2构造代码块(比构造代码先执行)

6.3静态代码块

七、对象的打印

 


 

一、类定义和使用

1.1类的定义格式

java中定义类时需要用到class关键字,具体语法如下

// 创建类
class ClassName {
field ; // 字段 ( 属性 ) 或者 成员变量
method ; // 行为 或者 成员方法
}

class定义类的关键字,ClassName为类的名字,{}中为类的主体。

定义一个洗衣机的类:

class WashMachine {
//成员属性/字段 定义在类的里面 方法的外面
public String brand ; // 品牌
public String type ; // 型号
public double weight ; // 重量
public double length ; //
public double width ; //
public double height ; //
public String color ; // 颜色
//行为/成员方法:
public void washClothes (){ // 洗衣服
System . out . println ( " 洗衣功能 " );
}
public void dryClothes (){ // 脱水
System . out . println ( " 脱水功能 " );
}
public void setTime (){ // 定时
System . out . println ( " 定时功能 " );
}
}
注意事项
类名注意采用大驼峰定义
成员前写法统一为 public ,后面会详细解释
此处写的方法不带 static 关键字 . 后面会详细解释
一般一个文件当中只定义一个类
main 方法所在的类一般要使用 public修饰 ( 注意: Eclipse 默认会在 public 修饰的类中找 main 方法 )
public 修饰的类必须要和文件名相同
不要轻易去修改 public 修饰的类的名称,如果要修改,通过开发工具修改(如下图)
鼠标右键
类名和文件名都会被改变( 只限于一个Java文件中只有一个类的情况

1.2类的实例化

用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

class PetDog {
public String name ; // 名字
public String color ; // 颜色
// 狗的属性
public void barks () {
System . out . println ( name + ": 旺旺旺 ~~~" );
}
// 狗的行为
public void wag () {
System . out . println ( name + ": 摇尾巴 ~~~" );
}
}
public class Main {
public static void main ( String [] args ) {
PetDog dogh = new PetDog (); // 通过 new 实例化对象 dogh就是一个引用 指向了PetDog对象
dogh . name = " 阿黄 " ;
dogh . color = " 黑黄 " ;
dogh . barks ();
dogh . wag ();
PetDog dogs = new PetDog ();
dogs . name = " 阿黄 " ;
dogs . color = " 黑黄 " ;
dogs . barks ();
dogs . wag ();
}
}

 注意事项 

对象的成员属性在没有赋值的时候,引用类型为null,基本类型为对应的零型

二、this引用 

1.形参名不小心与成员变量名相同
public void setDay ( int year , int month , int day ){
year = year ;
month = month ;
day = day ;
}

解决方法:

1.变量名不一样

2.通过this引用(变量名一不一样都推荐用)

注意: this 引用的是调用成员方法的对象
            this只能在"成员方法"中使用
public void setDay ( int year , int month , int day ){
this.year = year ;
this.month = month ;
this.day = day ;
}

2.在类中方法调用其他方法

public void eat(){

        System.out.println(this.name + ": 摇尾巴~~~");

        this.show();

}

public void show(){

        System.out.println(this.name + ": 哈哈哈~~~");

}

三、对象的构造及初始化 

Java 方法内部定义一个局部变量时,必须要初始化,否则会编译失败
但是字段声明之后没有给值依然可以使用(默认初始值为对应的零型)

构造方法

构造方法 ( 也称为构造器 ) 是一个特殊的成员方法, 名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次
public class Date {
public int year ;
public int month ;
public int day ;
// 构造方法:
// 名字与类名相同,没有返回值类型,设置为void也不行
// 一般情况下使用public修饰
// 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
public Date ( int year , int month , int day ){
this . year = year ;
this . month = month ;
this . day = day ;
System . out . println ( "Date(int,int,int) 方法被调用了 " );
}
public void printDate (){
System . out . println ( year + "-" + month + "-" + day );
}
public static void main ( String [] args ) {
// 此处创建了一个 Date 类型的对象,并没有显式调用构造方法
Date d = new Date ( 2021 , 6 , 9 ); // 输出 Date(int,int,int) 方法被调用了
d . printDate (); // 2021-6-9
}
}

 注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

当调用完成构造方法之后 对象才产生了

特性
构造方法可以重载 ( 用户根据自己的需求提供不同参数的构造方法
public class Date {
public int year ;
public int month ;
public int day ;
// 无参构造方法
public Date (){
this . year = 1900 ;
this . month = 1 ;
this . day = 1 ;
}
// 带有三个参数的构造方法
public Date ( int year , int month , int day ) {
this . year = year ;
this . month = month ;
this . day = day ;
}
public void printDate (){
System . out . println ( year + "-" + month + "-" + day );
}
public static void main ( String [] args ) {
Date d = new Date ();
d . printDate ();
}
}

如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的

public class Date {
public int year ;
public int month ;
public int day ;
public void printDate (){
System . out . println ( year + "-" + month + "-" + day );
}
public static void main ( String [] args ) {
Date d = new Date ();
d . printDate ();
}
}

上述Date类中,没有定义任何构造方法,编译器会默认生成一个不带参数的构造方法

注意:一旦用户定义,编译器则不再生成。 

构造方法中,可以通过this调用其他构造方法来简化代码

public class Date {
public int year ;
public int month ;
public int day ;
// 无参构造方法 -- 内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
// 此处可以在无参构造方法中通过this调用带有三个参数的构造方法(前提是得有其他的构造方法)
// 但是this(1900,1,1);必须是构造方法中第一条语句
public Date (){
//System.out.println(year); 注释取消掉,编译会失败
this ( 1900 , 1 , 1 );
//this.year = 1900;
//this.month = 1;
//this.day = 1;
}
// 带有三个参数的构造方法
public Date ( int year , int month , int day ) {
this . year = year ;
this . month = month ;
this . day = day ;
}
}

四、封装

4.1访问限定符
Java 中主要通过类和访问权限来实现封装: 类可以将数据以及封装数据的方法结合在一起 ,更符合人类对事物的认 知,而访问权限用来控制方法或者字段能否直接在类外使用 Java 中提供了四种访问限定符:

 ///快捷键///

封装扩展之包 

包的概念:
包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式 ,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在 不同的包中即可

 

(包名内所有英文字母必须是小写)

自定义包:

1.在文件的最上方加上一个 package 语句指定该代码在哪个包中 .
2.包名需要尽量指定成唯一的名字 , 通常会用公司的域名的颠倒形式 ( 例如 com.vip.www)
3.包名要和代码路径相匹配 . 例如创建 com.vip.www 的包 , 那么会存在一个对应的路径 com/vip/www 来存储代码.
4.如果一个类没有 package 语句 , 则该类被放到一个默认包中(src).
在Tes333下就无法访问了

五、static成员

5.1static修饰成员变量

static 修饰的成员变量,称为静态成员变量 ,静态成员变量最大的特性: 不属于某个具体的对象,是所有对象所共 享的
【静态成员变量特性】
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3. 类变量存储在 方法区 当中
4. 生命周期伴随类的一生 ( 即:随类的加载而创建,随类的卸载而销毁 )
public class Student {
public String name ;
public String gender ;
public int age ;
public double score ;
public static String classRoom = "306" ;
// ...
public static void main ( String [] args ) {
// 静态成员变量可以直接通过类名访问
System . out . println ( Student . classRoom );
Student s1 = new Student ( "Li leilei" , " " , 18 , 3.8 );
Student s2 = new Student ( "Han MeiMei" , " " , 19 , 4.0 );
Student s3 = new Student ( "Jim" , " " , 18 , 2.6 );
// 也可以通过对象访问:但是 classRoom 是三个对象共享的
System . out . println ( s1 . classRoom );
System . out . println ( s2 . classRoom );
System . out . println ( s3 . classRoom );

5.2static修饰成员方法

Java 中, static 修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的 。静态成员一般是通过静态方法来访问的。
静态方法特性
1. 不属于某个具体的对象,是类方法
2. 可以通过对象调用,也可以通过类名 . 静态方法名 (...) 方式调用,更推荐使用后者
3. 不能在静态方法中 直接 访问任何非静态成员变量
public static String getClassRoom (){
System . out . println ( this );
return classRoom ;
}
// 编译失败: Error:(35, 28) java: 无法从静态上下文中引用非静态 变量 this
public static String getClassRoom (){
age += 1 ;
return classRoom ;
}
// 编译失败: Error:(35, 9) java: 无法从静态上下文中引用非静态 变量 age

4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用

public static String getClassRoom (){
doClass ();
return classRoom ;
}
// 编译报错: Error:(35, 9) java: 无法从静态上下文中引用非静态 方法 doClass()

5. 静态方法无法重写,不能用来实现多态

5.3static成员变量初始化 

注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性 静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化
1. 就地初始化
就地初始化指的是:在定义时直接给出初始值
public class Student {
private String name ;
private String gender ;
private int age ;
private double score ;
private static String classRoom = "306" ;
// ...
}

2. 静态代码块初始化

六、代码块 

使用 {} 定义的一段代码称为代码块 。根据代码块定义的位置以及关键字,又可分为以下四种:
普通代码块
构造块
静态块
同步代码块

6.1普通代码块

普通代码块:定义在方法中的代码块

6.2构造代码块(比构造代码先执行)

构造块:定义在 中的代码块 ( 不加修饰符 ) 。也叫: 实例代码块 构造代码块一般用于初始化实例成员变量
public class Student {
// 实例成员变量
private String name ;
private String gender ;
private int age ;
private double score ;
public Student () {
System . out . println ( "I am Student init()!" );
}
// 实例代码块
{
this . name = "张三" ;
this . age = 12 ;
this . sex = "man" ;
System . out . println ( "I am instance init()!" );
}
public void show (){
System . out . println ( "name: " + name + " age: " + age + " sex: " + sex );
}
}
public class Main {
public static void main ( String [] args ) {
Student stu = new Student ();
stu . show ();
}
}

6.3静态代码块

使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。

public class Student {
private String name ;
private String gender ;
private int age ;
private double score ;
private static String classRoom ;
// 实例代码块
{
this . name = "bit" ;
this . age = 12 ;
this . gender = "man" ;
System . out . println ( "I am instance init()!" );
}
// 静态代码块
static {
classRoom = "bit306" ;
System . out . println ( "I am static init()!" );
}
public Student (){
System . out . println ( "I am Student init()!" );
}
public static void main ( String [] args ) {
Student s1 = new Student ();
Student s2 = new Student ();
}
}
注意事项
1.静态代码块不管生成多少个对象, 其只会执行一次
2.静态成员变量是类的属性,因此是在 JVM 加载类时开辟空间并初始化的
3.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行 ( 合并 )
4.实例代码块只有在创建对象时才会执行

顺序:静态->实例->构造方法!!!!

七、对象的打印

如果想要默认打印对象中的属性该如何处理呢?答案:重写toString方法即可。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值