一、封装:

封装的概念:

  - 合理的隐藏:隐藏不想被外界操作的Field、方法、构造器

  - 合理的暴露:一般就是希望给别人调用的方法

  e.g:显示器(按键暴露出来操作,但实际的东西/细节方法被隐藏起来)

封装的目的:

  - 简化编程(不去去找显示器的内部调,直接按键调整即可)

  - 更好的保证对象的完整性

为了实现隐藏,我们有4个修饰符:

  private      - 仅限当前类访问权限

  无修饰符/默认   - 包访问权限(同一个包内)

  protected      - 子类访问权限(本类能访问、同一个包也能访问)

  public        - 公共的访问权限

  权限级别:private → 默认访问权限 → protected → public (只有成员变量才需用访问权限修饰符)

  private    - 用于隐藏Field

  public      - 专门用于暴露方法

  protected    - 希望被它的子类访问的方法

  默认            - 希望在同一个包中被访问

局部变量方法一执行完就销毁了,所以没必要限制,限制了也没意义,它尽在方法内或代码块中有效,作用域本来就小-连方法都出不了,所以它用访问权限修饰符都是多余(默认都多余)

 class Fruit {
private double weight;
private String name; public void grow(double grow){
if(this.weight + grow >= 100){
System.out.println("水果超出重量,逆天了!");
}else{
weight = weight + grow;
}
} public void setName(String name){
if(name.length() > 6 || name.length() < 2){
System.out.println("水果名字不符合规则");
}else{
this.name = name;
}
} public void info(){
System.out.println("这个是:" + name + ",重量为:" + weight);
}
}
 class TestFruit{
public static void main(String[] args){
Fruit t = new Fruit();
//t.weight = 200; 定义为private后不能直接赋值
//t.name = "Apple"; 如果直接赋值将破坏Fruit对象的数据完整性
t.grow(10);
//t.grow(101); //不符合定义规则打印对应语句
//t.setName("A");
t.setName("Apple");
t.info();
}
}

二、继承:(extends)

  Java的继承 - 两个类之间的关系(A extends B),Java中的继承从"一般到特殊"的关系,如:

  人 → 老师 → IT老师 → 教Java的老师

  Java通过关键字extends来实现,实现继承的类称为子类,被继承的类称为基类/超类/父类,父类是大类(范围大),子类是小类

  Java的继承是单继承,每个继承类(extends后面)只能有一个直接父类但可以有N个间接父类,子类继承了父类 仅【能】获得父类的全部属性和方法但【不能】获得父类的构造器、初始化块、内部类

  如果定义的Java类没有显示的指定父类,系统默认会让它继承Object类--一切的类都是Object类的子类

 public class Person {
private String name;
private int age; public Person(){} //父类空构造器,子类初始化是会报错 public Person(String name , int age){
this.name = name;
this.age = age;
} public void info(){
System.out.println("这人叫:" + name + ",年龄是:" + age);
} public static void main(String[] args) {
Person p = new Person("小二",20);
p.info();
}
}
 public class Teacher extends Person{
public static void main(String[] args){
//子类将会从父类那里获取到所有方法
Teacher t = new Teacher();
//调用从父类那里继承到的方法
t.info();
}
}

  

继承中父类与子类的关系是"一般到特殊的关系",所以子类的实例完全可以当作父类的对象来使用,父类的引用变量完全可以指向子类的实例。

 class Animal{
private String name;
private String sex; public Animal(String name , String sex){
this.name = name;
this.sex = sex;
} public void info(){
System.out.println("动物的名字叫:" + name + ",性别为:" + sex);
}
} public class TestAnimal extends Animal{
private String color; public TestAnimal(String name , String sex , String color){
super(name,sex);
this.color = color;
} public static void test(Animal A){
System.out.println("~这是个测试方法~");
A.info();
} public static void main(String[] args){
Animal ta = new TestAnimal("灰太狼","male","灰色");
TestAnimal.test(ta);
}
}

三、多态:

  同一类型的变量,在访问同一方法时, 呈现出多种行为特征 -- 这就是多态。

  多态增加了Java语言的灵活性,它是和设计模式紧密相连的。

 class Person{
public void work(){
System.out.println("努力工作!");
}
} class Teacher extends Person{
@Override
public void work(){
System.out.println("辛勤的教书!");
}
} class Student extends Person{
@Override
public void work(){
System.out.println("努力的读书!");
} public void play(){
System.out.println("读书真累啊!");
System.out.println("累的时候也要适当的玩耍啊!");
}
} public class Duotai{
public static void main(String[] args) {
//多态:同一个类型的变量在访问同一个方法时,表现出多种行为特征
//p、p1、p2均为person类型变量,但在访问work方法时返回的结果都不一样则为多态
Person p = new Person();
p.work();
//子类的实例/对象完全可以当成父类的对象来使用
//p1引用变量指向Teacher实例
Person p1 = new Teacher();
p1.work();
Person p2 = new Student();
p2.work();
//编译阶段不管运行时类型的,编译器并不知道引用变量实际引用的对象时Student,编译器只知道它的编译时类型为Person,而Person又没有play()方法,所以编译报错
//p2.play();
//若要调用play()方法,则可以使用Student来定义变量,或者使用强制转换将p2转换成student对象
Student st = (Student)p2;
st.play(); Student p3 = new Student();
p3.play();
}
}

