Java学习笔记——封装、继承和多态
先说说封装:
用new 一条狗来举个例子:
public class Dog {
//私有化字段
private String name;
private int age;
//无参构造
Dog(){
}
//带参构造
Dog(String name,int age){
this.name = name;
this.age = age;
}
//setter and getter 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
私有化成员变量后就不能直接使用 object.name 的形式改变字段值了。可以使用构造函数初始化字段值或者使用getter setter方法获取、改变字段值。
public class MyMain {
public static void main(String[] args) {
Dog dog = new Dog("旺旺", 3);//创建Dog对象并初始化dog:旺旺,3
Dog dog2 = new Dog();
dog2.setName("张三");//使用setter方法
dog2.setAge(15);//dog2:张三,15
}
}
然后是继承:
父类是Pet 类:
public abstract class Pet {
private String name;
private int age;
public Pet(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Pet(){
print();//虽然编译不报错,但是最好不要这么写,父类构造中调用可被子类覆盖的方法破坏封装
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void print();//抽象类可以有抽象方法和非抽象方法,但是非抽象类不能有抽象方法;抽象方法不是类方法,不能用static修饰
abstract int calc(int i) throws ArithmeticException;//测试子类抛出异常范围
}
子类是Penguin 类:
public class Penguin extends Pet{
private int love;
public Penguin(String name, int age, int love) {
super(name, age);
this.love = love;
}
public Penguin(){
super();
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
@Override//方法名相同,参数列表相同,返回值类型相同
public void print() {//子类重写父类方法不能减少其访问权限,这里使用非public会报错
//原因:父类引用指向子类对象,如果子类方法访问权限少,那么将会导致方法调用者可调用父类方法却不能调用子类的重写方法.
// TODO Auto-generated method stub
System.out.println("我是:"+this.getName()+"年龄:"+this.getAge()+"健康值"+this.getLove());
}
@Override
int calc(int i) throws ArithmeticException{//子类重写父类方法不能抛出更多的异常,这里抛出Exception或其他异常会报错
//原因:父类引用指向子类对象,如果子类抛出更多的异常,那么将会导致方法调用者try-catch父类异常时忽略了子类更多的异常(catch不到)
// TODO Auto-generated method stub
return 1/i;
}
}
测试类:
public class MyMain {
public static void main(String[] args) {
Pet penguin = new Penguin();//父类变量 指向 子类对象,父类引用 指向 子类对象;向上转型(子类转父类)
penguin.setName("张三");
penguin.setAge(18);
penguin.print();//多态
//penguin.setLove(100);报错,只能调用父类方法表中的方法
Penguin p = (Penguin)penguin;//向下转型(父类转子类)
p.setLove(100);
penguin = (Pet)p;//向上转型
penguin.print();
p = (Penguin)penguin;//向下转型
p.print();
penguin = new Penguin("小企鹅", 6, 100);
penguin.print();
int t;
try {
t = penguin.calc(0);
System.out.println(t);
} catch (ArithmeticException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("除数不能是0!");
}
System.out.println("end ..");
}
}
最后说说多态,
上面代码第4行Pet penguin = new Penguin();已经体现了多态,再写个多态的典型例子——主人给宠物喂食:
public class MyMain {
public static void main(String[] args) {
Pet dog = new Dog();
Pet cat = new Cat();
Person.feeding(dog);
Person.feeding(cat);
}
}
public abstract class Pet {
public abstract void eat();
}
public class Dog extends Pet {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("够吃骨头...");
}
}
public class Cat extends Pet {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("猫吃鱼...");
}
}
public class Person {
public static void feeding(Pet pet) {
// TODO Auto-generated method stub
pet.eat();
}
}
附上思维导图:

Java学习笔记——封装、继承和多态的更多相关文章
- 0022 Java学习笔记-面向对象-继承、多态、组合
继承的特点 单继承:每个子类最多只有一个直接父类,注意是直接父类,间接父类个数不限 注意父类的概念:A-->B-->C-->D,在这里,ABC都是D的父类,C是D的直接父类,AB是D ...
- C++学习笔记 封装 继承 多态 重写 重载 重定义
C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...
- Java 学习笔记(7)——接口与多态
上一篇说了Java面向对象中的继承关系,在继承中说到:调用对象中的成员变量时,根据引用类型来决定调用谁,而调用成员方法时由于多态的存在,具体调用谁的方法需要根据new出来的对象决定,这篇主要描述的是J ...
- Java 学习笔记(6)——继承
之前说过了Java中面向对象的第一个特征--封装,这篇来讲它的第二个特征--继承.一般在程序设计中,继承是为了减少重复代码. 继承的基本介绍 public class Child extends Pa ...
- 1.8(java学习笔记)继承与方法的重写
继承 在java中可以通过继承提高代码的复用率. 例如A继承了B,就可以是 例如,首先有一个类似Person,这个类中有有一些属性和方法,我们再新建一个Student类,其中有一部分属性和方法与Per ...
- Java编程思想学习笔记_2(继承和多态)
静态初始化: 静态初始化只在必要的时刻进行.(即当程序需要加载类进入内存的时候,执行静态初始化.静态变量和静态代码块的初始化顺序,按照在代码中声明的顺序老执行.例如:如果要执行某个public类,那么 ...
- Java学习笔记(十)——多态
一.多态 1.对象的多种形态 (1)引用多态: 父类的引用可以指向本类的对象 父类的引用可以指向子类的对象 (2)方法多态: 创建本类对象时,调用的方法为本类方法: 创建子类对象时,调用的方法是子类方 ...
- Java学习笔记之继承
一.继承的基础 在Java术语中,被继承的类叫超类(superclass)或者父类,继承超类的类叫子类(subclass). 举例说明: class Box { public double width ...
- Java学习笔记之——继承
父类(基类):动物 子类:猫.狗.狼.老虎 如果子类继承于父类,则会自动拥有父类的所有非私有属性和方法,不会继承构造方法 父类和子类要满足一种关系:子类是父类的一种 Java中只支持单继承:一个子类只 ...
随机推荐
- [python爬虫]爬取学校教务处成绩
学校教务处网站 登陆窗口 表单数据 观察登陆窗口和提交的表单数据可知只要将账号.密码.验证码正确赋值提交即可模拟登陆. 账号和密码都有,问题的关键就在验证码上. 右键验证码图片审查观察源码如下图: 刚 ...
- 老李分享:接电话扩展之uiautomator 1
老李分享:接电话扩展之uiautomator poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq ...
- [笔记]GBDT理论知识总结
一. GBDT的经典paper:<Greedy Function Approximation:A Gradient Boosting Machine> Abstract Function ...
- linux从入门到精通学习-NFS
NFS网络文件系统 功能 nfs[network file system] 网络文件系统 是FreBSD系统支持的一种系统,允许在网络 上与其它人共享使用文件或文件夹 采用C/S模式 端口号 在vim ...
- mysql 分析3使用分析sql 性能 show profiles ;
show variables like '%profiling%'; 查看状态 查看时间去哪了``` set profiling=1;// 打开 show profiles; 查看执行过的 ...
- DataTable源码分析(二)
DataTable源码分析(二) ===================== DataTable函数分析 ---------------- DataTable作为整个插件的入口,完成了整个表格的数据初 ...
- 在my.ini文件中配置mysql统一字符集
测试的mysql版本为:5.7.14 查看mysql字符集命令: show variables like 'character_set_%'; 以下是在my.ini文件中配置mysql统一字符集参数: ...
- Git基本操作命令2
git本地仓库同步到远程仓库上 $ git remote add origin http://github.com/powfulCsharp/NuUserControl.git $ git push ...
- nano使用介绍
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. GNU nano是Unix系统下一款常用的文本编辑器,以简单易用著称.与之相比,功能更强大的Vi和Emac ...
- Python with
简介 在编程中会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后,需要继续执行一些收尾动作.例如,文件读写后需要关闭,数据库读写完毕需要关闭连接,资 ...