类与对象的关系
产生一个对像必须new一次
类名首字母大写
面向对象的三大特征:封装 继承 多态
二,为什么java中需要封装?
数据的有效性和安全性
保护数据的有效性和安全性,所以java中需要封装
三,什么是封装?
第一层含义:对象的属性和方法是一个统一的整体,不可分割
第二层含义:封装是一种保护数据的机制
四,怎么样使用封装保护数据?
属性封装:
以前 String name;
现在 : (1)private String name;?//私有的,只有自己可以用,其他类拿不到对象的属性
(2)提供共有的set/get方法访问属性
总结:一个类的所有属性默认情况下都必须封装
方法封装:
(1)把方法的public 改为private
(2 )提供公有的方法间接的调用私有的方法
总结:一个类中只有不想暴露给别人的方法才需要封装
public class Test{
private String name;
private int age;
//set方法:给属性赋值
//get方法:获取属性值
//一个类的set方法格式:
public void set属性名(参数){
属性=参数值;
}
//一个类的get方法格式:
public 返回值类型 get属性名(){
return 属性;
}
public void setName(String name){
//区分属性 属性前面加this this.name 这个就是属性
//规则:取名字的规则
if(name.equals("王八蛋")){
System.out.println("名字无效");
}else{
this.name=name;
}
name=name;
}
public String getName(){
return name;
}
}
总结:一个类的所有属性默认情况下都必须封装
命名规则,驼峰规则
public //公开的意思 就可以被其他类访问
//如果一个行为没有必要暴露给别人 那么就可以吧这个行为
//设置为私有行为
private void f(){
}
如果外部需要访问怎么办?
提供公有的方法
public void r(int money ){
f();
}
一个类中的方法1调用方法2,只要写方法2的名字就可以了
-----------------------------------------------------------------------
一,为什么需要构造方法?
人-----------出生行为:产生人
对象---------出生行为:产生对象
人是人他妈生的 对象是对象他妈生的
对象必须通过出生的行为才能产生!!!
出生的行为-----构造行为-------构造方法
总计:就是因为我们要的对象必须通过构造才能产生,所以一个类必须要有构造方法
二、什么事构造方法
1构造方法是一个方法
2,构造方法是没有返回值类型,在new对象的时候被系统自动调用
返回值为空和没有返回值是两回事
三,为什么我们之前写类没有写构造方法,也可以new出对象?
(1)情况一:我们没有写构造方法
public class Person{
//我们不写构造方法,计算机自动帮我们添加的,也就是说写不写都存在
public Person(){}
}
这个构造方法写不写都存在,这个方法没有什么意思,只是为了描述对象产生的过程
(2)情况二:我们写了构造方法
public class Person{
//我们写了构造方法,系统不会再自动添加构造方法,就用我们自己定义的构造方法
public Person(){
System.out.println("对象产生了");
}
public class Test{
public staic void main(String[] args){
Person person=new Person();//自动调用无参数构造方法
}
}
}
四、怎么样写构造方法------一个类可以有多个构造方法
public 类型(参数){//参数可以有多个
//方法体-----描述对象产生的过程
}
当类有多个构造方法 是通过构造方法的参数来决定调用哪一个构造方法
构造方法,一个对象只会调用以个构造方法
五、构造方法的意义?
1、构造方法是用来描述对象出生的过程的
2、初始化对象(给属性赋值的过程就叫对象初始化)
(set方法是不是也可以对对象进行初始化)
两者有什么区别?
构造方法初始化特点:
1、构造方法只能给属性赋值 不能改变属性值
Person person=new Person("张三");
//能不能通过构造方法改变属性值?李四
//下面不是改变属性值 是产生新的对象 名字叫李四
//person =new Person(“李四”);
非法字符报错,一定是你的代码里面出现了中文
2、构造方法可以一次性给多个属性赋值
set 方法的特定:
1、一次只能给一个属性赋值
2、set方法赋值可以不断改变属性值
----------------------------------------
数据类型:基本类型和引用类型
基本类型: 8种
byte(1)short(2)int(4)long(8)
double(8),float(4),char(2), boolean(1)
基本类型就是指天生就有的 最基本的
开辟空间:定义的时候开辟内存空间 定义变量的时候
释放内存:超出变量的作用范围就会立即释放内存空间
java中内存划分为5个区域:方法区 java栈区 本地方法栈
堆区 程序计数器
1、基本类型:只会在栈中开空间
int a;
a=5;
方法中的变量为局部变量
类的属性为全局变量
变量的作用范围只会在大括号里面有效,在大括号结束后无效了
2 引用类型:除了8种基本类型 其他都是引用类型
String Scanner Random Arrays 自定义类 数组
Person person= new Person();
引用 对象
引用类型即会在堆中开空间,也会在栈中开空间
引用类型开辟内存:是在new对象的时候开辟内存空间
释放内存:当我们的引用不再指向任何的对象的时候,垃圾回收程序会在适当的时间释放内存空间
垃圾回收程序:主要用来释放栈空间
1、内存快满的时候,会执行垃圾回收程序
2、空闲的时候
person之前叫变量,现在叫引用
new Person()叫对象
什么是引用,引用什么意思
引用就是对象地址
引用类型:既会在栈中开空间也会在堆中开空间
Person person= new Person();//对象的属性是有默认值的
对象创建在堆内存中,开辟的内存空间名字是16进制的,例子0x0101
为什么名字是16进制,因为堆内存中的地址是由系统管理的,系统命名的
名字和内存地址是一个意思
三char的两重身份:本身和编码(AscII码)
AscII码:计算机专家没事干,为每一个字符设置一个编号 这个编号就叫AscII码
char c=‘a‘;
System.out.println(c);‘a‘
char c=97;
System.out.println(c);‘a‘
char c=‘a‘+3;
System.out.println(c);‘d‘//字符类型适和加法,也适合减法,除法,乘法,适合算术运算
葵花宝典:
‘A’ 65 怒我
‘a‘ 97 就去
‘0’ 48 死吧
五 ,默认值?
1、变量? 没有默认值-----定义在方法中的
int a;
System.out.println(a); 报错
2、属性?有默认值 ------定义在类中的 类中的变量叫属性,方法中的变量
int o
String null
double 0.0
char AscII码为0的字符
3,数组? 有默认值
int[] 0 double[] 0.0 String[] null
int[] arr=new int[4]
System.out.println(arr[1]);输出0
六 局部变量:指一个变量只有有限的范围内有效超出这个范围就相当于没有
情况1:
int a=100;全局变量
if(1<2){
int a=99;局部变量
}
运行:报错
原因:因为全局变量的作用范围:从他产生开始到大括号结束
这个名字为a的变量还是存在的,再去内存中定义一个相同名字的变量就会报错
情况2:
if(1<2){
int a=99;局部变量
}
int a=100;全局变量
运行:正确,
因为局部变量的无效了,即内存释放掉了,才能再创建一个名字一模一样的变量
如果一个方法变量a的还是有效的,再去定义一个变量a就会程序报错,因为一但能创建java不知道a对应的是那个内存
总结:也就说变量的有效无效本质指的是内存空间还在不在
情况3:
for(int i ; i<100;i++){
}
System.out.println(i);报错
打印a的属性:a为对象,且a类中有toString()方法
System.out.println(a); //自动调用toString方法
System.out.println(a.toString());两句代码是等价的,是一个意思
a类中没有写toString()方法,程序就会打印哈希code码,如上图
补充:
Person p=new Person();
System.out.println(p);//自动调用toString();
如果Person类中写了toString方法,就是输出toString方法的内容
如果没有定义toString方法 那么输出对象的地址的整数形式(父类的toString)