今天第一天写文章,肯定是先写基础的。但是先写哪儿的基础呢,想来想去肯定是要先面向对象部分的。
先介绍一下java面向对象的三大特性:
1.封装
先看个例子:
public class Test {
public static void main(String[] args) {
//创建一个对象
Student zhangsan = new Student();
/*
zhangsan.id = 1001;
zhangsan.name = "张三";
zhangsan.sex = true;
zhangsan.address = "北京";
zhangsan.age = 20;
*/
zhangsan.setId(1001);
zhangsan.setName("张三");
zhangsan.setSex(true);
zhangsan.setAddress("北京");
zhangsan.setAge(-20);
System.out.println("id=" + zhangsan.id);
System.out.println("name=" + zhangsan.name);
System.out.println("sex=" + zhangsan.sex);
System.out.println("address=" + zhangsan.address);
System.out.println("age=" + zhangsan.age);
}
}
class Student {
//学号
private int id;
//姓名
private String name;
//性别
private boolean sex;
//地址
private String address;
//年龄
private int age;
//设置学号
public void setId(int studentId) {
id = studentId;
}
//读取学号
public int getId() {
return id;
}
public void setName(String studentName) {
name = studentName;
}
public String getName() {
return name;
}
public void setSex(boolean studentSex) {
sex = studentSex;
}
public boolean getSex() {
return sex;
}
public void setAddress(String studentAddress) {
address = studentAddress;
}
public String getAddress() {
return address;
}
public void setAge(int studentAge) {
if (studentAge >=0 && studentAge <=120) {
age = studentAge;
}
}
public int getAge() {
return age;
}
}
从以上代码可以看出,student的各类属性都被隐藏了,只提供了set和get方法,这样就无法直接给属性赋值了,并且age属性加上了相关的验证,将不符合的数据会过滤掉,不会直接赋给age属性。这就是java的封装性!封装其实就是封装属性,让外界知道的越少越好。
总结为:封装属性,暴露方法。
2.继承
再看一段代码:
class A{
public void eat(){
System.out.println("吃饭");
}
public void drink(){
System.out.println("喝水");
}
}
class B{
public void eat(){
System.out.println("吃饭");
}
public void drink(){
System.out.println("喝水");
}
public void dance(){
System.out.println("跳舞");
}
}
上面有一个A类,里面有吃饭、喝水两个方法。还有一个B类,里面也需要吃饭、喝水两个方法,但是不同的是还有个唱歌方法。但是这样的代码就会发现有很多的重复部分,那有没有更加简洁的写法呢?下面就是java的第二个特性,继承,看下面代码:
class A{
public void eat(){
System.out.println("吃饭");
}
public void drink(){
System.out.println("喝水");
}
}
class B extends A{
public void dance(){
System.out.println("跳舞");
}
}
看到上面代码后可以发现,我们把吃饭和喝水两个方法在B中直接省略了,取而代之的是在类后面加上了extends关键字和A的类名。下面来测试一下:
public static void main(String args[]){
B b=new B();
b.eat();
b.drink();
b.dance();
}
看一下结果:
吃饭
喝水
跳舞
这时初学者会奇怪,在B中没有吃饭和喝水两个方法啊,为什么能调用呢?这就是java的继承特性!在这儿简单说一下就是子类继承了父类,就可以调用父类中的方法。后面我将再写一篇文章谈一下继承。继承就是增加了类的可重用性,java中的类只支持单继承,但是可以多实现,接口之间可以多继承,这也将在后面进行探讨。
3.多态
多态其实就是多种状态的含义,如我们方法重载,相同的方法名称可以完成不同的功能,这就是多态的一种表现,此时称为静态多态。如:
class Person{
public void eat(){
System.out.println("吃饭");
}
public void eat(String food){
System.out.println("吃"+food);
}
}
测试类:
public static void main(String args[]){
Person p=new Person();
p.eat();
p.eat("汉堡");
}
看下结果:
这儿就看出来了,调用了相同的方法,区别在于参数不同,所以方法的重载也是多态的一种体现。
再看一个:
class Person{
public void eat(){
System.out.println("吃饭");
}
}
class Child extends Person{
@Override
public void eat(){
System.out.println("吃水果");
}
}
class Man extends Person{
@Override
public void eat(){
System.out.println("吃大饼");
}
}
测试一下:
public static void main(String args[]){
Person p=new Person();
p.eat();
Person p1=new Child();
p1.eat();
Person p2=new Man();
p2.eat();
}
可以看到,都是Person类,调用的都是eat()方法,但是给出的结果也是不一样的。在这儿,eat()方法具体的执行,是由实现类去决定的。简单的说就是,父类引用指向子类对象。
多态的条件是:有继承或实现,有方法覆盖或实现,父类对象(接口)指向子类对象。
今天就写这么多吧,第一天写博客,写的很浅,写的也不是很好,不过我会努力的,以后尽量每天一篇,把我会的,正在学习的,工作用到的,争取都写上来!