面向对象
一.封装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 类名称(参数类型 参数名称))