面向对象基础:类与对象、封装、构造方法、方法、重载、对象数组、this关键字、static关键字。
·类与对象
对象——人:张三、李四都是实实在在的人,有姓名、有年龄、有性别等属性,有吃喝拉撒等方法,看得见摸得着的。
类——人类:抽象的概念,规定了一些有共性的东西。
对象:是实际存在的,是一个类的事物的一个个体,也称之为类的事例。
类:规定了一组有共性的对象的模板。是对象的模板
在开发的时候,重点是放在类的设计还是对象的设计上?当然是类的设计上。
人类由什么组成呢?
·属性
·方法
类的格式:
class 类{
属性;
方法
}
类名 对象名 = new 类名();
范例:Person类
package boc01;
public class Person {
String name;//类的属性
int age;//类的属性
public void eat(){//类的方法
System.out.println( name + "正在吃饭");
}
}
创建Person类对象
package obc01;
public class OopDemo01 {
public static void main(String[] args) {
Person p1 = new Person();//Person类对象的创建
p1.name = "张三";
p1.eat();
}
}
对象的引用传递:传递的就是内存地址的使用权。
package obc01;
public class OopDemo01 {
public static void main(String[] args) {
Person p1 = new Person();//Person类对象的创建
p1.name = "张三";
p1.eat();
}
}
对象的引用传递:传递的就是内存地址的使用权
package obc01;
public class OopDemo01 {
public static void main(String[] args) {
Person p1 = new Person();//Person类对象的创建
p1.name = "张三";
Person p2 = p1;
p2.name="李四";
p1.eat();
}
}
·封装:
面向对象有三大特征:继承、封装、多态。
封装:在Java中使用private关键字对类中的属性和方法进行封装,使用private修饰的属性不能被其他类访问,使用private修饰的方法也不能被其他类访问,我们说使用private修饰的属性或者方法就是私有的。封装之后的属性使用getter和setter方法进行取得和设置属性,以便外部类可以访问。
package obc2;
public class Person {
private String name;//类的属性
private int age;//类的属性
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){//类的方法
System.out.println( name + "正在吃饭");
}
}
封装之后,我们其他类就可以通过getter和setter方法去访问类中的属性。
package obc2;
public class OopDemo01 {
public static void main(String[] args) {
Person p1 = new Person();//Person类对象的创建
p1.setName("张三");//通过setter方法设置属性值
p1.setAge(18);
p1.eat();
System.out.println(p1.getName()+"------"+p1.getAge());//通过getter方法取得属性值
}
}
那么现在问题来了,我们说,没有封装之前,直接通过p1.name取得或者设置属性的值,封装之后通过getter和setter取得和设置属性的值,这样有什么好处呢?举一个例子:一个正常人的年龄在0-100之间,现在我们可以通过程序来进行判断年龄是否合法。
·不是用封装
package obc2;
public class OopDemo01 {
public static void main(String[] args) {
Person p1 = new Person();//Person类对象的创建
p1.name = "张三";
int age = 100;
if(age >100){
System.out.println("输入的年龄不合法");
}else{
p1.age = age;
}
System.out.println(p1.name+"------"+p1.age);//通过getter方法取得属性值
Person p2 = new Person();//Person类对象的创建
p2.name = "李四";
int age2 = 90;
if(age2 >100){
System.out.println("输入的年龄不合法");
}else{
p2.age = age;
}
System.out.println(p2.name+"------"+p2.age);//通过getter方法取得属性值
}
}
不是用封装会存在有多个对象的时候需要重复编写多个年龄判断的代码,非常的繁琐。
·使用封装
package obc2;
public class Person {
private String name;//类的属性
private int age;//类的属性
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>100 || age <0 ){//封装进行校验
System.out.println("年龄不合法");
}else{
this.age = age;
}
}
public void eat(){//类的方法
System.out.println( name + "正在吃饭");
}
}
封装的好处:
·安全
·可以进行校验
在开发中,封装是必须的,封装的规则就是要使用getter和setter方法。
匿名对象:只能使用一次的对象叫做匿名对象。
package obc2;
public class OopDemo01 {
public static void main(String[] args) {
Person p1 = new Person();//Person类对象的创建
p1.setName("张三");//通过setter方法设置属性值
p1.setAge(180);
p1.eat();
System.out.println(p1.getName()+"------"+p1.getAge());//通过getter方法取得属性值
Person p2 = new Person();//Person类对象的创建
p2.setName("张三2");//通过setter方法设置属性值
p2.setAge(20);
p2.eat();
System.out.println(p2.getName()+"------"+p2.getAge());//通过getter方法取得属性值
new Person();//在开发中,只要看见new关键字就表示实例化了一个对象
new Person();//实例化了一个新的匿名对象
}
}
下一篇讲一下构造方法。