Java:面向对象——封装

类的实例化就是对象==>对象即可操作属性,方法==>类中的属性不能修改==>解决办法:封装特性(对外不可见,对内可见)
封装
属性封装:private 属性类型 属性名称;属性必须封装
方法封装:private 方法返回值 方法名称(参数列表){};方法视情况封装

                      

私有属性不能访问:

方法1:通过public setter和getter方法

方法2:使用类的构造方法(目的:为类中的属性进行初始化)

格式

class 类名称{

      访问权限 类名称(类型1 参数1,类型2 参数2){
         程序代码;//构造方法没有返回值

   }

}
注:访问权限 public private

构造方法的特性:

1)构造方法的名称必须和类名称一致
2)构造方法的声明处不能有任何返回值类型的声明
3)构造方法不能用return返回值
4)类中声明了一个构造方法时,程序在编译时即不再生成一个默认的构造方法(无参),即一个类中至少有一个构造方法
5)构造方法重载——只要每个构造方法的参数,类型,或者参数个数不同,即可实现重载
6)注意构造方法的重载(构造方法实例化时需要满足其中一个构造方法)


构造方法私有化如何解决?※※※

现状:构造方法私有后,不能用new实例化

解决方法:

1)在类内部实例化一个类的对象

2)在类的内部增加1个public方法做桥梁
3)在类内部对属性增加setter和getter方法


java设计模式 ==>程序设计模式:单例设计模式,不管有多少对象,实际上只有1个实例。

static 关键字

作用范围:1)使用static声明属性:在类中使用static声明属性,则此属性称为全局属性(静态属性)

私有属性加static的好处(加不加static,工作范围都是整个类里面?为什么要加)

①对应JVM来说节省空间


全局数据区(data segment):保存static类型的属性,代码中定义的长量,不释放

栈内存空间:保存所有对象名称(即对内存空间的引用地址),程序执行结束之后即引用结束

堆内存空间:保存每个对象的具体属性内容即new的数据,若堆内存数据无引用,JVM的gc线程依据回收策略则会回收掉

全局代码区(code segment):保存所有方法的二进制代码,而且是多个对象共享一个代码空间区域

(代码编译,即存入代码数据区,类型,属性,方法需要实例化对象之后才能存入对应的全局数据区,堆区及栈区)

作用范围:2)使用static声明方法

static声明的方法称为类方法,可由类名称直接调用==>类名.方法名

//类方法调用

Person.setCountry("nanjing");

System.out.println(Person.getCountry());

非static声明的方法称为普通方法==>对象名.方法名
//普通方法调用
Person per1=new Person(“zhangsan”,10);
per1.tell();


面试题:static属性,方法和非static属性,方法总结 

1)类中普通方法调用static属性,代码不报错(原因)
//普通方法调用
Person per1=new Person(“zhangsan”,10);==>jvm原理工作
per1.tell();
总结:非static声明的方法可以调用static声明的属性或方法

2)类中类方法调用非static属性,代码报错(原因)
//类方法调用
Person.setCountry("nanjing");
System.out.println(Person.getCountry());
总结:static声明的方法不能调用非static类型声明的属性或方法,原因是类中的所有属性和方法必须在对象开辟堆内存后才可调用,而static类型的方法在对象未被实例化时就可被类名调用;故若直接用static方法调用非static操作,则有可能在属性和方法还没有被初始化就被调用了,程序必将出错。

作用范围:3)static相关应用
static-main方法
public static void main(String[] args){
}
public:表示此方法可以被外部调用
static:表示此方法可以由类名称直接调用
void:主方法是程序的起点,不需要任何返回值 *
main:系统规定的默认调用的方法名称 *

面试题:统计类被实例化的次数  *

匿名对象:没有明确给出名称的对象,一般只用一次,而且匿名对象只在堆内存总开辟空间,不存在栈内存的
引用  ==>new Person("youceedu",10)
   ↓
this关键字

作用:
1)表示本类中的属性
2)可以使用this调用本类的构造方法
总结:
1)构造方法在实例化对象时被自动调用,即构造方法优先调用,故this调用构造方法必须也只能在构造方法的首行
2)this调用构造方法时一定要留一个构造方法作为出口,即程序中至少存在一个构造方法是不使用this调用其他构造方法的。
注:代码开发中建议使用this
3)表示调用的是本类的方法
4)this表示当前的对象

内部类:
类内部可定义成员变量与方法,而且在类内部也可定义一个类
格式:
标识符 class 外部类名称{
    外部类成员
标识符 class 内部类名称{
   内部类成员
}
}
总结:
1)类是有属性和方法组成的,内部类存在其实已经破坏了类的基本结构(缺点)内部类可访问外部类中的私有属性
2)static内部类不能访问非static属性和方法
3)外部类访问内部类
格式: 外部类 外部类对象=new 外部类();
       外部类.内部类 内部类对象=外部类实例.new 内部类();
  内部类实例.方法名();
外部类访问内部类   

代码块

代码块是指用“{}”括起来的一段代码,根据位置和声明的关键字不同,可分为:

普通代码块:直接在方法中定义的{}代码
构造块:直接在类中定义的{}代码,构造块优先于构造方法执行,且每次实例化对象时都会执行构造块代码,会执行多次
静态代码块:使用static关键字声明的{}代码,静态代码块优先于主方法执行;类中定义的静态代码块会优先于构造块运行,同事不管有多个对象,静态代码块只执行1次。

实例化两次代码块
1.主类
主类中--静态代码块优先主方法运行
主类代码块
2.普通类
静态代码块--不管实例化几次,静态代码块只执行1次
static{//不管实例化几次,静态代码款只执行1次
   System.out.println("类定义的静态代码款");
   }
 
构造快:实例化N次,构造快执行N次 
{//实例化N次,构造快执行N次
   System.out.println("构造快");
   }
   
代码块执行顺序:静态代码块>构造块>构造方法>普通方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值