Java类的封装继承多态

OOP思想不再多做介绍
下面对一些重点描述一下

Java的权限修饰符

修饰实例方法、类方法、类变量、实例变量的:
private
public
default
protected

修饰类的:
public
private
局部变量没有访问权限符
本身就是一个方法内部的变量,仅该方法可以访问

特别注意的是private

private只支持自身类内部方法的访问
即使是子类也不行,也不准访问

Java类概述

属性(Field)

也叫成员变量
静态属性(类属性):static
实例属性 (一般在构造器里初始化,也可以用初始化代码块初始化)
(涉及Java的类加载机制、Java的类变量、实例变量访问、设计模式)
注意成员变量和局部变量的区别
注意类变量和实例变量的区别

构造器(Constructor)

隐式构造器(当类内部没有提供构造器时,JVM自动提供的一个隐式的无参的构造器,默认值一般为0或NULL)
显示构造器:程序员提供在类内部的构造器
1.与类同名
2.无返回值
3.允许重载 (即允许多个同名构造器)
4.一般初始化实例变量
5.和new搭配
6.允许使用this关键词 ,但是this(…)也是调用已有的构造器,也就是参数列表至少要匹配
一旦使用this构造器,就得放在整个构造器的最前面
7.允许调用父类的构造器:super(…)
一旦使用super构造器,就得放在整个构造器的最前面

所以一个构造期内不可能同时出现this构造器、super构造器

8.可以使用this关键词指示当前对象,用于区分实例变量和局部变量(或形参)
与6不同,不是同一点

9.(涉及到类加载和设计,在后面提及,还有初始化块等)

//例子
class People
{
    int age;
    String name;
    int sex;
    People()
    {      //无参构造器,默认值全为零或空
    }
    
    People(String name)        //方法重载
    {
    this.name=name;          //this区分形参和实例变量
    }
}
class student  extends People
{
   String Major;
   student()
   {
   }
   student(String name,String major)
   {
    super(name);             //调用People(String name)      
    this.Major=major;    
   }
}               //例子简单只是总结性的例子
方法Method

