2021-01-31

面向对象

一.封装private

如何避免语法出现逻辑错误?

class Person{ 
private String name ; // 表示姓名 
private int age ; // 表示年龄 
void tell(){ 
    System.out.println("姓名:" + name + ";年龄:" + age) ;
     } 
};

public class Demo{ public static void main(String args[]){
Person per = new Person() ; 
per.name = "张三" ; 
per.age = -30 ; 
per.tell() ; 
    }
 };

以上代码虽然没有语法错误,但是出现了逻辑错误(年龄:-30)

改正:

class Person{
private String name ; // 表示姓名 
private int age ; // 表示年龄 
void tell(){ System.out.println("姓名:" + getName() + ";年龄:" + getAge()) ;
  }

public void setName(String str){
 name = str ; 
  }

public void setAge(int a){
if(a>0&&a<150) age = a ;
  }

public String getName(){ 
return name ; 
  }

public int getAge(){ return age ; 
  } 
};

public class OODemo10{ public static void main(String args[]){ 
Person per = new Person();
per.name = "张三";
per.age = "-30";
per.tell();

为了避免逻辑错误,我们对属性进行封装,并对get和set方法进行设置。

二.static静态

static表示静态,可以用来修饰成员变量和成员方法

被static修饰的变量或方法不需要依赖于对象进行访问,只要类被加载了,就可以通过类名来访问

访问时:静态不能访问非静态,非静态可以访问静态

例如:

public class Demo3 {

	public static void main(String[] args) {
           staticDemo.say();//可以直接通过类名进行访问
}


class staticDemo{
   static void say(){     //static修饰的方法
      System.out.println("hh")
   }
}

static void say2(){
    System.out.println("mm")
   }
}

 

三.权限修饰符

 

 

四.抽象类

1)概念:是指必须被abstract class声明的类

一个抽象类可以没有抽象方法

格式:

abstract class 类名{
   //抽象类
}

2)抽象方法

只声明而未实现的方法(未实现:没有{}方法体),并且抽象方法必须使用abstract修饰

例如:

abstract class 类名{
    public abstract void 方法名();//只声明而未实现的抽象方法
}

 

3)抽象类原则

  1.本身是不能直接被实例化操作的(例如person p = new person())

  2.抽象类必须被子类继承,如果子类是非抽象类,必须重写父类中的全部抽象方法。

 

4)常见的问题

  1.抽象类不能用final修饰,final修饰的类是没有子类的,而抽象类必须有子类才有意义。

  2.抽象类是可以有构造方法的,子类对象实例化的流程与普通类的继承是一样的,都要先调用父类的构造方法(默认是无参的),之后再调用子类自己的构造方法

 

5)抽象类和普通类的区别

 1.抽象类必须用public或protected修饰,如果用private修饰,子类是无法继承的,也就无法实现抽象方法。缺失时默认是public

 2.抽象类不可以使用new关键词来创造对象,但是子类创建对象时,抽象父类也会被jvm实例化

 3.如果一个子类继承一个抽象类,那么必须继承其所有抽象方法,如果有未实现的抽象类方法,子类也必须定义为abstract。

 

 

五.接口

1).接口的概念:

 如果一个类中的全部方法都是抽象的,全部属性都是全局常量,那么就可以将这个类定义为一个接口

格式:

inferface 接口名称{
   全局常量;//public static final
   抽象方法;
}

2)全局常量和抽象方法的简写

 1.全局常量编写时,可以省略public static final关键词,

    例如:public static final String person = "内容";

          简写后:String person = "内容";

 2)抽象方法编写的时候可以省略public abstract 关键词,

    例如:public abstract void say();

          简写后:void say();

 

3).接口的实现implements

  接口可以多实现

   格式:

               class 子类 implements 父接口1,父接口2...{

}

 如果一个类既要实现接口,又要实现继承,按照以下格式写

   class 子类 extends 父类 implements 父接口 1,父接口2...{

}

 

4).接口的继承

  因为接口都是抽象部分,不存在具体实现,所以允许多继承

    interface c extends A,B...{

}

 

5).接口与抽象类的区别

 1.抽象类要被子类继承,接口要被类实现

 2.接口只声明抽象方法,抽象类既可以声明抽象方法,也可是声明非抽象方法

 3.接口中定义的变量只能是公共静态的常量,而抽象类中的变量可以是普通变量

 4.抽象类可以包换static方法,但是接口不允许(静态方法不能被子类重写)

 5.接口不能有构造方法,抽象类可以有(构造方法:不写返回值类型,名字与类名称相同,不能return,不自己写构造方法会默认存在一个空的构造方法,  格式:public 类名称(参数类型 参数名称))

  

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值