java面向对象(三)
java面向对象(三)
1、四种权限修饰符
public > protected > (default) > private
注意:(default)并不是关键字
default
,而是根本不写代码示例
package day06; import day06.sub.MyClass; public class DemoMain {
public static void main(String[] args) {
//同一个包中私有类的私有变量不能被访问
System.out.println(new Self().name);
System.out.println(new Self().job);
System.out.println(new Self().money);
//System.out.println(new Self().age);错误:private只能在本类中访问 }
} package day06; public class Self {
public String name="史强";
protected String job="警察";
int money=30000;
private int age=18; public static void main(String[] args) {
//本类中都可以访问;
// 注意静态方法(static)中不能使用this
System.out.println(new Self().name);
System.out.println(new Self().job);
System.out.println(new Self().money);
System.out.println(new Self().age);
}
} package day06.sub; //即使在子包下,但是没有在同一个包里面,就必须要进行导包设置;
import day06.Self; public class MyClass extends Self {
/*不同包下的子类,只有public和protrcted可以访问*/
String job=super.job;
String name=super.name;
//int age =super.age;//报错,权限不够,不能访问
//int money=super.money;//报错,权限不够,不能访问
public void show(){
System.out.println(job);
System.out.println(name);
} public static void main(String[] args) {
MyClass nn=new MyClass();
nn.show();
}
} package day06.sub; import day06.Self; public class Other {
/*不在同一个包下,也不是子类*/
public static void main(String[] args) {
System.out.println(new Self().name);
//只有public修饰的name不报错,其他的权限都不够
// System.out.println(new Self().job);
// System.out.println(new Self().money);
// System.out.println(new Self().age);
}
}
2、java包机制
2.1 Packeage包
package包对应系统的文件夹;
- 防止命名冲突造成使用不便;
- 格式:
公司域名+功能名|模块名
//写在类的第一行,可以写在注释后面,因为注释不编译;但是前面不能写任何代码;
package pkg1.[pkg2[pkg3...]]
注意:
- 不要定义与
jdk
相同的包,相同的类,否则会引起很多问题 - 写项目都需要加包,不要使用默认包
- com.opp和com.opp.test,这两个包没有包含关系,是两个完全独立的包,只是逻辑上看起来前者是后者的一部分;
- 不要定义与
2.2 import 导包
不需要导包的类
- 同一个包下的类;
- java.lang包下的类不需要导入;例如:String、
JDK中常用的包介绍
导包的方式
权限定名(指明完整路径)
//例如
void main(
//只在当前处有效,每次使用都需要指明,繁琐;
java.util.Scanner sc = new java.util.Scanner(System.in);
)
import导入
位置在类的上面
方式:
import 包名+类名
批量导入
格式:
import 包名.*;
这样的导入方式,会使得编译效率降低;
静态导入
格式:
import static 包.类.静态变量|静态方法
例如:
import static Math.PI;
3、Object类
Java.lang.Object
类是所有类的父类,(根类);如果一个类没有父类默认继承Object类;
3.1 toString()方法
看一个类是否重写了
toString
方法,直接打印类对应的对象;如果不是地址值,则说明toString
方法已经被重写了;代码示例
package day06; public class Person {
private String name;
private int age; public Person() {
} public Person(String name, int age) {
this.name = name;
this.age = age;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
} 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;
}
} package day06; public class DemoMainto {
public static void main(String[] args) {
Person p = new Person("张三",19);
System.out.println(p);//直接打印对象名就是执行对象的toString()方法
System.out.println(p.toString());//每个类都默认继承了Object的toString()方法
//重写前的结果
/*
day06.Person@1540e19d
day06.Person@1540e19d
* */
//重写后的结果
//Person{name='张三', age=19}
//Person{name='张三', age=19} }
}
3.2 equals方法
boolean equals(Object obj)
基本数据类型比较的是内容;引用类型比较的是地址值;
重写equals方法
快速生成
equal+hashcode
String类中重写的equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
3.3 Objects
在
java.utils.Objects
中Objects可以避免空指针异常
代码示例
package day06; import java.util.Objects; public class DemoMainto {
public static void main(String[] args) {
Person p = new Person("张三",19);
System.out.println(p);//直接打印对象名就是执行对象的toString()方法
System.out.println(p.toString());//每个类都默认继承了Object的toString()方法
//重写前的结果
/*
day06.Person@1540e19d
day06.Person@1540e19d
* */
//重写后的结果
//Person{name='张三', age=19}
//Person{name='张三', age=19}
/*************************************/
//Object.equals方法对两个对象进行比较,防止空指针异常;
System.out.println("**********************************************************");
String s1=null;
String s2="AAA";
//boolean b =s1.equals(s2);
//注:String中equals方法重写了Object的方法;比较的是字符串的内容;字符串(引用类型)也可以用”==“判断地址值是否相等;
//System.out.println(b);//NullPointerException,空指针异常;
//使用Objects避免空指针;
boolean cb= Objects.equals(s1,s2);
System.out.println(cb);//false
}
}
4、内部类
如果一个事务的内部包含另一个事务,那么这就是一个类内部包含另一个类。
例如:人体和心脏的关系;
分类
- 成员内部类
- 局部内部类(包含匿名内部类)
4.1成员内部类
定义
//格式
修饰符 class 外部类{
修饰符 class 内部类{ }
}
注意:内用外随意访问,外用内,需要内部类对象;
注:内部类编译之后以
$
符连接出现在文件中,因此类名称经常以下划线做分割,而非$
符;
使用
间接方式:在外部类调用内部类的方法,main方法调用外部类
直接方式:
//语法
外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称();
访问外部类成员变量时遇见同名效果,使用
外部类.this.变量
代码示例
package day06; public class Body {//外部类 public class Heart{//成员内部类
String name="比尔·希恩斯";
public void beat(){
System.out.println("心砰砰砰的跳啊");
System.out.println("我可以使用外部类的name"+name);
}
public void showname(){
String name="章北海";
System.out.println(name);//内部方法的局部变量;
System.out.println(this.name);//内部类的成员变量
System.out.println(Body.this.name);//外部类的成员变量
//访问外部类成员变量时遇见同名效果,使用外部类.this.变量
}
} private String name; public Body() {
} public Body(String name) {
this.name = name;
}
public void show(){
System.out.println("外部类的方法");
new Heart().beat();// 调用成员内部类,供主方法间接使用
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}package day06; public class DemoMainClass {
public static void main(String[] args) {
Body body =new Body("张三");
body.show();
System.out.println("==========================");
//直接调用的语法格式;
Body.Heart obj=new Body("曼努尔·雷迪亚兹").new Heart();
obj.beat();
System.out.println("==============================");
obj.showname();
}
}
/*
外部类的方法
心砰砰砰的跳啊
我可以使用外部类的name比尔·希恩斯
==========================
心砰砰砰的跳啊
我可以使用外部类的name比尔·希恩斯
==============================
章北海
比尔·希恩斯
曼努尔·雷迪亚兹
*/
4.2局部内部类
定义
一个类定义到方法的内部,那么这就是一个局部类
局部:只有当前所属的方法才能使用他,出了这个方法外面就不能用了;
格式
类{
方法{
class 名称{//注意,这里class前面不能写权限修饰符; }
}
}
补充
权限修饰符
public > protected >(default) >private
定义一个类的时候,权限修饰符的规则
1、外部类 public / default
2、成员内部类 public / protected /(default) /private
3、局部内部类:什么都不写
访问变量
- 局部内部类希望访问所在方发的局部变量,那么这个局部变量,必须是有小的
final
,因为局部变量在栈内存中,new出来的对象在堆内存中;
- 局部内部类希望访问所在方发的局部变量,那么这个局部变量,必须是有小的
代码示例
package day06; public class Outer {
public void func(){
class Inner{
int num=10;
public void show(){
System.out.println(num);
}
}
Inner obj= new Inner();
obj.show();
}
} package day06; public class Demo {
public static void main(String[] args) {
Outer oo=new Outer();
oo.func();
}
} /*
10
*/
4.2 匿名内部类(*)
定义
如果接口的实现类(或者是父类的子类),只需要使用唯一的一次,
那么这种情况下就可以省略掉该类的定义,而改为使用匿名内部类
格式
接口名称 对象名 = new 接口名称(){
//覆盖重写所有抽象方法;
};
代码示例
package day06; public interface MyInterface {
void show();//匿名方法,可以省略不写public abstract
} package day06; public class Demolambda {
public static void main(String[] args) {
//接口的实现类需要implements来继承
//使用匿名类进行实现接口;
MyInterface objA= new MyInterface() {
@Override
public void show() {
System.out.println("我重写了接口的方法");
}
};
objA.show();
//objA.show();一般只写一次,只使用一次,多次使用未见报错
}
}注意事项
- new代表创建对象的动作;
- 接口名称就是匿名内部类需要实现那个接口;
- {....},匿名内部类的内容
- 匿名内部类在创建对象的时候,只能使用唯一的一次;如果希望对此创建对象,而且类的内容一样的话,那么就必须使用淡定定义的实现类了
- 匿名对象在调用方法的时候只能使用唯一一次。如果希望同一个对象调用多次方法,那么必须给对象起个名字;例如上面的
objA
- 匿名内部类是省略了实现类/子类名称,但是匿名对象对象省略了对象名称,匿名内部类和匿名对象不是一回事;
代码示例
package day06; public class Demolambda {
public static void main(String[] args) {
//接口的实现类需要implements来继承
//此处使用的是匿名内部类,但是不是匿名对象,对象名是objA;
MyInterface objA= new MyInterface() {
@Override
public void show() {
System.out.println("我重写了接口的方法");
}
};
objA.show();
System.out.println("===========");
//匿名对象
new MyInterface() {
@Override
public void show() {
System.out.println("匿名对象调用唯一一次的方法");
}
}.show();
}
}
/*
我重写了接口的方法
===========
匿名对象调用唯一一次的方法
*/
5、类作为成员变量
代码示例
package day06; public class Hero {
private String name;
private int age;
//使用类作为成员变量
private Weapon weapon; public Hero() {
} public Hero(String name, int age, Weapon weapon) {
this.name = name;
this.age = age;
this.weapon = weapon;
}
public void attck(){
System.out.println(name+"用"+weapon.getCode()+"攻击老航天");
} 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 Weapon getWeapon() {
return weapon;
} public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
} package day06; public class Weapon {
private String code; public Weapon() {
} public Weapon(String code) {
this.code = code;
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
}
}package day06; public class DemoMainRun {
public static void main(String[] args) {
Hero hero =new Hero();
hero.setName("章北海");
hero.setAge(35);
Weapon weapon =new Weapon("陨石子弹");
hero.setWeapon(weapon);
hero.attck();
}
}
//章北海用陨石子弹攻击老航天
6、接口作为成员变量
代码示例
package day06; public interface Skill {
void use();
} package day06; public class SkillImpl implements Skill{
@Override
public void use() {
System.out.println("同过实现类,使用了技能");
}
}package day06; public class Hero {
private String name;
private int age;
//使用类作为成员变量
private Weapon weapon;
private Skill skill; public Hero() {
} public Hero(String name, int age, Weapon weapon,Skill skill) {
this.name = name;
this.age = age;
this.weapon = weapon;
this.skill=skill;
}
public void attck(){
System.out.println(name+"用"+weapon.getCode()+"攻击老航天");
}
public void attcks(){
skill.use();
} public Skill getSkill() {
return skill;
} public void setSkill(Skill skill) {
this.skill = skill;
} 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 Weapon getWeapon() {
return weapon;
} public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
}package day06; public class DemoMainRun {
public static void main(String[] args) {
Hero hero =new Hero();
hero.setName("章北海");
hero.setAge(35);
Weapon weapon =new Weapon("陨石子弹");
hero.setWeapon(weapon);
hero.attck();
System.out.println("===================");
//写法一,实现类
SkillImpl skill=new SkillImpl();
hero.setSkill(skill);
hero.attcks();
//写法二,匿名类
Skill skillIn=new Skill() {
@Override
public void use() {
System.out.println("通过匿名类实现了调用");
}
};
hero.setSkill(skillIn);
hero.attcks();
//写发三,匿名对象
hero.setSkill(new Skill() {
@Override
public void use() {
System.out.println("使用的匿名对象");
}
});
hero.attcks(); }
}
/*
章北海用陨石子弹攻击老航天
===================
同过实现类,使用了技能
通过匿名类实现了调用
使用的匿名对象
*/
7 补充:接口做参数返回值
package day06; import java.util.ArrayList;
import java.util.List; public class DemoIn {
public static void main(String[] args) {
//多态写法
//左边是接口名称,右边是实现类;
List<String> list =new ArrayList<>();
List<String> result=addList(list);
System.out.println(result);
for (int i = 0; i < result.size(); i++) {
System.out.println(result.get(i));
}
}
//接口作为参数和返回值
public static List<String> addList(List<String> list){
list.add("章北海");
list.add("东方延续");
list.add("褚岩");
return list;
}
} /*
[章北海, 东方延续, 褚岩]
章北海
东方延续
褚岩
*/
java面向对象(三)的更多相关文章
- Java面向对象(三) 【面向对象深入:抽象类,接口,内部类等】
面向对象(Object Oriented) 1.抽象类抽象就是将拥有共同方法和属性的对象提取出来.提取后,重新设计一个更加通用.更加大众化的类,就叫抽象类.1)abstract 关键字修饰类.方法,即 ...
- 深入java面向对象三:抽象类和接口(转载)
文章系转载,地址: http://blog.csdn.net/xw13106209/article/details/6923556 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架 ...
- 20145208 实验三 Java面向对象程序设计
20145208 实验三 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...
- 【重走Android之路】【Java面向对象基础(三)】面向对象思想
[重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想 1 面向对象的WWH 1.1 What--什么是面向对象 首先,要理解“对象”.在Thinkin ...
- Java面向对象 IO (三)
Java面向对象 IO (三) 知识概要: (1)IO 流的操作规律 (2)异常日志信息IO处理 ...
- 实验三《Java面向对象程序设计》实验报告
20162308 实验三<Java面向对象程序设计>实验报告 实验内容 XP基础 XP核心实践 IDEA工具学习 密码学算法基础 实验步骤 (一)Refactor/Reformat使用 p ...
- Java第三次作业——面向对象基础(封装)
Java第三次作业--面向对象基础(封装) (一)学习总结 1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明. 封装性 封装性是面向对象的方法所应遵循的一个重要原则,它有两个含义: ...
- 2017-2018-2 20165236 实验三《Java面向对象程序设计》实验报告
2017-2018-2 20165236 实验三<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652 姓名:郭金涛 ...
- 2017-2018-2 20165318 实验三《Java面向对象程序设计》实验报告
2017-2018-2 20165318 实验三<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:孙晓暄 ...
- 20155201 实验三《Java面向对象程序设计》实验报告
20155201 实验三<Java面向对象程序设计>实验报告 一.实验内容 XP基础 XP核心实践 相关工具 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门 ...
随机推荐
- Docker挂载主机目录到容器
docker run -it -v /宿主机绝对目录:/容器内目录 镜像名
- Java 继承02
向上类型转换 父类型的引用指向子类型的实例. Person p = new Person();Animal a = p; //子类对象赋值给父类类型的变量 注意: 向上转型后,子类单独定义的方法会丢失 ...
- 开发升讯威在线客服系统启示录:怎样编写堪比 MSDN 的用户手册
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程. 免费在线使用 & 免费私有化部署:https://kf.shengxunwei.com 文章目 ...
- Java内存分析简单介绍
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11904422.html Java内存分析简单介绍: 1. # 设置内存溢出时自动生成堆内存快照 ...
- DNS解析域名过程
DNS解析域名过程 使用域名转换成IP地址,先读取本地HOST文件,本地文件没有从当前电信网管获取对应IP. 本地host文件 C:\Windows\System32\drivers\etc 画图演示 ...
- jsp中<%@ taglib prefix="s" uri="/struts-tags"%>标签意思
@taglib表明引用标签.类似java中的import语句prefix="s" 引用的名称在页面可以使用,就像java中生成的一个对象名,以后调用的时候直接使用<s:xxx ...
- 一招教你IDEA中Java程序如何打包,以及打包后如何运行
前言 编写程序 程序打包 测试运行 IDEA作为目前按最主流的Java程序项目编写工具,越来越受到开发人员的青睐.idea因为其五花八门的功能,让你在开发过程中效率显著提高.那么对于初学者来说,如何通 ...
- 面试官:谈谈你对IO流和NIO的理解
一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...
- Kubernetes:容器资源需求与限制(约束)
Blog:博客园 个人 A Container is guaranteed to have as much memory as it requests, but is not allowed to u ...
- Spring Boot数据访问之数据源自动配置
Spring Boot提供自动配置的数据访问,首先体验下,Spring Boot使用2.5.5版本: 1)导入坐标: 2.5.25版本支持8.0.26mysql数据库驱动.spring-boot-st ...