(引用对数据库关系模型的理解“世界是由对象和关系构成,对象就是抽象出来的实体,关系就是实体间复杂的联系”,java中也类似,一切实体都可以抽象出来成为对象,忽略实体对象中个体的差异,将对象共有的属性不断向上抽象统一,最后就成为了java面向对象中的类,然后再通过对类的继承与实例化再回造具体实体的过程就是面向对象,面向对象的实质就是 用计算机语言把现实世界的一切东东优雅的写出来,举个例子:地球有60亿与众不同的人,即使是双胞胎也有差异,但他们有共有的特点,都有姓名,性别,身高体重,一个脑袋五个洞,这些是人共有的属性,光有属性还不够,活人都具有行为,吃饭睡觉打豆豆,虽然也有一群人还喜欢跳广场舞,另一群人喜欢打飞机,但忽略个体差异把共有的属性和行为抽象出来就是
public class 人类{//注意类名要大写
public static final int 脑洞=5;
//脑袋上有五个洞简称脑洞,这里留一个悬念,static 是什么鬼?预见这鬼如何请看下文1解
private int 身高;
Private int 体重;
private String 姓名;
private string 性别;
private int age;
public void 睡觉(){...........}
public void 吃(){..........};
public 人类() {构造方法省略}
}
这就是面向对象—>抽象
造人女娲喜欢用手捏,捏一下就出来一个人,尼玛面向对象习惯使用new,一new一个人,下面咱们来new一个
人类 张三 = new 人类(姓名张三,身高125,体重250,性别女,年芳18);
好了,张三就这样 被诞生了
虚拟世界来自对现实世界抽象参考,现实世界的人都不一样,虚拟世界自然也统同样有不同的人,有人会问“你上面new的张三不是我想要的张三,我就喜欢爱跳广场舞,喜欢吃草的张三,怎么办?”好办
上面的new叫面向对象的实例化,下面来一盘 面向对象的 继承与多态 尝尝咸蛋 come on baby
public class 大妈 extends 人类{
public void 跳广场舞(){........}
}
这样大妈就继承了人类所有的属性与行为,自己还会跳广场舞
然后我们来个妞
人类 张三=new 大妈()
或者(再设一个悬念,这两个new的区别)
大妈 张三=new 大妈()
道生一,一生二,二生many ,通过多种继承与实例化操作,各种奇奇怪怪的人就被诞生了,这就是面向对象的封装-》继承-》多态-》实例化
----------------------------------------------------------------
为了安全,类中成员变量一般都定义为私有变量,在类外不直接对类成员变量操作,而是通过类中自定义的get/set函数去操作
-----------------------------------------------------------------------
Java中都是值传递,阿弥陀佛,切记切记
)
1解:static关键字
(1)当某一变量被所有对象使用并是同一值时就可以定义为静态变量,比如上例中人都是一个脑袋五个洞,无论被哪个对象使用都是固定不变的所以可以定义为静态常量,常量用final,静态用static修饰。
(2)被static修饰的静态变量属于类,在类加载时就被初始化分配到类唯一的静态量内存空间,而普通变量需要实例化后才被分配内存,然后才可以被访问
(3)访问静态变量不能用this ,正确方法是在本类中可以直接用变量名称 或者 类名.静态变量名,在对象中访问静态变量只能用类名.静态变量名
(4)被static修饰的方法叫静态方法,静态方法只能访问静态属性与方法,而非静态方法可以访问静态与非静态方法与属性
下面举例说明:
public class A(){
public static int m;
public int j;
public void rtnM(){
System.out.println(“m是静态变量:”+m);//或者用A.m
}
public static void getM(){
//这里只能访问静态属性与方法,要想访问非静态属性就得来个new(对类实例化)
/*
(我想原因是静态方法与静态属性是在类加载时就分配了内存,而非静态属性只有在实例化后才被分配内存空间,如果在静态方法中直接访问非静态属性会因为找不到非静态属性内存而出错)
*/
System.out.println(“m是静态变量”)
}
}
public class B(){
public static void main(String [] args){
A a = new A()
System.out.println(“访问静态属性m”+A.m)
A.getM();
}
}
2、继承
(1)通过关键字extends继承
(2)Java中只支持单继承,就是一个孩子只能有一个爹
(3)子类继承后可以拥有父类所有非私有属性与方法,也可以重写父类方法,但是被重写的方法访问权限不能缩小
修饰符|权限 | 当前类 | 同包 | 子类 | 其它 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
默认 | √ | √ | × | × |
private | √ | × | × | × |
3解、抽象方法
方法前用abstruct修饰,为啥这样干
因为不同的对象即使有共同的行为,但行为的具体实施步骤也会有不同,所以在父类中直接定义方法 为 抽象的 而留给子类去具体实现,这样就可以减少代码冗余,实现不同的鸟虽然都会飞行,但可以自己定义自己的飞行鸟姿;
父类 Name=new 子类()//这叫动态绑定
动态绑定可以在类切换时提高效率,但是name对象只能实现父类中定义的方法,而不能使用子类扩展的方法
子类 Name= new 子类()
这样写虽然可以使用子类的扩展方法,但是违背了里氏替换原则,所以开发时建议用父类抽象定义子类可能实现的方法,如果子类没有该方法就在子类中实现空方法,然后动态绑定new实例
例如老师讲的例子
public class 学生{
.............
..............
public abstruct void 管理班级();
public abstruct void 体育();
public abstruct void 学习();
}
public class 班长 extends 学生{
public void 学习(){.......班长偶尔也学习...}
public void 管理班级(){....管理班级方法....}
public void 体育(){}//空方法,应该是体育委员的事
}
public class 体育委员 extends 学生{
public void 学习(){.......体育委员学习...}
public void 管理班级(){}//空方法
public void 体育(){.....稍息,立正,躺下....}
}
然后就可以动态绑定去实例化班长和体育委员啦
学生 班长李四 = new 班长();
学生 体委王五 = new 体育委员()
666导航网 可以自由收藏管理个人常用网址的便捷上网工具