Java学习笔记9(面向对象二:this、继承、抽象类)
就近原则:
类中的方法中的变量和成员变量重名时,调用类的方法时候,生效的是方法中的变量,如果方法中没有定义变量,才会去成员变量中寻找
于是,提出了this关键字,为了区分重名问题
public class Person {
// 人的姓名年龄,成员变量
private String name;
private int age;
public void setAge(int a) {
if (a < 0 || a > 100) {
age = 20;
} else {
age = a;
}
}
public void setName(String n){
name = n;
}
//定义方法,获取age
public int getAge(){
return age;
}
public String getName(){
return name;
}
// 说话功能
public void speak() {
String name = "李四";
int age = 16;
System.out.println(this.age + "岁的" + this.name + "在说话");
}
}
public class PersonTest {
public static void main(String[] args) {
Person p = new Person();
p.setName("张三");
p.setAge(80);
System.out.println(p.getAge());
System.out.println(p.getName());
p.speak();
}
}
这里如果不写this,输出的就是李四,如果写了则输入张三
注意this是调用者本身的对象
this内存分析:
1.main进栈运行,堆中开空间存入Person对象,成员变量跟随并赋默认值
2.p调用speak方法时,speak进栈执行,调用者是p对象,this就是p对象本身,因此p将对象地址传递给this,于是this也指向这一片内存空间
于是我们发现,刚才的Person类这样写会更规范:
public class Person {
private String name;
private int age;
public void setAge(int a) {
if (a < 0 || a > 100) {
this.age = 20;
} else {
this.age = a;
}
}
public void setName(String n) {
this.name = n;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void speak() {
String name = "李四";
int age = 16;
System.out.println(this.age + "岁的" + this.name + "在说话");
}
}
继承:
类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类
子类会自动拥有父类所有可继承的属性和方法
举例:
public class Employee {
String name;
public void work(){
System.out.println("员工"+name+"在工作");
}
}
public class Develop extends Employee{
public void print(){
System.out.println(name);
}
}
public class Test {
public static void main(String[] args) {
Develop d = new Develop();
d.name = "张三";
d.print();
d.work();
}
}

继承的特点和优点在这个例子中都体现出了
1.提高代码的复用性,提升开发效率
2.继承的出现让类与类之间产生了关系,提供了多态的前提
注意事项:
java只支持单继承,不支持多继承,因为有安全隐患,例如两个父类有重名方法时
可以使用连续继承(多重继承)实现多继承,这种方式合法
成员变量的变化:
子类定义的变量如果和父类重名,调用子类的时候,以子类的变量为准,如果子类不存在这个变量,则去父类中寻找,但是有一个super关键词可以指定在父类中寻找
public class Fu {
int i = 1;
}
public class Zi extends Fu {
int i = 2;
public void show(){
System.out.println(super.i);
}
}
public class Test {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
这时候的输出结果为1,关于super的知识在后面详写
子类重写父类方法:
子类中,出现了和父类一样的方法的时候,称为子类重写父类的方法
用super.调用父类的功能,再写入新的功能
注意:子类如果要覆盖父类方法,必须要保证权限大于或等于父类权限(public>protected>default>private)
抽象类:
只有声明,没有定义
抽象方法必须存在于抽象类中
抽象类,不能实例化对象(不能使用new)因为抽象类没有主体,无法运行
抽象类的使用:必须定义类继承它,将抽象方法重写,创建它的子类的对象,并且强制让子类重写方法
public abstract class Person {
public abstract void work();
}
public class Teacher extends Person {
public void work() {
System.out.println("老师在工作");
}
}
public class Engineer extends Person {
public void work() {
System.out.println("工程师在工作");
}
}
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
Engineer e = new Engineer();
t.work();
e.work();
}
}
输出:
老师在工作
工程师在工作
抽象类主要是为了学习它的设计思想:
抽象类的作用:继承的体系
抽象类强制子类重写抽象方法,保证体系功能的完整性
抽象类的一些注意事项:
1.有抽象方法的一定是抽象类,抽象类不止有抽象方法
2.抽象关键字abstract不可以共存的:private,final,static
3.抽象类必须是父类
Java学习笔记9(面向对象二:this、继承、抽象类)的更多相关文章
- 疯狂java学习笔记之面向对象(二) - 成员变量与局部变量
Java变量按其作用域可分为:成员变量和局部变量.注意:在Java中是没有全局变量这个概念的 一.成员变量: 成员变量是在类中定义的变量,具体可分为类变量与实例变量--有无static修饰 实例变量的 ...
- Java学习笔记之---面向对象
Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...
- 疯狂java学习笔记之面向对象(五) - 封装、继承、多态
一.封装: 封装的概念: - 合理的隐藏:隐藏不想被外界操作的Field.方法.构造器 - 合理的暴露:一般就是希望给别人调用的方法 e.g:显示器(按键暴露出来操作,但实际的东西/细节方法被隐藏起来 ...
- Java学习笔记(面向对象下)
面向对象(下) 类的继承 类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类称为子类,现有类称为父类,子类会自动拥有父类所有可继承的属性和方法.(用extends关键字) //定义A ...
- Java学习笔记之面向对象、static关键字
一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...
- Java 学习笔记(4)——面向对象
现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢 ...
- Java学习笔记:02面向对象-重写_this_super_抽象类
02面向对象-重写/this/super/抽象类 ****1.this和super 作用: this: 区分本类的成员变量和局部变量同名情况 super:区分父类的成员变量和局部变量同名情况 用法: ...
- Java学习笔记:01面向对象-继承
01面向对象-继承 一.java中的数据类型 1.基本数据类型:四类 八种 byte(1) boolean(1) short(2) char(2) int(4) float(4) long(8) do ...
- 【原】Java学习笔记019 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 仔细想一想,Ani ...
- 疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写
一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同 ...
随机推荐
- MyEclipse激活步骤
1.前言: MyEclipse 成功安装后使用天数仅仅有30天,打开软件后常常会弹出提醒我们在5天内要激活的对话框.没有激活的话,时间一到就不能使用了. 众所周知,中国的软件是不用花钱的,这里就介 ...
- swift手记-4
// // ViewController.swift // learn4 // // Created by myhaspl on 16/1/23. // Copyright (c) 2016年 myh ...
- 机器学习笔记2 – sklearn之iris数据集
前言 本篇我会使用scikit-learn这个开源机器学习库来对iris数据集进行分类练习. 我将分别使用两种不同的scikit-learn内置算法--Decision Tree(决策树)和kNN(邻 ...
- 分布式:ACID, CAP, BASE
本文主要讲述分布式系统开发的一些相关理论基础. 一.ACID ACID是一系列对系统中数据进行访问与更新的操作所组成的一个程序执行的逻辑单元,狭义上的事务特指数据库事务. 1.Atomic原子性 事务 ...
- 开源免费接口管理平台eoLinker AMS开源版 V3.2.0更新,增加批量导出导入接口功能!
eoLinker是一个免费开源的针对开发人员需求而设计的接口管理工具,通过简单的操作来帮助开发者进行接口文档管理.接口自动化测试.团队协作.数据获取.安全防御监控等功能,降低企业的接口管理成本,提高项 ...
- C# 委托高级应用----线程——创建无阻塞的异步调用(二)
了解IAsyncResult 现在我们已经了解,EndInvoke可以给我们提供传出参数与更新后的ref参数:也可以向我们导出异步函数中的异常信息.例如,我们使用BeginInvoke调用了异步函数S ...
- C++各种指针辨析
1)int *p p与*结合,表明p是一个指针 然后前面int说明p是一个整形的指针 2)int *p[n] 因为[]比*优先级高,所以p先与[]结合,表明p是个数组,然后这个数组在与*结合,说明数组 ...
- 绝世emacs配置for Ubuntu
反正过不了几天就要退役了,把emacs配置放出来造福(祸害)大众? 浓浓的OIER风格,除了方便打代码就没别的用处(F8并不这样认为?),只可惜windows下的弄丢了,只有Ubuntu下的. F1不 ...
- mysql case when group by实例
mysql 中类似php switch case 的语句. select xx字段, case 字段 when 条件1 then 值1 when 条件2 then 值2 else 其他值 END 别名 ...
- Docker(四):Docker基本网络配置
1.Libnetwork Libnetwork提出了新的容器网络模型简称为CNM,定义了标准的API用于为容器配置网络. CNM三个重要概念: 沙盒:一个隔离的网络运行环境,保存了容器网络栈的配置,包 ...