类方法
实例方法
(涉及成员变量的访问权限、权限控制、还有多态
类方法只能访问类变量不能访问实例变量
实例方法可以访问类变量和实例变量

简单的概述结束了,接下来是具体的一下特性

Java变量的生命周期

可以参考PPT变量生命周期
局部变量 :
包括引用、基本类型数据
离开本层的大括号范围时,就会销毁
(new操作符的左边的那些也属于局部变量)
简单的说,会放在栈中的,会由于退栈死去

对象变量 、数组:简单的说就是堆中的
堆中的数据不会因为退栈死去,
但当无人引用自己时,会成为垃圾,在适当时刻由JVM垃圾处理机制处理掉。

{
People a=new People("人一");     
a=NULL         ;        //此时a没有指向People“人一”,People“人一”成为垃圾

a=new People("人二");     
People a2=a;                 //a2 a指向同一个对象
a=NULL         ;             //a 放弃了"人二",但a2仍指向"人二"未成为垃圾
}
//此时出了大括号,里面的局部变量a、a2均被销毁,无人引用"人一"、"人二",均成为垃圾

常量、静态域的生命周期
程序结束才会死亡

方法

方法重载

方法重载即
同名方法可以有多个
但每个的参数列表不同
具体调用时根据方法的参数列表进行匹配
特别注意:返回值不属于方法签名

int GetMoney(People a);
double GetMoney(People a); 
//这两个无法构成多态
要构成多态,要求参数列表不一样,不管返回值,与返回值无关

方法重写的话一般是对于子类而言。父类的方法被子类重写

方法参数传递

Java的方法必须依赖于某个类,由类方法或者实例方法调用
Java的参数传递只有一个值传递
对于基本类型:就是简单的值传递
对于引用类型:是将对象在堆中地址传过去,堆中地址过去,那就类似于指针了,不过还是不一样的
(有题目一点要结合Java的内存管理机制理解)

Java的封装特性

主要体现在与Java的数据
推荐使用private私有化实例变量,仅本类可以访问
通过提供get方法、set方法对外提供接口

四种访问权限修饰符

this关键字

PPT4.9
1.可以用来作为隐式参数,指示当前对象
2.可以调用的当前类对象的属性、方法、构造器
3.this调用构造器时,要在新构造器的首行
4. 在静态方法中,不可以用this。
因为this指示当前对象实例,静态方法不能操作对象实例

super关键字

PPT5.1末尾
1.指示父类
2.可以用于调用父类方法、属性、构造器
3.super不表示当前对象,无此概念
4.如果用了super做构造器,必须首行
5.所有子类默认会调用父类的无参构造器
如果父类没有无参构造器,那么一定要指定父类的一个构造器以初始化父类里的信息
super(…)要首行
一定要有一个地方初始化了父类

Java的继承,我就不多说了
extends

1.instanceof操作符
2.继承的话看super
3.单继承,多继承通过interface接口
4.子类中重写父类方法

重写要注意:子类的访问权限修饰符要比父类严格
重写的话,返回类型 方法名、参数列表要一样
重写方法和被重写方法必须同时时static 或者同时为 非static
子类的抛出异常不能大于父类异常

Java的多态

Java的多态是为了方便性,书写的方便性
对于一堆子类,有各自的特性,但是程序员的调用是统一的 (子类中重写了父类的那些方法)
重写即方法名、参数列表相同,那么调用起来就一样了,无差别话,但可以得到不一样的结果

Java的运行时环境和编译时环境不一样
当编译时类型和运行时类型不一样时,就会引发多态 。
(xian’f’shan)

Father f=new Son();
//继承
//重写
//父类引用指向子类对象

实际多态只对实例方法有效,其他都没有
重写也只是对于方法才有,
即使子类有与父类相同名的变量,也不会被父类访问
类变量、实例变量
编译看左边,运行看左边
实例方法(那些子类重写的、继承的方法)
编译看左边,运行看右边
构造器
编译看左边,运行看左边
静态方法
编译看左边,运行看左边

这就是多态性,总结后很简单,但是:
多态可以用于一般的类、抽象类、接口

注意例如:####

一个父类对象指向一个子类引用,子类引用指向自身类时,实现的也是多态
虽然在编译的时候没有相关的处理,但是还是有的
会自动调用的子类的super里的数据
也实现多态
另外 父类数组引用指向子类数组,同样是多态的实现

Java的类型转换

基本数据类型
自动类型转换 (自动向上转型)
强制类型转换

int aNum=1;
Long bNum=aNum;     //自动
Double cNum=aNum;  //自动

short dNum=(short)aNum;   //强制

特别说一点 :
每种java的基本数据类型有对应的包装类
String中如果 有一些数值,可以用对应的包装类的类方法转化

String aInt ="555";
String aDouble="555.12";
int a=Integer.parseInt(aInt);              //对应的转化a=555
int b=Integer.parseInt(aDouble);        //报错非法
double c=Double.parseDouble(aDouble);  //c=555.12

String intTostring=Integer.toString (5566);    //"5566"

Java对象
子类到父类的自动转型参考多态即可;
父类到子类的必须强制转化
无继承关系的类型间的转化非法
用instanceof判断是否可以转化

Jave的Object类

Object类是所有类的父类
以前没有泛型时,用的是object

简单的说一下 :
toString
hashCode
equals() 和 '=='不一样

Java的类加载机制

1.关于类的信息,加载到了 静态域
即 静态域中包含了一个类的如何构造、类的成员有哪些
静态变量也在静态域
2.一个类加载一次后就在静态域中,不需要再次加载
3.类的加载时机很多,只要使用到就会加载(见ppt第六章static中小结)
4.静态变量在类加载时分配空间,实例变量在创建对象时分配空间 (堆空间)

只使用到类的静态变量时
只会使用到静态域的加载和静态初始化块的初始化,
没有加static的初始化块不会被加载
类的实例化new时
所有的初始化块和构造器会被使用

初始化和加载顺序

父类静态变量和静态初始化块
当前类的静态变量静态初始化块(只用到静态变量时,就到这里了)
父类的初始化块(无static)
父类的构造器
子类的初始化块
子类构造器

一定要自己写一下试一下感觉