一、封装:

封装的概念:

  - 合理的隐藏:隐藏不想被外界操作的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. 解决【无法启动此程序,因为计算机中丢失MSVCP71.dll。尝试重新安装该程序以解决此问题】问题

    今日电脑偶然出现:[无法启动此程序,因为计算机中丢失MSVCP71.dll.尝试重新安装该程序以解决此问题.]的不断地弹窗报错. 在网上查找了好久,也没有找到解决办法,就在我将要准备重装系统的时候,又 ...

  2. MongoDB C API

    一.编译mongodb c driver: 编译完成之后在c:\mongo-c-driver目录下有bin.include.lib三个文件夹,分别包含所需的dll..h文件.lib. 在自己的项目中引 ...

  3. Swift - 获取、改变按钮的标题文本(UIButton点击切换title)

    在开发中,我们常常需要动态地改变按钮标签文字,使用 setTitle() 函数就可以了.有时我们需要在几个标题间切换,比如下面样例所示,按钮点击后按钮文字会在"播放""暂 ...

  4. LeetCode : 93. Restore IP Addresses

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABZ4AAAHUCAYAAAC6Zj2HAAAMFGlDQ1BJQ0MgUHJvZmlsZQAASImVlw

  5. NYOJ题目840吃花生

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAskAAAKdCAIAAABeSGNbAAAgAElEQVR4nO3dPXKkuvv28f8mnHshjn

  6. redis-cli -h xxxxx -p xxxx monitor 监控host为xxxx,端口为xxx,redis连接及读写操作

    # redis-cli -p monitor OK ] " lua] " lua] " "-1"

  7. 对象映射组件Tiny Mapper

    1.Tiny Mapper的简单实用例子 using System; using System.Collections.Generic; using System.Linq; using System ...

  8. 【PHP构造方法和析构方法的使用】

    构造方法:__construct,析构方法:__destruct 代码示例: <?php class Person { public $name; public $age; public fun ...

  9. [LeetCode] Largest Rectangle in Histogram

    Given n non-negative integers representing the histogram's bar height where the width of each bar is ...

  10. GMap.Net开发之技巧小结

    1.在GMap地图上,如果要让添加的图标(Marker)有个高亮(highlight)的效果,可以在MouseOver到Marker的时候设置Marker外观效果. 如果要让图标有个报警闪烁的效果,可 ...