访问权限修饰符:
访问权限修饰符,用来修饰类中的成员,控制其是否能被访问;
public:公共权限,在系统中哪里都可以访问
修饰类,方法(构造方法,成员方法),成员变量
protected:受保护权限,在本类,同包类不同包子类中可以访问
修饰方内部类、法和成员变量
:默认权限,在本类,同包类访问
修饰类(包含内部类),方法,成员变量;
private:私有权限,只能在本类中访问
修饰内部类,方法,成员变量;
面向对象语言的三大特征:
封装:
封装含义:
1.包装,例如讲一下常用的功能进行抽取,定义成一个方法;
2.面向对象特征中的封装:隐藏(控制类中成员对外可见性)
封装案例1:将类中属性私有化
封装案例2:将某些方法私有化
java设计模式(模板,固定套路)
解决一类问题的固定方式。
单例模式:单个实例,在系统中,想让某个类只能创建一个对象。
成员变量和局部变量:
位置:
成员变量:在类中定义 局部变量:在方法中定义
权限修饰不同:
成员变量:可使用权限修饰符;
局部变量:不可使用权限修饰符;
初始化不同:
成员变量: 非静态--在创建后,由构造方法初始化;
静态--类加载时初始化;
局部变量:在方法中声明,声明后需自己进行初始化;
生命周期不同: 生(创建) 销毁
成员变量: 非静态--创建对象 对象被回收
静态--类加载 类被卸载
局部变量: 当方法被调用 当方法执行结束
在内存中位置不同:
成员变量: 非静态--与对象在堆空间存储
静态--与类信息在方法区中存储
局部变量: 与方法在栈中存储
继承:
子继承父: 儿子就可以拥有父亲的功能
面向对象也引入继承思想
猫和狗 都有名字,年龄吃东西等属性和行为;
可将这些共性和行为抽取,就不需要将这些共性给每个类中重复地定义;
创建动物类:名字,年龄,吃的东西
创建两个类继承动物类:
例如:猫 狗 猪等等,在子类中定义他们特有的特征。
继承的优点:
减少代码冗余,提高代码的复用性;
提高程序功能的扩展性;
继承细节:
子类不能直接访问父类中私有的成员或方法;(子类是拥有父类的私有成员)
多种类可以叠加继承:A类->B类->C类
子类继承父类后拥有父类所有的实例变量和方法。
重写: 有时父类方法中的实现不满足子类所需实现,
可将父类方法在子类中进行重写(在子类中对父类方法进行重写)
如此做则子类功能将覆盖父类功能;
重写规则:
方法名,参数,返回值都要相同;
子类重写权限必须大于等于父类权限(一般就跟父类权限相同即可)
super关键字:
在子类中访问父类中的方法或变量;
super.方法();
当子类中重写了父类方法时,为区分调用是父类还是子类,使用super来判别;
多态:
package edu.ffyc.day;
/*
正常类,可使用public和默认权限
public修饰在任何包中可以被访问
默认权限只能在本包中使用
*/
public class day7 {
//前三个在同包中皆可使用
public int jnum=6;//不同包类中可以使用;
protected int nnum=8;//只能在本类、同包类、不同包子类中使用;
int tnum;//只能在本类和同包中其他类使用
private int mnum;//只能在本类中使用
//不论什么修饰,在本类中都可调用
//外部可以通过构造方法进行私有成员赋值
//但是构造方法获取不了私有变量的值
public day7(int mnum){
this.mnum=mnum;
}
//若父类无空参的构造方法,子类调super用时编译出错,所以尽量在定义构造方法时,多定义一个无参构造方法;
public day7(){};
//可以用方法给私有成员变量赋值或获取私有成员变量的值;
public void setnum(int mnum){
this.mnum=mnum;
}
public int getnum(){
return this.mnum;
}
public static void main(String[] args) {
day7 p=new day7();
System.out.println(p.jnum);
System.out.println(p.nnum);
System.out.println(p.tnum);
System.out.println(p.mnum);
}
}
public class Test {
public static void main(String[] args) {
Dinasour dina=new Dinasour();
Chicken chi=new Chicken();
dina.Setname("理塘顶真");
dina.attack="抽瑞克五代";
chi.Setname("蔡徐鸡");
chi.attack="铁山靠";
dina.Setage(15);
chi.Setage(3);
chi.eat(true);
dina.eat(false);
System.out.println(chi.Getname()+chi.Getage()+chi.attack);
System.out.println(dina.Getname()+dina.Getage()+dina.attack);
}
}
class Dinasour extends Animal{
{
System.out.println("这是恐龙");
}
//子类重写:
//重写方法结构需与父类的一致
/*在子类的构造方法中,会默认调用父类的构造方法
每当创建子类对象时,会调用子类的构造方法,在子类的构造方法中,调用父类构造方法。
且在构造方法第一行就调用(为保证父类成员初始化),也只能放在第一行调用,若不写子类构造方法会默认第一行为super;
若父类无空参的构造方法,子类调super用时编译出错
*/
@Override
public void eat(boolean plant) {
System.out.println("顶真吃鸡精");
super.eat(true);
}
String attack;
}
public class Chicken extends Animal{
{
System.out.println("这是鸡");
}
String attack;
//重写原因:因为蔡徐鸡想抽瑞克五代
@Override//对方法进行标识,让他人好理解,方便自己辨认;
public void eat(boolean plant) {
System.out.println("蔡徐鸡抽瑞克五代");
}
}