Java的引用变量有两个类型:

  1、编译时类型:由声明它的类型来决定所以p、p1、p2的编译类型均为Person,p3的编译类型为Student;

  2、运行时类型:由该引用变量实际所指向的对象决定p的为Person,p1 为Teacher, p2为Student,p3为Student,当我们调用引用变量时,它总是呈现它的运行时的特征.

疯狂java学习笔记之面向对象(五) - 封装、继承、多态的更多相关文章

  1. 疯狂java学习笔记之面向对象(八) - static和final

    一.static: 1.static是一个标识符: - 有static修饰的成员表明该成员是属于类的; - 没有static修饰的成员表明该成员是属于实例/对象的. 2.static修饰的成员(Fie ...

  2. 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器

    Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...

  3. 疯狂java学习笔记之面向对象(四) - this关键字

    Java中this关键字主要有以下两个方法: 1.this引用 - 可用于任何非static修饰的方法和构造器中,当this用于方法中时,它代表调用该方法的实例/对象;当this用于构造器中时,它代表 ...

  4. 疯狂java学习笔记之面向对象(九) - 抽象和接口

    一.抽象(abstract): 1.抽象类: 使用abstract修饰的类就是抽象类; 相比于普通类抽象类增加了支持抽象方法的功能,但也丢失了创建实例的功能(抽象类中不能创建实例),其他普通类有的抽象 ...

  5. 疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写

    一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同 ...

  6. 疯狂java学习笔记之面向对象(三) - 方法所属性和值传递

    方法的所属性: 从语法的角度来看:方法必须定义在类中 方法要么属于类本身(static修饰),要么属于实例 -- 到底是属于类还是属于对象? 有无static修饰 调用方法时:必须有主调对象(主语,调 ...

  7. 疯狂java学习笔记之面向对象(二) - 成员变量与局部变量

    Java变量按其作用域可分为:成员变量和局部变量.注意:在Java中是没有全局变量这个概念的 一.成员变量: 成员变量是在类中定义的变量,具体可分为类变量与实例变量--有无static修饰 实例变量的 ...

  8. 疯狂java学习笔记之面向对象(七) - super关键字

    super有以下两大作用: 1.起限定作用:强制去访问父类的成员(Field.方法) 2.起调用作用:指定/显示调用父类的某个构造器 super调用规则: 1.子类构造器总会调用父类构造器一次,默认情 ...

  9. Java学习笔记之---面向对象

    Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...

随机推荐

  1. Qt Creator 中关于调试器的设置

    Qt Creator3.4.2 Based on Qt 5.5.0 (MSVC 2013, 32 bit) 在安装了VS2013的电脑上能够自动识别VS编译器,却不能识别调试器 需要下载一个wdk,安 ...

  2. spring集成activeMQ

    1.安装activehttp://activemq.apache.org/activemq-5140-release.html2.运行D:\apache-activemq-5.14.0\bin\win ...

  3. java https tomcat 单双认证(含证书生成和代码实现) 原创转载请备注,谢谢O(∩_∩)O

    server: apache-tomcat-6.0.44 jdk1.7.0_79client: jdk1.7.0_79 jks是JAVA的keytools证书工具支持的证书私钥格式. pfx是微软支持 ...

  4. 【转】深入Windows内核——C++中的消息机制

    上节讲了消息的相关概念,本文将进一步聊聊C++中的消息机制. 从简单例子探析核心原理 在讲之前,我们先看一个简单例子:创建一个窗口和两个按钮,用来控制窗口的背景颜色.其效果 图1.效果图  Win32 ...

  5. python基础——使用元类

    python基础——使用元类 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello. ...

  6. checkbox复选框全选

    HTML: <input type="checkbox" class="all"> <input type="checkbox&qu ...

  7. Android Service 与 Thread 的区别

    Ref:http://blog.csdn.net/jiangwei0910410003/article/details/17008687 1). Thread:Thread 是程序执行的最小单元,它是 ...

  8. PHP面向对象——类常量,魔术常量与延期绑定

    普通常量  define('常量名',常量值): 以前说过:define定义的常量,全局有效 无论是页面内,函数内,类内,都可以访问. 例: define('ACC','Deny')    class ...

  9. php PDO:数据访问抽象层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Linux获取当前用户信息函数

    转自:http://net.pku.edu.cn/~yhf/linux_c/function/07.html endgrent(关闭组文件) 相关函数 getgrent,setgrent 表头文件 # ...